module RAP

{

	//########################################################

	// Notes:

	//   -methods prefaced with a "List" are to return a 

	//   list of strings

	//   -methods prefaced with a "Get" are to return a list 

	//   of instances.

	//

	//########################################################;



	const string VERSION = "Version 0.3";



	//********************************************

	//  Forward declarations

	//********************************************

	interface DataStream; 

	interface ContentTypeDisseminator; 

	interface ServletDisseminator;

	interface SignatureDisseminator;

	interface AccessControl;



	//*********************************************

	// Type definitions

	//*********************************************

	typedef sequence <octet> ByteStream;

	typedef sequence <string> StringList;

	typedef sequence <DataStream> DataStreamList;

	typedef ByteStream SessionID;   // For maintaining current context

	typedef ByteStream RDFAttachmentSpec;

	typedef string ContentTypeSigName;   //  URN of content-type signature 

	typedef string ContentTypeImplName;  // URN of content-type servlet (implementation of a signature)





	//******************************************

	//  General Exception for Repository operations

	//******************************************

	exception RepositorySystemError 

	{

                	long ExceptionCode;

                	string ExceptionString;

        	};





	//********************************************

	//  Definitions of structures used to identify a content type

	//********************************************	

	struct ContentTypeID

	{

  		ContentTypeSigName signatureID;

		string logicalDisseminatorName;

	};



	typedef sequence <ContentTypeSigName> ContentTypeList;



	//********************************************

	//  Definition of a content-type servlet

	//********************************************	

	struct Servlet {

		string MIMEType;  // type of the servlet byte stream

		ByteStream servletStream;

	};



	//********************************************

	//  Definitions of structures used to form

	// dissemination method requests

	//********************************************

	struct NamedTypedValue 

	{

		string name;

		any typedValue; 

	};



	struct NamedType 

	{

		string name;

		TypeCode typecode;

	};

 

	struct MethodRequest

	{

		string methodName;

		sequence <NamedTypedValue> parameters;

	};



	

	//********************************************

	//  Definitions of structures used for dissemination results

	//********************************************

	

	struct ResultHolder

	{

		string MIMEType;

		ByteStream resultData;

	};



	//struct MethodResult

	//{

	//	sequence <ResultHolder> result;

	//};

	

	typedef sequence <ResultHolder> MethodResult;



	//********************************************

	// Structures for describing the signature for a content type.

	// A content-type signature is a set of method signatures.

	//********************************************

	struct MethodSignature

	{

	 	string methodName;  

		sequence <NamedType> parameterSignatures;

		MethodResult resultSignature;  // null in context of signature

	};



	typedef sequence <MethodSignature> ContentTypeSignature;





	//************************************************

	// Definition of a Disseminator which can be one of three kinds.

	//************************************************

	enum DisseminatorKind

	{

		DISSEMINATOR_SERVLET,

		DISSEMINATOR_SIGNATURE,

		DISSEMINATOR_CONTENT

	};



	enum WriteBytesMode

	{

		APPEND,

		OVERWRITE

	};



	union Disseminator switch(DisseminatorKind)

	{

		case DISSEMINATOR_SERVLET : ServletDisseminator servletDisseminator;

		case DISSEMINATOR_SIGNATURE : SignatureDisseminator signatureDisseminator;

		case DISSEMINATOR_CONTENT : ContentTypeDisseminator contentDisseminator;

	};



	typedef sequence <Disseminator> DisseminatorList;    

	

	//********************************************

	// Definition of the structures for attaching one or more

	// DataStreams to a Disseminator

	//********************************************

	

	struct AttachedDataStream 

	{

		string logicalName;

		DataStream dataStream;

	};



	typedef sequence <AttachedDataStream> AttachedDataStreamList;

	

	//*********************************************

	// Current Context Structure definitions

	// Note: just a stub at this point

	//*********************************************

	struct CurrentContext 

	{ 

		string userID;

		SessionID sessionID;

		string IPaddr;

	};             



	//**********************************************

	// Key Metadata structure definitions

	// Future: are there other attributes required to support 

	// versioning, archiving, preservation?

	//**********************************************

	struct DOKeyMetadata

	{ 

		string dateCreated;

		string dateLastRevision; 

	};

  

	struct DSKeyMetadata 

	{ 

		string MIMEType;

		string descriptor;

		long   size;

		string dateDeposited;

		string dateLastRevision; 

	};                                     





	//************************************************

	// DataStream interface definition

	//************************************************

	interface DataStream 

	{

		string GetDataStreamID() raises (RepositorySystemError);

		string GetMIMEType() raises (RepositorySystemError);

		DSKeyMetadata GetKeyMetadata() raises (RepositorySystemError);

		ByteStream GetBytes(in long length, in long offset) raises (RepositorySystemError);

