Common Object Request Broker Architecture (CORBA)
An Introduction with Examples in Java |
Prof. David Bernstein |
Computer Science Department |
bernstdh@jmu.edu |
An Overview
char
|
A single ASCII character |
wchar
|
A single "wide" character (which may or may not use Unicode) |
octet
|
Eight binary "bits" |
boolean
|
A binary type that can have a value of
either TRUE or FALSE
|
string
|
An ordered set of characters |
wstring
|
An ordered set of wide characters |
short
|
A short integer |
long
|
A long integer |
float
|
A short floating point number |
double
|
A long floating point number |
any
|
Any entity in CORBA |
module name { };
module name1 { module name2 { }; };
interface Prioritized { };
interface TextMessage { }; interface TextAlert : TextMessage { };
in
),
"out-bound" (out
) or both
(inout
)
struct
struct AccidentReport { attribute int priority; attribute string message; };
enum Color { red, orange, yellow, green, blue, indigo, violet };
exception ConnectionException { string reason; };
IDL Type | Java Type |
boolean | boolean |
char | char |
wchar | char |
octet | byte |
string | java.lang.String |
wstring | java.lang.String |
short | short |
long | int |
long long | long |
float | float |
double | double |
fixed | java.math.BigDecimal |
any | org.OMG.CORBA.Any |
TRUE
and FALSE
are mapped to the Java values true
and
false
out int
gets mapped to an
IntHolder
enum
is mapped to a Java class
.
For example, the following IDL specification:
enum EnumType {first, second, third, fourth, fifth};
public class EnumType implements org.omg.CORBA.portable.IDLEntity { public static final int _first = 0; public static final EnumType first = new EnumType(_first); public static final int _second = 1; public static final EnumType second = new EnumType(_second); public static final int _third = 2; public static final EnumType third = new EnumType(_third); public static final int _fourth = 3; public static final EnumType fourth = new EnumType(_fourth); public static final int _fifth = 4; public static final EnumType fifth = new EnumType(_fifth); public int value() {...} public static EnumType from_int(int value) {...}; // constructor protected EnumType(int) {...} };
struct
:
class
with the same namestruct
McCarty
B.
Cassady-Dorion
L.
James Madison University
James Madison University
module musicServer { exception NoSuchUserException { string reason; }; exception UserIDExistsException { string reason; }; enum MediaType { CD, TAPE, RECORD, NOT_SPECIFIED }; interface AlbumI { attribute string sArtistName; attribute string sAlbumName; attribute string sListeningNotes; attribute float fPrice; attribute MediaType type; }; typedef sequence<AlbumI>AlbumSequence; struct AlbumQueryS { string sArtistName; string sAlbumName; float fPrice; MediaType type; }; interface MusicCollectionI { attribute string sUserName; attribute string sPassword; AlbumSequence getAllAlbums(); AlbumSequence getAllAlbumsByArtistName(); AlbumSequence getAllAlbumsByAlbumName(); void addAlbum(in AlbumI album); void deleteAlbum(in AlbumI album); AlbumI obtainEmptyAlbum(); }; interface RequestorI { void albumFound(in AlbumSequence album); }; interface MusicServerI { MusicCollectionI obtainCollection(in string sUserName, in string sPassword) raises(NoSuchUserException); MusicCollectionI createCollection(in string sUserName, in string sPassword) raises(UserIDExistsException); void logOut(in MusicCollectionI collection); AlbumQueryS obtainEmptyQuery(); void searchCatalog(in AlbumQueryS query, in RequestorI requestor); void saveCollection(); }; };
import java.io.*; import musicServer.*; /** * Models a unique album, with all of its properties */ public class Album extends _AlbumIImplBase implements Serializable { private String _sArtistName; private String _sAlbumName; private String _sListeningNotes; private float _fPrice; private MediaType _type; public Album() { this("", "", "", 0f, MediaType.NOT_SPECIFIED); } public Album(String sArtistName, String sAlbumName, String sListeningNotes, float fPrice, MediaType type) { _sArtistName = sArtistName; _sAlbumName = sAlbumName; _sListeningNotes = sListeningNotes; _fPrice = fPrice; _type = type; } public String sArtistName() { return _sArtistName; } public void sArtistName(String sArtistName) { _sArtistName = sArtistName; } public String sAlbumName() { return _sAlbumName; } public void sAlbumName(String sAlbumName) { _sAlbumName = sAlbumName; } public String sListeningNotes() { return _sListeningNotes; } public void sListeningNotes(String sListeningNotes) { _sListeningNotes = sListeningNotes; } public float fPrice() { return _fPrice; } public void fPrice(float fPrice) { _fPrice = fPrice; } public MediaType type() { return _type; } public void type(MediaType type) { _type = type; } }
import musicServer.*; import java.util.*; import java.io.*; import org.omg.CORBA.*; /** * Models a collection of albums. */ public class MusicCollection extends _MusicCollectionIImplBase implements Serializable { private Vector _vecAlbums; private String _sUserName; private String _sPassword; private transient BOA _boa; private Vector _vecActivatedObjects; private boolean _bObjectsDeactivated = false; public MusicCollection(String sUserName, String sPassword, BOA boa) { super(); _sUserName = sUserName; _sPassword = sPassword; _vecAlbums = new Vector(); _boa = boa; _vecActivatedObjects = new Vector(); } /** * Invoked after being de-serialized with a new reference to the BOA */ public void updateTransientData(BOA boa) { _boa = boa; } /** * Obtains all AlbumI objects ordered by artist name */ public AlbumI[] getAllAlbumsByArtistName() { AlbumI[] albums = getAllAlbums(); AlbumSorter.sortByArtistName(albums); return albums; } /** * Obtains all AlbumI objects ordered by album name */ public AlbumI[] getAllAlbumsByAlbumName() { AlbumI[] albums = getAllAlbums(); AlbumSorter.sortByAlbumName(albums); return albums; } /** * Obtains all AlbumI objects in default order */ public AlbumI[] getAllAlbums() { if(_bObjectsDeactivated) { _bObjectsDeactivated = false; Enumeration e = _vecAlbums.elements(); while(e.hasMoreElements()) { _boa.obj_is_ready((org.omg.CORBA.Object)e.nextElement()); } } AlbumI[] returnValue = new AlbumI[_vecAlbums.size()]; _vecAlbums.copyInto(returnValue); return returnValue; } /** * Adds an AlbumI object to the collection */ public void addAlbum(AlbumI album) { _vecAlbums.addElement(album); } /** * Removes an AlbumI object from the collection */ public void deleteAlbum(AlbumI album) { _vecAlbums.removeElement(album); } /** * Obtains an empty AlbumI object */ public AlbumI obtainEmptyAlbum() { AlbumI returnValue = new Album(); _boa.obj_is_ready(returnValue); _vecActivatedObjects.addElement(returnValue); return returnValue; } public void sUserName(String sUserName) { _sUserName = sUserName; } public String sUserName() { return _sUserName; } public void sPassword(String sPassword) { _sPassword = sPassword; } public String sPassword() { return _sPassword; } /** * Deactivates all activated objects */ public void deactivateObjects() { _bObjectsDeactivated = true; Enumeration e = _vecAlbums.elements(); while(e.hasMoreElements()) { _boa.deactivate_obj((org.omg.CORBA.Object)e.nextElement()); } } }
import musicServer.*; import org.omg.CORBA.*; /** * Main server class */ public final class MusicServer extends _MusicServerIImplBase { private static BOA _boa; private MusicCollectionHolder _musicCollectionHolder; public MusicServer() { super("MusicServer"); _musicCollectionHolder = new MusicCollectionHolder(_boa); } /** * Invoked by the client when he wants to attempt a login */ public MusicCollectionI obtainCollection(String sUserName, String sPassword) throws NoSuchUserException { MusicCollectionI collection = _musicCollectionHolder.obtainCollection(sUserName, sPassword); if(collection == null) throw new NoSuchUserException("Invalid Login Information"); _boa.obj_is_ready(collection); return collection; } /** * Invoked by the client when he wants to create a new * MusicCollectionI object. */ public MusicCollectionI createCollection(String sUserName, String sPassword) throws UserIDExistsException { if(_musicCollectionHolder.doesUserNameExist(sUserName)) { throw new UserIDExistsException(sUserName+" is already in use"); } MusicCollectionI collection = new MusicCollection(sUserName, sPassword, _boa); _boa.obj_is_ready(collection); _musicCollectionHolder.addMusicCollection(collection); return collection; } /** * Helper method that obtains an AlbumQueryS * object populated with dummy data. */ public AlbumQueryS obtainEmptyQuery() { return new AlbumQueryS("", "", 0f, MediaType.NOT_SPECIFIED); } /** * Performs an exhaustive search of all available * catalogs. Demonstrates the callback design pattern. */ public void searchCatalog(AlbumQueryS query, RequestorI requestor) { AlbumSearcher searcher = new AlbumSearcher(query, requestor, _boa); searcher.start(); } /** * Invoked by the client when he wants to logout, deactivates * all activated objects. */ public void logOut(MusicCollectionI collection) { Deactivator deactivator = new Deactivator(collection, _boa); deactivator.start(); } public void saveCollection() { _musicCollectionHolder.saveCollection(); } public static void main(String[] args) { ORB orb = ORB.init(); _boa = orb.BOA_init(); MusicServer server = new MusicServer(); _boa.obj_is_ready(server); _boa.impl_is_ready(); } }