#include <orb.idl>
module RAP 
{
const string VERSION = "Version 1.0";
//**************************************************************
//  Forward declarations
//**************************************************************
interface Repository;
interface DigitalObject;
interface DataStream;
interface StandardDisseminator;
interface ServletDisseminator;
interface SignatureDisseminator;
interface AccessControl;
//***************************************************************
// TYPE DEFINITIONS
//***************************************************************
typedef string
                   
MIME;
typedef string
                   
URN;
typedef sequence <octet> ByteStream;
typedef string
                   
DataStreamID;
typedef URN
                   
DigitalObjectID;
typedef URN
                   
SignatureID;      // URN of a
signature DigitalObject 
typedef URN
                   
ServletID;
        // URN of a servlet DigitalObject
typedef ByteStream          
SessionID;        // For maintaining current context
typedef ByteStream         AttachmentSpec;
typedef sequence <DataStreamID>     DataStreamIDList;
typedef sequence <DataStream>         DataStreamList;
typedef sequence <DigitalObjectID>   DigitalObjectIDList;
typedef sequence <SignatureID>         
DisseminatorTypeList;
//****************************************************************
//  GENERAL REPOSITORY EXCEPTION
//****************************************************************
exception RepositorySystemError
{
   long ExceptionCode;
    string ExceptionString;
};
//******************************************************************
// CURRENT CONTEXT OF REPOSITORY
// Note: just a stub at this point
//******************************************************************
struct CurrentContext
{
    string userID;
    SessionID sessionID;
    string IPaddr;
};
//***************************************************************
// DISSEMINATION REQUEST
//***************************************************************
struct NamedTypedValue
{
    string name;
    any typedValue;
};
struct MethodRequest  // DisseminationMethodRequest???
{
    string methodName;
    sequence <NamedTypedValue> parameters;
};
//**************************************************************
//  DISSEMINATION RESULT
//**************************************************************
struct ResultHolder
{
   MIME MIMEType;
    ByteStream resultData;
};
typedef sequence <ResultHolder> Dissemination;
//**************************************************************
// SIGNATURE
//**************************************************************
struct NamedType
{
    string name;
    TypeCode typecode;
};
struct MethodSignature
{
    string methodName;
    sequence <NamedType> parameterTypes;
   Dissemination resultType;  // awkward: null in context
of signature
};
typedef sequence <MethodSignature> Signature;
//**************************************************************
// SERVLET
//************************************************************** 
struct Servlet
{
   MIME
MIMEType;  // type of executable
    ByteStream servletStream;
};
//************************************************************
// Disseminator
//************************************************************
struct DisseminatorID
{
   SignatureID signatureID;
    string disseminatorName;
};
typedef sequence <DisseminatorID> DisseminatorIDList;
enum DisseminatorKind
{
    DISSEMINATOR_SERVLET,
    DISSEMINATOR_SIGNATURE,
    DISSEMINATOR_STANDARD
};
union Disseminator switch(DisseminatorKind)
{
    case DISSEMINATOR_SERVLET :   ServletDisseminator
servletDisseminator;
    case DISSEMINATOR_SIGNATURE : SignatureDisseminator
signatureDisseminator;
    case DISSEMINATOR_STANDARD :   StandardDisseminator standardDisseminator;
};
typedef sequence <Disseminator> DisseminatorList;
//********************************************
// Structure for attaching one or more
// DataStreams to a Disseminator
//********************************************
struct AttachedDataStream
{
    string logicalName;
    DataStream dataStream;
};
typedef sequence <AttachedDataStream> AttachedDataStreamList;
//*********************************************
// StandardDisseminator
//*********************************************
interface StandardDisseminator
{
    DisseminatorID               
GetDisseminatorID()  raises
(RepositorySystemError);
   ServletID
                        
GetServletID()  raises (RepositorySystemError);
    AttachedDataStreamList  GetAttachedDataStreams() 
                                               
raises (RepositorySystemError);
    void
                                
SetAttachedDataStreams(
                                               
in AttachedDataStreamList attachmentList)
                                               
raises (RepositorySystemError);
    void
                                
DeleteAttachedDataStreams(
   
                                            
in AttachedDataStreamList attachmentList)
                                               
raises (RepositorySystemError);
};
//************************************************
// ServletDisseminator 
//************************************************
interface ServletDisseminator : StandardDisseminator
{
   const string DISSEMINATOR_ID_SIGNATURE_ID =
"SERVLET_DISSEMINATOR";
   const string DISSEMINATOR_ID_DISSEMINATOR_NAME =
"SERVLET";
   const string ATTACHMENT_NAME = "SERVLET";
   