		long WriteBytes(in long bufferLength, 

			          in long absoluteDataStreamOffset, 

			          in WriteBytesMode mode,

			          in ByteStream buffer) raises (RepositorySystemError);

	};



	//************************************************

	// ContentTypeDisseminator interface definition

	//************************************************

	interface ContentTypeDisseminator

	{

		ContentTypeID GetContentTypeID() 

			raises (RepositorySystemError);  // returns URN of signature + disseminator name

		ContentTypeImplName GetServletID()  raises (RepositorySystemError);

		AttachedDataStreamList GetAttachedDataStreams() raises (RepositorySystemError);

		void SetAttachedDataStreams(in AttachedDataStreamList attachmentList) 

			raises (RepositorySystemError);

		void DeleteAttachedDataStreams(in AttachedDataStreamList attachmentList) 

			raises (RepositorySystemError);

	};





	//************************************************

	// ServletDisseminator interface definition 

	//************************************************

	interface ServletDisseminator : ContentTypeDisseminator

	{

		const string CONTENT_TYPE_SIGID = "SERVLET_DISSEMINATOR";

		const string CONTENT_TYPE_LOGICALNAME = "SERVLET";

		const string SERVLET_ATTACHMENT_NAME = "SERVLET";

		ContentTypeSigName GetSignatureID() raises (RepositorySystemError); 

		Servlet GetServlet() raises (RepositorySystemError);

		RDFAttachmentSpec GetAttachmentSpecification() raises (RepositorySystemError);

	};



	//************************************************

	// SignatureDisseminator interface definition

	//***********************************************

	interface SignatureDisseminator : ContentTypeDisseminator

	{	

		const string CONTENT_TYPE_SIGID = "SIGNATURE_DISSEMINATOR";

		const string CONTENT_TYPE_LOGICALNAME = "SIGNATURE"; 

		const string SIGNATURE_ATTACHMENT_NAME = "SIGNATURE";

		ContentTypeSignature GetSignature() raises (RepositorySystemError);

	};





	//************************************************

	// DigitalObject interface definition 

	//************************************************

	interface DigitalObject 

	{ 

		string GetDigitalObjectID() raises (RepositorySystemError);   // a URN

		DOKeyMetadata GetDOKeyMetadata() raises (RepositorySystemError);

		DataStreamList GetDataStreams() raises (RepositorySystemError);

		StringList ListDataStreams() raises (RepositorySystemError);

		DataStream GetDataStream(in string dataStreamID) raises (RepositorySystemError);

		DataStream CreateDataStream (

				in string MIMEType,

				in string descriptor,

				in ByteStream data ) raises (RepositorySystemError); 

		void DeleteDataStream(in string dataStreamID) raises (RepositorySystemError);

		Disseminator CreateDisseminator(

				in ContentTypeID contentType,

				in ContentTypeImplName servletID,

				in DisseminatorKind enumKind) raises (RepositorySystemError);

		void DeleteDisseminator(in ContentTypeID contentType) raises (RepositorySystemError);

		ContentTypeList ListContentTypes() raises (RepositorySystemError);

		DisseminatorList GetDisseminators() raises (RepositorySystemError);

		ContentTypeSignature GetContentTypeMethods(in ContentTypeSigName contentType) 

			raises (RepositorySystemError);  

		MethodResult GetDissemination(in ContentTypeID contentType, in MethodRequest request)

			raises (RepositorySystemError);

	}; 



	//************************************************

	// Repository interface definition

	//************************************************

	interface Repository : DigitalObject 

	{

		string GetVersion() raises (RepositorySystemError); // RAP version

		DigitalObject CreateDigitalObject(in string digitalObjectID) 

			raises (RepositorySystemError);   // digitalObjectID is a URN

		DigitalObject GetDigitalObject(in string digitalObjectID) 

			raises (RepositorySystemError);   // digitalObjectID is a URN

		void DeleteDigitalObject(in string digitalObjectID) raises (RepositorySystemError);

		SessionID GetSessionID(in string userID) raises (RepositorySystemError);

		long VerifyDigitalObject(in string digitalObjectID) raises (RepositorySystemError);

		CurrentContext GetCurrentContext(in SessionID sessionID) raises (RepositorySystemError);

		StringList ListDigitalObjects(in string filter) 

			raises (RepositorySystemError);  // filter: simple string search on URN 

	}; 



	//************************************************

	// FUTURE USE:  AccessControl interface definition

	//************************************************

	interface AccessControl

	{ 

		string GetAccessControlType() raises (RepositorySystemError);

	};

};  

Contact Authors:
Email Christophe at cblanchi@cnri.reston.va.us
Email Ed at eoverly@cnri.reston.va.us
Email Sandy at payette@cs.cornell.edu