summaryrefslogtreecommitdiff
path: root/java/demo/Freeze/library/LibraryI.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/demo/Freeze/library/LibraryI.java')
-rw-r--r--java/demo/Freeze/library/LibraryI.java250
1 files changed, 250 insertions, 0 deletions
diff --git a/java/demo/Freeze/library/LibraryI.java b/java/demo/Freeze/library/LibraryI.java
new file mode 100644
index 00000000000..91f2c4872a7
--- /dev/null
+++ b/java/demo/Freeze/library/LibraryI.java
@@ -0,0 +1,250 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2011 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+import Demo.*;
+
+class LibraryI extends _LibraryDisp
+{
+ public synchronized BookPrx
+ createBook(BookDescription description, Ice.Current current)
+ throws DatabaseException, BookExistsException
+ {
+ BookPrx book = isbnToBook(description.isbn, current.adapter);
+
+ try
+ {
+ book.ice_ping();
+
+ //
+ // The book already exists.
+ //
+ throw new BookExistsException();
+ }
+ catch(Ice.ObjectNotExistException e)
+ {
+ //
+ // Book doesn't exist, ignore the exception.
+ //
+ }
+
+ //
+ // Create a new book Servant.
+ //
+ BookI bookI = new BookI(this);
+ bookI.description = description;
+
+ Ice.Identity ident = createBookIdentity(description.isbn);
+
+ //
+ // Create a new Ice Object in the evictor, using the new
+ // identity and the new Servant.
+ //
+ // This can throw EvictorDeactivatedException (which indicates
+ // an internal error). The exception is currently ignored.
+ //
+ _evictor.add(bookI, ident);
+
+ try
+ {
+ //
+ // Add the isbn number to the authors map.
+ //
+ String[] isbnSeq = _authors.get(description.authors);
+ int length = (isbnSeq == null) ? 0 : isbnSeq.length;
+ String[] newIsbnSeq = new String[length+1];
+
+ if(isbnSeq != null)
+ {
+ System.arraycopy(isbnSeq, 0, newIsbnSeq, 0, length);
+ }
+ newIsbnSeq[length] = description.isbn;
+
+ _authors.fastPut(description.authors, newIsbnSeq);
+
+ return book;
+ }
+ catch(Freeze.DatabaseException ex)
+ {
+ DatabaseException e = new DatabaseException();
+ e.message = ex.message;
+ throw e;
+ }
+ }
+
+ //
+ // No locking is necessary since no internal mutable state is
+ // accessed.
+ //
+ public BookPrx
+ findByIsbn(String isbn, Ice.Current current)
+ throws DatabaseException
+ {
+ try
+ {
+ BookPrx book = isbnToBook(isbn, current.adapter);
+ book.ice_ping();
+
+ return book;
+ }
+ catch(Ice.ObjectNotExistException ex)
+ {
+ //
+ // Book doesn't exist, return a null proxy.
+ //
+ return null;
+ }
+ }
+
+ public synchronized BookPrx[]
+ findByAuthors(String authors, Ice.Current current)
+ throws DatabaseException
+ {
+ try
+ {
+ //
+ // Lookup all books that match the given authors, and
+ // return them to the caller.
+ //
+ String[] isbnSeq = _authors.get(authors);
+
+ int length = (isbnSeq == null) ? 0 : isbnSeq.length;
+ BookPrx[] books = new BookPrx[length];
+
+ if(isbnSeq != null)
+ {
+ for(int i = 0; i < length; ++i)
+ {
+ books[i] = isbnToBook(isbnSeq[i], current.adapter);
+ }
+ }
+
+ return books;
+ }
+ catch(Freeze.DatabaseException ex)
+ {
+ DatabaseException e = new DatabaseException();
+ e.message = ex.message;
+ throw e;
+ }
+ }
+
+ public void
+ setEvictorSize(int size, Ice.Current current)
+ throws DatabaseException
+ {
+ //
+ // No synchronization necessary, _evictor is immutable.
+ //
+ _evictor.setSize(size);
+ }
+
+ public void
+ shutdown(Ice.Current current)
+ {
+ current.adapter.getCommunicator().shutdown();
+ }
+
+ protected synchronized void
+ remove(BookDescription description)
+ throws DatabaseException
+ {
+ try
+ {
+ String[] isbnSeq = _authors.get(description.authors);
+
+ assert isbnSeq != null;
+
+ int i;
+ for(i = 0; i < isbnSeq.length; ++i)
+ {
+ if(isbnSeq[i].equals(description.isbn))
+ {
+ break;
+ }
+ }
+
+ assert i < isbnSeq.length;
+
+ if(isbnSeq.length == 1)
+ {
+ //
+ // If there are no further associated isbn numbers then remove
+ // the record.
+ //
+ _authors.fastRemove(description.authors);
+ }
+ else
+ {
+ //
+ // Remove the isbn number from the sequence and write
+ // back the new record.
+ //
+ String[] newIsbnSeq = new String[isbnSeq.length-1];
+ System.arraycopy(isbnSeq, 0, newIsbnSeq, 0, i);
+ if(i < isbnSeq.length - 1)
+ {
+ System.arraycopy(isbnSeq, i+1, newIsbnSeq, i, isbnSeq.length - i - 1);
+ }
+
+ _authors.fastPut(description.authors, newIsbnSeq);
+ }
+
+ //
+ // This can throw EvictorDeactivatedException (which
+ // indicates an internal error). The exception is
+ // currently ignored.
+ //
+ _evictor.remove(createBookIdentity(description.isbn));
+ }
+ catch(Freeze.DatabaseException ex)
+ {
+ DatabaseException e = new DatabaseException();
+ e.message = ex.message;
+ throw e;
+ }
+ }
+
+ LibraryI(Ice.Communicator communicator, String envName, String dbName, Freeze.Evictor evictor)
+ {
+ _evictor = evictor;
+ _connection = Freeze.Util.createConnection(communicator, envName);
+ _authors = new StringIsbnSeqDict(_connection, dbName, true);
+ }
+
+ void
+ close()
+ {
+ _authors.close();
+ _connection.close();
+ }
+
+ private Ice.Identity
+ createBookIdentity(String isbn)
+ {
+ //
+ // Note that the identity category is important since the
+ // locator was installed for the category 'book'.
+ //
+ Ice.Identity ident = new Ice.Identity();
+ ident.category = "book";
+ ident.name = isbn;
+
+ return ident;
+ }
+
+ private BookPrx
+ isbnToBook(String isbn, Ice.ObjectAdapter adapter)
+ {
+ return BookPrxHelper.uncheckedCast(adapter.createProxy(createBookIdentity(isbn)));
+ }
+
+ private Freeze.Evictor _evictor;
+ private Freeze.Connection _connection;
+ private StringIsbnSeqDict _authors;
+}