    //SignatureID       GetSignatureID()
  raises (RepositorySystemError);
    Servlet
               
GetServlet()   raises (RepositorySystemError);
   AttachmentSpec
  GetAttachmentSpecification() raises (RepositorySystemError);
};
//************************************************
// SignatureDisseminator 
//***********************************************
interface SignatureDisseminator : StandardDisseminator
{
   const string DISSEMINATOR_ID_SIGNATURE_ID =
"SIGNATURE_DISSEMINATOR";
   const string DISSEMINATOR_ID_DISSEMINATOR_NAME =
"SIGNATURE"; 
   const string ATTACHMENT_NAME = "SIGNATURE";
    Signature GetSignature()    raises
(RepositorySystemError);
};
//******************************************************************
// DATASTREAM
//******************************************************************
struct DSKeyMetadata
{
   MIME  
MIMEType;
    string    descriptor;
    long      size;
    string    dateDeposited;
    string    dateLastRevised;
};
enum WriteBytesMode
{
   APPEND,
    OVERWRITE
};
interface DataStream
{
   DataStreamID
       GetDataStreamID() raises
(RepositorySystemError);
   MIME
                 
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);
};
//******************************************************************
// DIGITAL OBJECT 
//******************************************************************
struct DOKeyMetadata // administrative attributes for DigitalObject
{
    string dateCreated;
    string dateLastRevised;
};
interface DigitalObject 
{
   DigitalObjectID          GetDigitalObjectID() raises (RepositorySystemError);
   DOKeyMetadata       
GetKeyMetadata()   raises (RepositorySystemError);
    // Structural Access Methods
   DataStreamIDList     ListDataStreamIDs() 
raises (RepositorySystemError);
    DataStream     
         GetDataStream(
                                       
in DataStreamID dataStreamID)
                                      
raises (RepositorySystemError);
   DataStreamList
        GetDataStreams()      raises (RepositorySystemError);
   DisseminatorIDList   ListDisseminatorIDs() raises (RepositorySystemError);
   Disseminator     
       GetDisseminator(
                                       
in DisseminatorID disseminatorID)
    
                                   
raises (RepositorySystemError);
   DisseminatorList      GetDisseminators()     
raises (RepositorySystemError);
    // Extensible Access Methods
   DisseminatorTypeList ListDisseminatorTypes() raises (RepositorySystemError);
   Signature
                  
GetDisseminatorTypeMethods(
                                        
in SignatureID disseminatorType)
                                       
raises (RepositorySystemError);
   Dissemination            GetDissemination(
                                        
in DisseminatorID disseminatorID,
                                        
in MethodRequest request)
    
                                    
raises (RepositorySystemError);
        //
Factory Methods
    DataStream     
          CreateDataStream (
                                        
in MIME MIMEType,
                                        
in string descriptor,
                                        
in ByteStream data ) 
                                        
raises (RepositorySystemError);
    void     
                    
DeleteDataStream(
                                        
in DataStreamID dataStreamID) 
                                        
raises (RepositorySystemError);
    Disseminator     
        CreateDisseminator(
                                        
in DisseminatorID disseminatorID,
                                        
in ServletID servletID,
                                        
in DisseminatorKind enumKind) 
                                        
raises (RepositorySystemError);
    void     
                    
DeleteDisseminator(
                                       
in DisseminatorID disseminatorID)
                                       
raises (RepositorySystemError);
}; 
//******************************************************************
// REPOSITORY
//******************************************************************
interface Repository : DigitalObject 
{
    // Future:  Repository Key Metadata?
    string    
              
GetVersion() // RAP version
                                   
raises (RepositorySystemError); 
    SessionID           
GetSessionID(in string userID) 
                                  
raises (RepositorySystemError);
    CurrentContext    GetCurrentContext(in SessionID
sessionID) 
                                  
raises (RepositorySystemError);
    // Access Methods
    long    
                    
VerifyDigitalObject(
                                       
in DigitalObjectID digitalObjectID) 
                                       
raises (RepositorySystemError);
   DigitalObjectIDList ListDigitalObjectIDs(
                                       
in string filter) // filter: simple string search on URN
                                       
raises (RepositorySystemError);
    DigitalObject    
       GetDigitalObject(in DigitalObjectID digitalObjectID) 
                                       
raises (RepositorySystemError);
    // Factory Methods
    DigitalObject    
       CreateDigitalObject(in DigitalObjectID
digitalObjectID) 
                                       
raises (RepositorySystemError);
    void    
                    
DeleteDigitalObject(in DigitalObjectID digitalObjectID) 
                                       
raises (RepositorySystemError);
}; 
//******************************************************************
// ACCESS CONTROL  (future use)
//******************************************************************
interface AccessControl
{
    string GetAccessControlType() raises
(RepositorySystemError);
};
}; // END OF MODULE RAP