aglets-commits Mailing List for Aglet Software Development Kit
Status: Beta
Brought to you by:
cat4hire
You can subscribe to this list here.
2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
(1) |
Sep
(1) |
Oct
|
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2003 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(1) |
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2005 |
Jan
|
Feb
(1) |
Mar
|
Apr
(1) |
May
(2) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(35) |
Nov
(113) |
Dec
(4) |
2006 |
Jan
|
Feb
|
Mar
|
Apr
(6) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2007 |
Jan
|
Feb
(7) |
Mar
(5) |
Apr
(1) |
May
|
Jun
|
Jul
(55) |
Aug
(53) |
Sep
(22) |
Oct
(22) |
Nov
(8) |
Dec
(13) |
2008 |
Jan
(29) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(3) |
Dec
(71) |
2009 |
Jan
(1) |
Feb
|
Mar
(6) |
Apr
(9) |
May
(1) |
Jun
(1) |
Jul
(89) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Luca F. <cat...@us...> - 2009-07-28 07:05:10
|
Update of /cvsroot/aglets/aglets/src/examples/mdispatcher In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/examples/mdispatcher Modified Files: MethodDispatcher.java HelloAglet.java Log Message: Merge of experimental branch. |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:10
|
Update of /cvsroot/aglets/aglets/src/examples/protection In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/examples/protection Modified Files: ProtectionAglet.java ActionPanel.java Log Message: Merge of experimental branch. Index: ActionPanel.java =================================================================== RCS file: /cvsroot/aglets/aglets/src/examples/protection/ActionPanel.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- ActionPanel.java 27 Jul 2009 10:31:42 -0000 1.3 +++ ActionPanel.java 28 Jul 2009 07:04:53 -0000 1.4 @@ -48,7 +48,7 @@ ActionPanel(ProtectionAglet aglet) { _aglet = aglet; _field.setLayout(_layout); - for (int i = 0; i < ProtectionDialog.NUMBER_OF_ACTIONS; i++) { + for (int i = 0; i < ProtectionDialog.ACTIONS.length; i++) { String label = ProtectionDialog.ACTIONS[i]; _command.addItem(label); |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:09
|
Update of /cvsroot/aglets/aglets/src/com/ibm/net/protocol/rmi In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/com/ibm/net/protocol/rmi Modified Files: URLConnectionForRMI.java Log Message: Merge of experimental branch. |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:09
|
Update of /cvsroot/aglets/aglets/src/com/ibm/aglets/thread In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/com/ibm/aglets/thread Modified Files: AgletThreadPool.java Added Files: AgletThread.java Log Message: Merge of experimental branch. Index: AgletThreadPool.java =================================================================== RCS file: /cvsroot/aglets/aglets/src/com/ibm/aglets/thread/AgletThreadPool.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- AgletThreadPool.java 27 Jul 2009 10:31:42 -0000 1.2 +++ AgletThreadPool.java 28 Jul 2009 07:04:54 -0000 1.3 @@ -1,281 +1,269 @@ package com.ibm.aglets.thread; +import org.aglets.log.*; - -import com.ibm.aglets.*; +import com.ibm.aglet.AgletException; +import com.ibm.aglet.message.MessageManager; +import com.ibm.aglets.MessageManagerImpl; import java.util.*; -import com.ibm.aglet.AgletProxy; -import com.ibm.aglet.MessageManager; -import com.ibm.aglet.message.*; /** - * This class represents a pool for a set of aglet threads. Agents - * and message managers can pop and push threads from the pool - * in order to handle execution threads. Using a singleton pool - * like this avoid the creation of a lot of threads within the - * platform. - * @author Luca Ferrari cat...@us... - * 28-mag-2005 - * @version 1.0 + * A thread pool that provides pooling base mechanism for aglet threads. The idea behind this pool is + * quite simple: once a new thread is required the pool must be able to provide it. Provide a + * thread means either: + * a) provide an already created and idle thread; + * b) create a new thread if no one idle thread is available. + * Once a thread has finished its work it must be inserted again in the pool, thus it can be + * used in further thread needed conditions. + * @author Luca Ferrari - cat...@us... + * */ public class AgletThreadPool { - - /** - * A self refernce to myself, used to create - * a singleton. - */ - private static AgletThreadPool myself = null; - - /** - * The real pool that will contain the threads. - */ - private Stack pool = null; - - - /** - * A pool of special threads, used to deliver a single message to an agent. - */ - private Stack deliveryPool = null; - - /** - * The max number of thread this pool must handle. - */ - private int size; - - /** - * The number of thread handled currenlty. - */ - private int handled; - - - /** - * Base constructor: it creates the pool-stack and initializes - * the size of the pool. - * @param size the max number of threads this pool can create - */ - protected AgletThreadPool(int size){ - super(); - this.size = size; - AgletThreadPool.myself = this; - this.pool = new Stack(); - this.deliveryPool = new Stack(); - this.handled = 0; - } - - - - /** - * Obtains the current instance of the pool. If no instance have been - * created yet, creates an instance for 10 threads. - * @return the reference to the pool - */ - public static AgletThreadPool getInstance(){ - if( AgletThreadPool.myself != null ){ - return AgletThreadPool.myself; - } - else{ - synchronized (AgletThreadPool.class){ - AgletThreadPool.myself = new AgletThreadPool(10); - return AgletThreadPool.myself; - - } - } - - } + // the logger for this pool + private AgletsLogger logger = AgletsLogger.getLogger(AgletThreadPool.class.getName()); + + /** + * The minimum size of the pool, that is the minimum number thread this pool must + * create on startup. + */ + private int minPoolSize = 10; + + /** + * The max size of the pool, that is the max number of thread this pool can contain. + * After such number has been reached, the pool must suspend each request of a new thread + * until one becomes idle (and thus available) again. + */ + private int maxPoolSize = 100; + + /** + * A self reference to this object. This class is supposed to be a singleton, + * thus only one pool can exists in the whole system. + */ + private static AgletThreadPool mySelf = null; + + /** + * The pool will keep the threads into a stack container. + */ + private Stack<AgletThread> threads = null; + + /** + * A thread group that contains all the threads this pool will create. + */ + private ThreadGroup threadGroup = new ThreadGroup("AgletThreadGroup"); + + /** + * A counter that indicates how many threads this pool has created until now. + * It is useful for checking that the pool has not gone over the maxPoolSize value. + */ + private int createdThread = 0; + + /** + * A counter that provides an information about the number of busy threads in the pool. + */ + private int busyThreads = 0; + + /** + * Initializes the structures of the pool and creates the first threads (the minimum + * available threads) that will be used. + * + */ + private AgletThreadPool(){ + super(); + this.threads = new Stack(); + // create the min threads + logger.info("AgletThreadPool starting with " + this.minPoolSize + " min threads"); + for(int i=0; i<this.minPoolSize; i++) + this.createNewThread(); - /** - * A service to get an AgletThread. If possible, a thread is exctracted from the - * queue, otherwise a new thread is created. If the maximum count of the pool is reached, - * the process is suspended (wait) until a new thread becomes available - * in the pool. - * <B>Important</B>: in a shared thread environment like this, it is important - * to set the right message manager for the thread, otherwise messages - * will be delivered to the wrong aglet. - * @param group the group of the (in case) new thread - * @param manager the message manager that must be associated to the thread - * @return - */ - protected synchronized final AgletThread getThread(ThreadGroup group, MessageManager manager){ - // as first I need to check if there's an available - // thread in the pool - - AgletThread t = null; - - - if( this.pool.size() >= 1 ){ - // I've got at least one ready thread, get it - t = (AgletThread) this.getWaitingThread(); - } - else{ - // if here there's no thread in the pool, I should - // create a new thread but it depends on the - // number of threads I've already created. - - // If the number of created thread has reached the - // maximun count, then stop the creation and wait - // until a new thread becomes available - if( this.handled == this.size ){ - try{ - while( this.pool.size() == 0){ - this.wait(); - } - - // if here at least one thread is in the pool - t = (AgletThread)this.getWaitingThread(); - - }catch(InterruptedException ex){ - System.err.println("Cannot wait for another thread in the pool"); - ex.printStackTrace(); - return null; - } - } - else{ - // i can create a new thread - t = new AgletThread(group, manager); - t.setMessageManager(manager); - // should I change the group of the thread???? - this.handled++; - - } - } - - - // if here I've got the thread - t.setMessageManager(manager); - return t; + logger.info("AgletThreadPool ready"); + } + + /** + * An utility method that creates a new thread, sets the group of the thread and + * pushes it into the stack, thus the new thread is available to the pool. Moreover, + * this method increases the createdThread value, thus to store the number of threads + * created by this pool. + * + */ + protected void createNewThread(){ + logger.debug("Creating a new thread (thread number " + this.createdThread + ")"); + AgletThread thread = new AgletThread(this.threadGroup); + thread.setName("PooledAgletThread num." + this.createdThread); + thread.setDaemon(true); // all the pooled thread are daemons, they are utility threads + this.threads.push(thread); + this.createdThread++; + } + + /** + * Creates a new instance of the pool and returns it to the caller. + * @return the instance of the thread pool for the running platform. + */ + public synchronized static AgletThreadPool getInstance(){ + // check if the pool is already ready + if( mySelf != null ) + return mySelf; + else{ + mySelf = new AgletThreadPool(); + return mySelf; } + } + + + /** + * Provides a new AgletThread to the caller. The AgletThread will be used combined with + * the specified message manager (that must be not-null). This method checks the pool to see if a + * good thread is contained in it, and thus such thread is returned. Otherwise, if possible (i.e., + * the pool has not yet reached the max size) a new thread is created. In the case there are no + * available threads and no more thread can be created (due to the reach of the max pool size), the + * caller thread is suspended waiting for a new thread to be available. + * @param messageManager the message manager that will be used for the new thread + * @return the AgletThread to use to manage messages. + * @throws AgletException if the specified message manager is null, or a problem occurs while + * waiting for a new thread to be available on the pool. + */ + public synchronized AgletThread pop(MessageManager messageManager) throws AgletException{ + // first of all check if the message manager is valid + if( (messageManager == null) || (! (messageManager instanceof MessageManagerImpl)) ) + throw new AgletException("Cannot get a thread for a null message manager"); + + // the thread to return... + AgletThread thread = null; - - /** - * A service to extract a waiting thread from the pool. It is important - * to note that once placed in the pool the thread could be not yet sleeping, - * that means it is going to call the wait method, but it hasn't done yet. - * For this reason this method searches in the pool for a thread that - * is effectively waiting (i.e., it has done the wait call). The loop is - * performed twice on the pool, to avoid infinite loop. - * @return the first waiting thread in the pool - */ - protected final AgletThread getWaitingThread(){ - AgletThread t = null; - boolean find = false; - - if( this.pool != null && this.pool.size() >= 1){ - int looper = this.pool.size()*2; - - while( find == false && looper >= 0){ - t = (AgletThread) this.pool.pop(); - looper--; - - if( t.isWaiting() == false){ - // re-insert the thread in the pool - this.pool.push(t); - } - else - find = true; - } - } - - return t; + // check the size of the stack/pool. If it is zero there are not threads available + // thus a new thread should be created, but this only if the number of created + // threads does not exceed the maxPoolSize, otherwise it is required to wait... + if( (this.threads.size() == 0) && (this.createdThread < this.maxPoolSize) ){ + // create a new thread + this.createNewThread(); } + else + while( (this.threads.size() == 0) && (this.createdThread > this.maxPoolSize) ){ + // I cannot create no more threads, the max size of the pool has already been + // reached, thus the caller must wait until a new thread is available + logger.debug("Waiting for a thread to re-enter the pool and be available..."); + try{ + this.wait(); + }catch(InterruptedException ex){ + logger.error("Exception caught while waiting for a thread to be available in the pool!", ex); + throw new AgletException(); + } + + } // end of while + // now if I'm here there must be at least an available thread in the pool, pop + // it and return it to the caller. + logger.debug("Popping a thread from the pool"); + thread = this.threads.pop(); + this.busyThreads++; + logger.debug("Returning the thread " + thread); - /** - * A method to place a thread in the pool, that means releasing - * a thread thus other agents/message managers can use it. The thread - * is inserted in the pool only if it does not already is in the pool - * and if the max number of thread managed from this pool has not been reached - * yet (to avoid continue pushing of new threads). In the case - * a process is waiting for a thread (wiat), it is notified. - * @param thread the thread to release - * @return true if the thread is placed in the pool, false otherwise. - */ - public synchronized boolean push(AgletThread thread){ - // check the argument - if( thread == null ){ - return false; - } - - // check if the thread is already contained in the pool - // or if the maximum size of the pool has been reached - // (i.e., avoid continue pushing of new threads!) - if( this.pool.contains(thread) || this.pool.size() == this.size ){ - return false; - } - - // now insert the thread in the pool - this.pool.push(thread); - - // notify sleeping threads - this.notifyAll(); - - - return true; - } - + // sets the message manager for this thread + thread.setMessageManager((MessageManagerImpl)messageManager); - /** - * A service to get a thread from the pool. - * @param manager the message manager to use with the thread - * @return the thread obtained from the pool (could be a new thread). - */ - public AgletThread pop(MessageManager manager){ - AgletThread t = this.getThread(Thread.currentThread().getThreadGroup(), manager); - //t.notifyAll(); - return t; - } + // all done! + return thread; + } + + /** + * Inserts (or re-inserts) a thread into the pool, making it available for other + * requests. Please note that if the pool already contains a reference to such thread + * or a number of threads greater than the maxPoolSize have been pushed, the pushing is aborted. + * An exception is thrown if it is forced to push a thread that does not belong to the + * thread group of the pooled threads. + * @param thread the thread to insert into the pool. + * @exception if the thread group is different from the one the pool has set at the thread creation. + */ + public synchronized void push(AgletThread thread) throws AgletException{ + // check if the thread is valid, or if it is already contained in the pool + // or if too much threads have been already be pushed in the pool! + if( thread == null || this.contains(thread) || this.threads.size() > this.maxPoolSize) + return; - protected void dumpPool(){ - for(int i=0; i<this.pool.size(); i++){ - System.out.println("Thread in pool: "+this.pool.elementAt(i)); - } + // check if the thread group is strictly the same of the pool thread group + if( this.threadGroup.equals(thread.getThreadGroup()) == false ){ + logger.error("Trying to push a thread with a group different from the pool thread group!"); + throw new AgletException("Trying to push a thread with a group different from the pool thread group!"); } + // simply push the thread to the stack + logger.debug("Pushing back the thread in the pool"); + thread.setMessageManager(null); + this.threads.push(thread); + this.busyThreads--; + } + + /** + * Gets back the maxPoolSize. + * @return the maxPoolSize + */ + public synchronized int getMaxPoolSize() { + return maxPoolSize; + } + + /** + * Sets the maxPoolSize value. + * @param maxPoolSize the maxPoolSize to set + */ + public synchronized void setMaxPoolSize(int maxPoolSize) { + this.maxPoolSize = maxPoolSize; + } + + /** + * Gets back the minPoolSize. + * @return the minPoolSize + */ + public synchronized int getMinPoolSize() { + return minPoolSize; + } + + /** + * Sets the minPoolSize value. + * @param minPoolSize the minPoolSize to set + */ + public synchronized void setMinPoolSize(int minPoolSize) { + this.minPoolSize = minPoolSize; + } + + /** + * Gets back the threadGroup. + * @return the threadGroup + */ + public synchronized final ThreadGroup getThreadGroup() { + return threadGroup; + } + + /** + * Checks if a specific thread is currently owned by the thread pool. + * @param thread the thread to check + * @return true if the thread is currently handled by this pool + */ + public synchronized final boolean contains(AgletThread thread){ + if( thread == null || this.threads.size() == 0 ) + return false; + else + return this.threads.contains(thread); + } + + + /** + * Provides the information about how many threads are busy at the moment + * in the pool. + * @return the number of busy threads + */ + public synchronized final int getBusyThreadsNumber(){ + return this.busyThreads; + } + + /** + * Returns the number of created threads of this pool. + * @return the number of threads that this pool has created up to now + */ + public synchronized int getCreatedThread() { + return this.createdThread; + } + - /** - * Returns a delivery message thread. Please note that this code does not keep into account of the size - * of the thread pool, that means, each time a delivery thread is required and no one is available, it - * will be created. This is due to the fact that the number of delivery thread created should be less - * than the number of thread used to execute agents. - * @param proxy the proxy for the delivery thread. - * @param message the message to deliver. - * @return - */ - public DeliveryMessageThread getDeliveryMessageThread(AgletProxy proxy, Message message){ - // check parameters - if( proxy == null || message == null ) - return null; - - // synchornize - synchronized(this){ - if( this.deliveryPool.size() == 0 ){ - // no delivery thread yet created, create a new one - DeliveryMessageThread dmt = new DeliveryMessageThread(proxy, message); - return dmt; - } - else{ - // we have a thread in the pool, get it - DeliveryMessageThread dmt = (DeliveryMessageThread) this.deliveryPool.pop(); - return dmt; - } - } - } - - - /** - * Re-insert a thread in the pool of the delivery thread. - * @param thread the thread to re-insert. - */ - public void pushDeliveryMessageThread(DeliveryMessageThread thread){ - if( thread != null && this.deliveryPool != null && this.deliveryPool.contains(thread) == false ) - synchronized(this){ - this.deliveryPool.push(thread); - } - else - return; - } - - } --- NEW FILE: AgletThread.java --- package com.ibm.aglets.thread; /* * @(#)AgletThread.java * * IBM Confidential-Restricted * * OCO Source Materials * * 03L7246 (c) Copyright IBM Corp. 1996, 1998 * * The source code for this program is not published or otherwise * divested of its trade secrets, irrespective of what has been * deposited with the U.S. Copyright Office. */ import org.aglets.log.AgletsLogger; import com.ibm.aglet.Aglet; import com.ibm.aglet.AgletException; import com.ibm.aglet.InvalidAgletException; import com.ibm.aglet.message.Message; import com.ibm.aglet.message.MessageManager; import com.ibm.aglets.LocalAgletRef; import com.ibm.aglets.MessageImpl; import com.ibm.aglets.MessageManagerImpl; /** * The thread for message handling. * * * Notes from Luca Ferrari - cat...@us...: * * This class is a specific thread used to manage the message delivery. Once an agent must receive/process * a message, a thread is activated and used to process such message. In other words, the handleMessage() method * of an aglet is run on top of one of AgletThread. * * Please note that the thread management involves the message manager and the message itself, since * the steps are the following: * 1) a message is delivered from a sender to the destination agent. The addressee agent stores the message * into a message queue, hold from the message manager. * 2) the message manager, once one or more thread have been stored in the queue, pops a thread and start * processing such threads one by one. In particular: * a) the message is passed to the thread; * b) the thread invokes the handle() method on the message itself * c) the message invokes the handleMessage() on the aglet, passing itself as argument * d) the thread exits the monitor, that is informs the message manager that the above message * has been delivered. The message manager processes another message or leaves the thread. In the first case * there is a chain that produces that until the message queue is empty the thread is hold to process * messages. In the second case the thread is free, and the message manager waits until a new message comes. * * * In the 2.0.2 schema each agent has its own threadSpool, that is a stack of threads used to manage * only messages related to the owner agent. Once the thread has delivered the message, it is pushed back into * such stack (that is contained in the message manager). * * In the 2.1.0 schema there is a thread pool that, globally, provides threads for the whole messaging system. Thus * the message manager does not handle any more a private stack of threads but requires them to the pool. * Once the thread has delivered the message and no more messages must be processed for this agent, the * message manager pushes it back in the thread pool This allows a thread * to be used for different agents at different times. Please note that this implies that a thread must know not only * the message it is going to process, but also the message manager that oredered that, for coherence. * The thread has also two ways of locking: * _ processing = it is processing a message, thus it cannot receive changes about the message itself or the message manager; * _ changing = it is changing either the message manager or the message to process and thus cannot process it. * * Please note that the message manager will push and pop the thread again when it process a next message, this can bring to * situations where the next message is processed by a different thread and, in general, wastes a little resources. Maybe this will be * fixed in the future. * * 07/ago/07 */ public final class AgletThread extends Thread { private boolean valid = true; private boolean start = false; private boolean loop_started = false; private MessageManagerImpl messageManager = null; private MessageImpl message = null; /** * A counter about the number of created threads. */ private static int count = 1; // counts the number of thread created. /** * The logger of this class of thread(s). */ private static AgletsLogger logger = AgletsLogger.getLogger("com.ibm.aglets.thread.AgletThread"); /** * The number of messages this thread has handled, just for a little statistic * count. */ private int messageHandled = 0; /** * Indicates if the thread is processing or not the current message. */ private boolean processing = false; /** * Indicates if the something external to this thread is going to change the message to handle. */ private boolean changing = false; /** * This flag indicates if the thread is managing a reentrant message. */ private boolean reentrant = false; /** * Builds a thread knowing only the group. Used from the thread factory. * @param group the thread group. */ public AgletThread(ThreadGroup group){ super(group, "AgletThread num.:" + (count++) ); this.messageManager = null; this.setPriority(group.getMaxPriority()); } public AgletThread(ThreadGroup group, MessageManager m) { super(group, "No." + (count++) + ']'); messageManager = (MessageManagerImpl)m; setPriority(group.getMaxPriority()); } public static MessageImpl getCurrentMessage() { Thread t = Thread.currentThread(); if (t instanceof AgletThread) { AgletThread at = (AgletThread) t; return at.getMessage(); } return null; } /** * This method is called each time a message must be processed. The idea is that * this method should be called thru the proxy chain, and from this method the thread * must be started/restarted and should process the message itself. Please note that this * method is called within the sender's thread stack, and the message must be processed * within the receiver thread stack. * @param msg the message to process. */ public void handleMessage(MessageImpl msg) { // check if the message is valid if( msg == null ) return; logger.debug("Handling a message => " + msg); // set the message to use this.setMessage(msg); } synchronized public void invalidate() { // Debug.check(); if (valid) { valid = false; start = true; notifyAll(); } // Debug.check(); } /** * The execution cycle of this thread. The thread will continue to process * messages until it gets no more messages, and then it will suspend itself * waiting for a new message to come. */ public void run() { // if the loop of handing messages is already started return, so thus // no more than one run call can be done. if (loop_started) { // to assure that aglet cannot call run on this thread. return; } // set this thread as "started to handle messages" loop_started = true; start = false; // get the reference of the agent behind the message manager if( this.messageManager == null ) return; // the message manager is not valid! try { while (valid) { try { logger.debug("AgletThread is starting processing"); this.setReentrant(false); // if the process is here and is re-entrant now I'm processing // a re-entrant message, thus after this I have to suspend myself. this.setProcessing(true); // get the right reference to the aglet behind the current // message manager. This must be done each time in the cycle because // the thread could be suspended or the message manager could be changed // if the thread has passed thru the pool. MessageManagerImpl manager = this.getMessageManager(); logger.debug("The message manager is " + manager + ", the message is " + message); LocalAgletRef ref = manager.getAgletRef(); message.handle(ref); // handle the message this.messageHandled++; // increment the number of messages handled by this thread synchronized(this){ if( ! this.isReentrant() ){ message = null; // invalidate the message so to not repeat the handling logger.debug("AgletThread has invalidate the message just processed (no reentrant find!)"); } } this.setProcessing(false); logger.debug("AgletThread finished processing a message"); } catch (RuntimeException ex) { logger.error("Exception caught while processing a message", ex); valid = false; throw ex; } catch (Error ex) { logger.error("Error caught while processing a message"); valid = false; throw ex; } catch (InvalidAgletException ex) { logger.error("Exception caught while processing a message", ex); valid = false; start = true; } finally { // if the thread is valid, i.e., it has not been stopped // then invoke special methods on the message manager to process // another message (thus once the thread has been activated all messages are processed) // or to process another message (if present) and to push back the thread in the pool. if (valid && (! this.isReentrant())) { // push the thread back into the pool... logger.debug("The thread is going to be pushed back in the pool..."); messageManager.pushThreadAndExitMonitorIfOwner(this); } else { // process one more message... messageManager.exitMonitorIfOwner(); } } // here the message has been processed, thus I can suspend myself // waiting for a new message to process synchronized (this) { while (valid && this.message == null && (! this.isReentrant())) { try { logger.debug("Thread suspending waiting for a next message..."); this.wait(); } catch (InterruptedException ex) { logger.error("Exception caught while waiting for an incoming message", ex); } } } } } finally { // messageManager.removeThread(this); message = null; // Debug.end(); } } /** * Provides a printable version of this thread and its state. */ public String toString() { StringBuffer buffer = new StringBuffer(100); buffer.append("[" + this.getClass().getName() + "] "); buffer.append("Thread number "); buffer.append(count); if( this.messageManager != null ){ buffer.append("\n\tMessageManager: )"); buffer.append(this.messageManager); } if( this.message != null ){ buffer.append("\n\tMessage: "); buffer.append(this.message); } buffer.append("\n\t\tvalid: " + this.valid); buffer.append("\n\t\tmessageHandled: " + this.messageHandled); buffer.append("\n\t\tstart: " + this.start); buffer.append("\n"); return buffer.toString(); } /** * Gets back the message. * @return the message */ protected synchronized MessageImpl getMessage() { return message; } /** * Sets the message value. * @param message the message to set */ protected synchronized void setMessage(MessageImpl message) { try{ // first of all check if the thread is alive and is already processing // a message, in such case wait until it has finished of processing // the message, then change it. while( this.isAlive() && this.isProcessing() && (! this.isReentrant() )){ logger.debug("Thread waiting to set the message to process..."); this.wait(); // suspend myself until the current message has been processed } // substitute the message this.setChanging(true); logger.debug("Setting the message " + message + " for the current thread"); this.message = message; this.start = true; // no more changing the message to handle this.setChanging(false); // is the thread running? if( ! this.isAlive() ) this.start(); // resume suspended threads this.notifyAll(); }catch(InterruptedException e){ logger.error("Exception caught while trying to set a new message to process.", e); } } /** * Gets back the messageManager. * @return the messageManager */ protected synchronized MessageManagerImpl getMessageManager() { return messageManager; } /** * Sets the messageManager value. * @param messageManager the messageManager to set */ protected synchronized void setMessageManager(MessageManagerImpl messageManager) { try{ // first of all check if the thread is alive and is already processing // a message, in such case wait until it has finished of processing // the message, then change it. while( this.isAlive() && this.isProcessing() ){ this.wait(); // suspend myself until the current message has been processed } // substitute the message this.setChanging(true); this.messageManager = messageManager; this.start = true; // no more changing the message to handle this.setChanging(false); // resume suspended threads this.notifyAll(); }catch(InterruptedException e){ logger.error("Exception caught while trying to set a new messageManager.", e); } } /** * Used to understand if the current thread is processing a message or not, and thus if it is * safe to change the message this thread is handling. * @return the processing */ protected synchronized boolean isProcessing() { return processing; } /** * Sets the processing value. * @param processing the processing to set */ protected synchronized void setProcessing(boolean processing) { // check if the thread is already changing the current message, // thus I need to suspend and to wait, otherwise proceed try{ while( this.isAlive() && this.isChanging() ){ logger.debug("Thread waiting to set the processing flag..."); this.wait(); } this.processing = processing; // resume suspended threads this.notifyAll(); }catch(InterruptedException e){ logger.error("Exception caught while set processing value", e); } } /** * Gets back the changing. * @return the changing */ protected synchronized boolean isChanging() { return changing; } /** * Sets the changing value. * @param changing the changing to set */ protected synchronized void setChanging(boolean changing) { // if the thread is already processing a message I must wait try{ while( this.isAlive() && this.isProcessing() && (! this.isReentrant() ) ){ logger.debug("Thread waiting to set the changing flag..."); this.wait(); } this.changing = changing; // resume suspended threads this.notifyAll(); }catch(InterruptedException e){ logger.error("Exception caught while set the changing status", e); } this.changing = changing; } /** * Gets back the reentrant flag. * @return the reentrant */ public synchronized boolean isReentrant() { return reentrant; } /** * Sets the reentrant value. A re-entrant thread is a thread that must process another message * sent from the same thread itself to the same agent. * @param reentrant the reentrant to set */ public synchronized void setReentrant(boolean reentrant) { logger.debug("This aglet thread will process one more re-entrant message!"); this.reentrant = reentrant; } } |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:08
|
Update of /cvsroot/aglets/aglets/src/examples/start In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/examples/start Added Files: FirstAglet.java Log Message: Merge of experimental branch. --- NEW FILE: FirstAglet.java --- package examples.start; import com.ibm.aglet.Aglet; public class FirstAglet extends Aglet { public void run(){ System.out.println("Hello, I'm your first simple agent running!"); } } |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:06
|
Update of /cvsroot/aglets/aglets/src/com/ibm/awb/launcher In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/com/ibm/awb/launcher Modified Files: Main.java Log Message: Merge of experimental branch. Index: Main.java =================================================================== RCS file: /cvsroot/aglets/aglets/src/com/ibm/awb/launcher/Main.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- Main.java 27 Jul 2009 10:31:42 -0000 1.9 +++ Main.java 28 Jul 2009 07:04:54 -0000 1.10 @@ -22,6 +22,8 @@ import java.util.Enumeration; import java.security.cert.Certificate; +import javax.swing.SwingUtilities; + import com.ibm.maf.*; import com.ibm.aglet.*; import com.ibm.aglet.system.*; @@ -34,8 +36,8 @@ import com.ibm.awb.misc.FileUtils; import com.ibm.awb.misc.Resource; import com.ibm.awb.misc.LogStream; -import org.aglets.log.LogCategory; -import org.aglets.log.LogInitializer; + +import org.aglets.log.AgletsLogger; /** * Aglets server bootstrap. @@ -67,6 +69,7 @@ private static String FS; private static String PS; + private static AgletsLogger logger = AgletsLogger.getLogger(Main.class.getName()); /** @@ -102,12 +105,15 @@ if (_control_port_num > 0) { system_props.put("maf.controlport", Integer.toString(_control_port_num)); } - try { - // Logging starts here! - bootstrap(); - } catch (Exception ex) { - ex.printStackTrace(); - } + + try{ + bootstrap(); + }catch(Exception e){ + System.err.println("Exception while performing the platform bootstrap, unable to start!"); + e.printStackTrace(); + System.exit(1); + } + } @@ -259,11 +265,9 @@ private static void bootstrap() throws Exception { // Initialize logging system. - String initializerName = System.getProperty("aglets.logger.class", - "org.aglets.log.quiet.QuietInitializer" ); + String initializerName = System.getProperty("aglets.logger.class","com.ibm.awb.launcher.Main" ); Class.forName(initializerName); - LogCategory cat = LogInitializer.getCategory(Main.class.getName()); - cat.info("Logging system initialized!"); + logger.info("Logging system initialized!"); // Initializes AWT and Audio classes. if (!(_nogui || _daemon)) { @@ -329,7 +333,7 @@ MAFAgentSystem maf_system = new MAFAgentSystem_AgletsImpl(runtime); String protocol = System.getProperties().getProperty("maf.protocol"); - cat.debug("Initializing handler: "+protocol); + logger.debug("Initializing handler: "+protocol); MAFAgentSystem.initMAFAgentSystem(maf_system, protocol); // Initializes Tahiti(part of the agent system) @@ -577,16 +581,6 @@ // Get mandatory properties String aglets_home = props.getProperty("install.root"); - - // Luca: only beacuse I don't understand how to pass these values thru eclipse! - aglets_home="f:\\aglets2.0.2"; - String icons_file = aglets_home+"\\cnf\\icons.prop"; - props.setProperty("aglets.home",aglets_home); - props.setProperty("aglets.icons",icons_file); - props.setProperty("aglets.icons.path",aglets_home+"\\icons"); - System.out.println("Aglets_home = "+aglets_home); - - // install.root will be given the script produced // by InstallShield JavaEdition. if (aglets_home == null) { @@ -595,17 +589,9 @@ System.err.println("Please specify aglets.home property"); System.exit(1); } - else{ - System.out.println("Running for the aglet installation aglets_home="+aglets_home); - } } - - - + String user_home = props.getProperty("user.home", null); - - System.out.println("Aglets home: "+aglets_home); - if (user_home == null || user_home.length() == 0) { user_home = FileUtils.getUserHome(); @@ -626,10 +612,15 @@ } // aglets.class.path - p = props.getProperty("aglets.class.path", null); - if (p == null) { - props.put("aglets.class.path", pathConcat(aglets_home, "public")); - } + p = props.getProperty("aglets.class.path", props.getProperty("java.class.path")); + String agletClasspath= pathConcat(aglets_home, "public"); + if( agletClasspath != null && agletClasspath.length() > 0 ) + p+= File.pathSeparator + agletClasspath; + + props.put("aglets.class.path", p); + logger.info("Classpath is specified as " + props.get("aglets.class.path")); + logger.info("Real classpath = " +props.getProperty("java.class.path")); + // aglets.public.root p = props.getProperty("aglets.public.root", null); @@ -686,5 +677,8 @@ System.err.println(" properties in the following file will override"); System.exit(1); } + + + } |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:05
|
Update of /cvsroot/aglets/aglets/src In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src Added Files: build.xml TahitiDaemonClient.java ServerApp.java WatcherClient.java Log Message: Merge of experimental branch. --- NEW FILE: WatcherClient.java --- /* * @(#)WatcherClient.java * * 03L7246 (c) Copyright IBM Corp. 1996, 1998 * * The program is provided "as is" without any warranty express or * implied, including the warranty of non-infringement and the implied * warranties of merchantibility and fitness for a particular purpose. * IBM will not be liable for any damages suffered by you as a result * of using the Program. In no event will IBM be liable for any * special, indirect or consequential damages or lost profits even if * IBM has been advised of the possibility of their occurrence. IBM * will not be liable for any third party claims against you. */ import com.ibm.aglet.*; import com.ibm.aglet.message.Message; import com.ibm.aglet.system.Aglets; import java.net.URL; import java.util.Properties; /** * The WatcherClient example illustrates how to write an application program * with Aglets. With this API, you can create and dispatch an aglet, * send the aglet a message and receive a result from it. * To run this example, you need the server and WatcherSlave Aglet. * * @version 1.00 $Date: 2009/07/28 07:04:53 $ * @author Mitsuru Oshima * @see aglet.system.Aglets * @see examples.watcher.ProxyWatcher * @see examples.watcher.WatcherSlave */ public class WatcherClient { public static void main(String a[]) throws java.lang.Exception { if (a.length < 1) { System.out .println("WatcherClient firstAddress secondAddress ..."); return; } System.out.println("========= Creating in " + a[0]); AgletProxy proxy = Aglets.createAglet(a[0], null, "keio.ics.nak.watcher.WatcherSlave", null); System.out.println((String)proxy.sendMessage(new Message("getInfo"))); int i = 1; while (a.length > i) { try { System.out.println("========== Dispatching to " + a[i]); proxy = proxy.dispatch(new URL(a[i++])); String str = (String)proxy.sendMessage(new Message("getInfo")); System.out.println(str); } catch (Exception ex) { ex.printStackTrace(); break; } } proxy.dispose(); } } --- NEW FILE: build.xml --- <?xml version="1.0"?> <!-- Build Script for Aglets for Java 2 compatible Aglet Software Development Kit (ASDK) $Revision: 1.14 $ $Date: 2009/07/28 07:04:53 $ $Author: cat4hire $ --> <project name="Aglets" default="all" basedir="."> <!-- Build Properties --> <property name="Name" value="aglets"/> <property name="version" value="2.0.2"/> <property name="src.dir" location="."/> <!-- Dependent Libraries and compiled classes --> <property name="lib.dir" location="../lib"/> <property name="lib.classes.dir" location="../lib/classes"/> <!-- Configuration source directory --> <property name="cnf.dir" location="../cnf"/> <!-- directory for docs --> <property name="doc.dir" location="../doc"/> <!-- Directory holding user aglets. --> <property name="public.dir" location="../public"/> <!-- Use Java 2 compiler --> <property name="build.compiler" value="modern" /> <!-- Project classpath. Imports sytem classpath and then adds all jar files found in the lib directory. --> <path id="project.classpath"> <pathelement path="${classpath}"/> <fileset dir="${lib.dir}"> <include name="*.jar"/> </fileset> </path> <!-- Same as project.classpath with project classes inlcuded. --> <path id="app.classpath"> <pathelement path="${lib.classes.dir}"/> <path refid="project.classpath"/> </path> <!-- Top level target. Redirect to all-release --> <target name="all" depends="all-release"/> <!-- Top level target. Builds java files with deprecation off and optimization on. --> <target name="all-release" depends="release-flags,prepare,lib,stubs,jar,public,examples,doc"/> <!-- Top level target. Builds java files with deprecation on and optimization off. --> <target name="all-dev" depends="dev-flags,prepare,lib,stubs,jar,public,doc"/> <!-- Top level target. Builds java files with development settings. No jar or examples. --> <target name="dev" depends="dev-flags,prepare,lib,stubs,public"/> <!-- Set flags for compiler (Dev) --> <target name="dev-flags"> <property name="dep.flag" value="on"/> <property name="debug.flag" value="on"/> <property name="opt.flag" value="off"/> </target> <!-- Set flags for compiler (Release) --> <target name="release-flags"> <property name="dep.flag" value="off"/> <property name="debug.flag" value="off"/> <property name="opt.flag" value="on"/> </target> <!-- Initialize build. Checks for availabiltiy of dependent libraries. --> <target name="init" > <echo> Aglets SDK Build $Revision: 1.14 $ $Date: 2009/07/28 07:04:53 $ </echo> <tstamp/> <!-- Check for log4j classes --> <available classname="org.apache.log4j.Category" property="log4j.present" classpathref="project.classpath" /> </target> <!-- Creates lib.directory tree. This is not the installation tree. --> <target name="prepare" depends="init"> <mkdir dir="${lib.classes.dir}" /> <mkdir dir="${public.dir}" /> </target> <!-- If log4j is in project classpath, build the log4j logger. --> <target name="logger" if="log4j.present"> <echo message="Log4j found. Building logger."/> <javac srcdir="${src.dir}" destdir="${lib.classes.dir}" debug="${debug.flag}" deprecation="${dep.flag}" optimize="${opt.flag}" > <classpath refid="project.classpath"/> <include name="org/aglets/log/log4j/*.java"/> </javac> </target> <!-- Compile the ASDK java files --> <target name="lib" depends="prepare,logger"> <javac srcdir="${src.dir}" destdir="${lib.classes.dir}" debug="${debug.flag}" deprecation="${dep.flag}" optimize="${opt.flag}" > <classpath refid="project.classpath"/> <include name="com/ibm/**/*.java"/> <include name="TahitiDaemonClient.java"/> <include name="org/aglets/log/**/*.java"/> <exclude name="com/ibm/agletx/**/*.java"/> <exclude name="org/aglets/log/log4j/*.java"/> </javac> </target> <!-- Build RMI stubs --> <target name="stubs" depends="lib"> <rmic base="${lib.classes.dir}" includes="com/ibm/maf/rmi/*_RMIImpl.class"/> </target> <!-- Build the helper classes not part of the core. --> <target name="public" depends="prepare"> <javac srcdir="${src.dir}" destdir="${public.dir}" debug="${debug.flag}" deprecation="${dep.flag}" optimize="${opt.flag}" > <classpath> <path refid="app.classpath"/> </classpath> <include name="com/ibm/agletx/**/*.java"/> </javac> </target> <!-- Build the example aglets --> <target name="examples" depends="prepare"> <javac srcdir="${src.dir}" destdir="${public.dir}" debug="${debug.flag}" deprecation="${dep.flag}" optimize="${opt.flag}" > <classpath> <path refid="app.classpath"/> </classpath> <include name="examples/**/*.java"/> <exclude name="examples/test/security/*.java"/> <exclude name="examples/protection/**/*.java"/> </javac> </target> <!-- Somebody's security test --> <target name="test.security" depends="prepare"> <javac srcdir="${src.dir}" destdir="${lib.classes.dir}" debug="on" deprecation="on" optimize="off" > <classpath> <path refid="app.classpath"/> </classpath> <include name="examples/test/security/*.java"/> </javac> </target> <!-- Build the ASDK jar file --> <target name="jar" depends="lib"> <jar jarfile="${lib.dir}/${Name}-${version}.jar"> <fileset dir="${lib.classes.dir}"> <include name="com/ibm/**/*.class"/> <include name="org/aglets/log/**/*.class"/> <exclude name="com/ibm/agletx/**/*.class"/> </fileset> </jar> </target> <!-- Build API docs from source code. --> <target name="doc" depends="prepare"> <javadoc packagenames="org.aglets.*,com.ibm.*" classpathref="app.classpath" sourcepath="${src.dir}" destdir="${doc.dir}" author="true" version="true" use="true" private="yes" windowtitle="Aglets Development Kit" doctitle="<h1>Aglets Development Kit</h1>"> </javadoc> </target> <!-- Cleans the tree for release. --> <target name="tidy" depends="init"> <delete dir="${lib.classes.dir}" /> <delete dir="${src.dir}/lib" /> <delete dir="${src.dir}/cnf" /> <delete dir="${src.dir}/scripts" /> <delete> <fileset dir=".." defaultexcludes="no" > <include name="**/*~"/> <include name="**/CVS/"/> </fileset> </delete> </target> <!-- Cleans the tree of all generated files. --> <target name="clean-all" depends="tidy"> <delete> <fileset dir="../bin"> <exclude name="*.in"/> <exclude name="install*"/> <exclude name="build.xml"/> <exclude name="ant*"/> <exclude name="lcp.bat"/> </fileset> </delete> <delete dir="${public.dir}" /> <delete includeEmptyDirs="true"> <fileset dir="${doc.dir}"> <include name="**/*"/> <exclude name="spec11.html"/> </fileset> </delete> </target> <target name="noCvs"> <delete includeEmptyDirs="true"> <fileset dir=".." defaultexcludes="no"> <include name="**/CVS/" /> </fileset> </delete> </target> </project> --- NEW FILE: TahitiDaemonClient.java --- /* * $Id: TahitiDaemonClient.java,v 1.4 2009/07/28 07:04:53 cat4hire Exp $ * * @(#)TahitiDaemonClient.java * * @author Lary Spector * @created July 22, 2001 * * TahitiDaemonClient is a java application used to communicate with * and control a running TahitiDaemon. * * TahitiDaemon implements a Tahiti service which listens on * a configurable control port for commands. */ import java.io.*; import java.net.*; public class TahitiDaemonClient { private static boolean _verbose = false; private static boolean _dont_connect = false; private static int _control_port_num = 5545; private static String hostname; private static boolean _banner_version_OK = false; private static int _socket_timeout = 10000; // 10 seconds /* * Banner and version Strings */ private static String _banner_string = "TahitiDaemon"; private static String _version_string = "1.0"; private static String helpMsg = "help Display this message. \n" + "quit Disconnect from the server and quit. \n" + "shutdown Shutdown the server and quit. \n" + "reboot Reboot the server and quit. \n" + "list List all aglets in the server. \n" + "msg on|off Turns message printing on/off, default is off. \n" + "debug on|off Debug output on/off, default is off. \n" + "create [codeBase] name Create new aglet. \n" + "<aglet> dispatch URL Dispatch the aglet to the URL. \n" + "<aglet> clone Clone the aglet. \n" + "<aglet> dispose Dispose the aglet. \n" + "<aglet> dialog Request a dialog to interact with.\n" + "<aglet> property Display properties of the aglet.\n" + "Note: <aglet> is a left most string listed in the result of list command. "; /* * Main method * Args: -help -verbose -controlport -host */ public static void main(String[] args) throws IOException { String prompt = ">"; Socket clientSocket = null; PrintWriter out = null; BufferedReader in = null; parseArgs(args); // bail out if the user only asked for help. if (_dont_connect) System.exit(1); try { clientSocket = new Socket(hostname, _control_port_num); out = new PrintWriter(clientSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); clientSocket.setSoTimeout(_socket_timeout); } catch (UnknownHostException e) { System.err.println("\nUnknown host: " + hostname); System.exit(1); } catch (IOException e) { System.err.println("\nCouldn't get I/O for the connection to: " + hostname); System.exit(1); } BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); String fromServer = "start"; String fromUser; Thread.currentThread().setPriority(1); // Try reading from the Daemon try { fromServer = in.readLine(); } catch (IOException ex) { System.err.println("\nFailure reading from: " + hostname + ":" + _control_port_num); if (_verbose) { ex.printStackTrace(); } System.exit(1); } /* * Handshake with the Daemon, check banner and version */ try { if (fromServer != null) { if (_verbose) { System.out.println("Server banner: " + fromServer); } if (fromServer.equals(_banner_string)) { if (_verbose) { System.out.println("Banner check OK."); } if ((fromServer = in.readLine()) != null) { if (_verbose) { System.out.println("Server version: " + fromServer); } if (fromServer.equals(_version_string)) { if (_verbose) { System.out.println("Version check OK."); } _banner_version_OK = true; } else { System.out.println("Version mismatch."); System.out.println("Client version is: " + _version_string); System.out.println("Server version is: " + fromServer); } } } else { System.out.println("Banner check failed."); System.out.println("Client banner is: " + _banner_string); System.out.println("Server banner is: " + fromServer); } } } catch (IOException ex) { System.err.println("\nFailure reading from: " + hostname + ":" + _control_port_num); if (_verbose) { ex.printStackTrace(); } System.exit(1); } /* * If the banner and version strings are OK, * start handling commands. */ if (_banner_version_OK) { try { // read the connection info if ((fromServer = in.readLine()) != null) { // display it if verbose if (_verbose) { System.out.println("Server: " + fromServer); } } } catch (IOException ex) { System.err.println("\nFailure reading from: " + hostname + ":" + _control_port_num); if (_verbose) { ex.printStackTrace(); } System.exit(1); } while (true) { try { // Display the Prompt System.out.print(prompt + " "); System.out.flush(); // Handle client side input fromUser = stdIn.readLine(); if (fromUser != null) { if (_verbose) System.out.println("Client: " + fromUser); // Special cases for help and quit if ("help".equalsIgnoreCase(fromUser)) { System.out.println (helpMsg); System.out.flush(); } if ("quit".equalsIgnoreCase(fromUser)) { System.out.println ("Closing client connection"); System.out.flush(); break; } // Send command to server out.println(fromUser); } // Read reply from the server fromServer = in.readLine(); // Special cases for shutdown and reboot if (_verbose) { System.out.println("Server: " + fromServer); } if (fromServer.equals("shutting down")) { System.out.println("Server shutting down, closing client connection."); break; } else if (fromServer.equals("rebooting")) { System.out.println("Server rebooting, closing client connection."); break; } else { //handle everything else. System.out.println(fromServer); while (!((fromServer = in.readLine()).equals("done."))) { System.out.println(fromServer); } } } catch (IOException ex) { System.err.println("\nFailure reading from: " + hostname + ":" + _control_port_num); if (_verbose) { ex.printStackTrace(); } break; } catch (Throwable ex) { if (_verbose) { ex.printStackTrace(); } break; } } } out.close(); in.close(); stdIn.close(); clientSocket.close(); System.exit(1); } private static void usage() { System.err.println("\nTahitiDaemonClient [-verbose] [-host <hostname>] [-controlport <port>] [-help]\n"); System.err.println("Connects to a Tahiti Daemon and provides an interface to control it.\n"); System.err.println("options:"); System.err.println(" -verbose verbose output"); System.err.println(" -host <hostname>, default is localhost"); System.err.println(" -controlport <port number>, default is port " + _control_port_num); System.err.println(" -timeout <timeout>, in milliseconds, 0 (zero) is infinite, default is " + _socket_timeout); System.err.println(" -help prints this message"); // signal that the program // should not continue the connection process. _dont_connect=true; } private static void parseArgs(String[] args) { if (_verbose) System.out.println ("Parsing Args...\n"); if (args.length <= 0) return; for (int i = 0; i < args.length; i++) { if (args[i].equalsIgnoreCase("-help")) { usage(); break; } else if (args[i].equalsIgnoreCase("-verbose")) { _verbose = true; } else if (args[i].equalsIgnoreCase("-controlport")) { if (i + 1 >= args.length) { usage(); break; } i++; try { _control_port_num = Integer.parseInt(args[i]); } catch (NumberFormatException ex) { System.err.println("\nError! controlport <" + args[i] + "> is invalid, it must be an integer "); _dont_connect=true; break; } } else if (args[i].equalsIgnoreCase("-timeout")) { if (i + 1 >= args.length) { usage(); break; } i++; try { _socket_timeout = Integer.parseInt(args[i]); } catch (NumberFormatException ex) { System.err.println("\nError! timeout <" + args[i] + "> is invalid, it must be an integer "); _dont_connect=true; break; } } else if (args[i].equalsIgnoreCase("-host")) { if (i + 1 >= args.length) { System.err.println("\nError! hostname was not specified after -host argument"); usage(); break; } i++; hostname = args[i]; } else { System.err.println("\nUnknown argument: " + args[i] + "\n"); usage(); break; } } } } --- NEW FILE: ServerApp.java --- /* * @(#)ServerApp.java * * 03L7246 (c) Copyright IBM Corp. 1996, 1998 * * The program is provided "as is" without any warranty express or * implied, including the warranty of non-infringement and the implied * warranties of merchantibility and fitness for a particular purpose. * IBM will not be liable for any damages suffered by you as a result * of using the Program. In no event will IBM be liable for any * special, indirect or consequential damages or lost profits even if * IBM has been advised of the possibility of their occurrence. IBM * will not be liable for any third party claims against you. */ import java.awt.Frame; import java.net.URL; import java.net.UnknownHostException; import java.io.File; import java.util.Properties; import com.ibm.maf.*; import com.ibm.aglet.*; import com.ibm.aglet.message.Message; import com.ibm.aglet.system.*; import com.ibm.aglets.MAFAgentSystem_AgletsImpl; import com.ibm.aglets.tahiti.Tahiti; import java.security.AccessController; import java.security.PrivilegedAction; import com.ibm.awb.misc.*; /** * The ServerApp example illustrates how to embed the AgletsServer facility * into an application program. * * @version 1.00 $Date: 2009/07/28 07:04:53 $ * @author Mitsuru Oshima * @see com.ibm.aglet.system.AgletRuntime * @see com.ibm.aglets.Tahiti.Main */ public class ServerApp extends ContextAdapter { // additional options final static Opt options[] = { Opt.Entry("-protocol", "maf.protocol", null), Opt.Entry("-username", "username", null), Opt.Entry("-password", "password", null), }; public void agletActivated(ContextEvent ev) { System.out.println("Aglet Activated : " + ev.getAgletProxy()); } public void agletArrived(ContextEvent ev) { System.out.println("Aglet Arrived : " + ev.getAgletProxy()); } public void agletCloned(ContextEvent ev) { System.out.println("Aglet Cloned : " + ev.getAgletProxy()); } public void agletCreated(ContextEvent ev) { System.out.println("Aglet Created : " + ev.getAgletProxy()); } public void agletDeactivated(ContextEvent ev) { System.out.println("Aglet Deactivated : " + ev.getAgletProxy()); } public void agletDispatched(ContextEvent ev) { System.out.println("Aglet Dispatched : " + ev.getAgletProxy()); } public void agletDisposed(ContextEvent ev) { System.out.println("Aglet Disposed : " + ev.getAgletProxy()); } public void agletReverted(ContextEvent ev) { System.out.println("Aglet Reverted : " + ev.getAgletProxy()); } public static void main(String args[]) throws java.lang.Exception { Opt.setopt(options); AgletRuntime runtime = AgletRuntime.init(args); String[] r = (String[])AccessController.doPrivileged(new PrivilegedAction() { public Object run() { String[] results = new String[2]; String userName = System.getProperty("user.name"); results[0] = System.getProperty("username", userName); results[1] = System.getProperty("password", ""); return results; } }); String username = r[1]; String password = r[2]; Object obj = runtime.authenticateOwner(username, password); if (obj == null) { System.err.println("Cannot authenticate the user \"" + username + "\""); throw new Exception("User authentication failed."); } /* * User authentication (optional) * If this program requests user identification from dialog box, * we need the following call. */ /* * if (Main.login(runtime) == null) return; */ MAFAgentSystem maf_system = new MAFAgentSystem_AgletsImpl(runtime); String protocol = "atp"; protocol = (String)AccessController.doPrivileged(new PrivilegedAction() { public Object run() { return System.getProperty("maf.protocol", "atp"); } }); MAFAgentSystem.initMAFAgentSystem(maf_system, protocol); Tahiti.initializeGUI(); Tahiti.installFactories(); /* * Create named contexts. To dispatch to this context, * sender has to secify the destination like, * "atp://aglets.trl.ibm.com:434/test" * Defining multiple contexts is also possible. * * Support of multiple context is experimental function. * This feature may drop in the future. */ // first context AgletContext cxt = runtime.createAgletContext("test"); cxt.addContextListener(new ServerApp()); // second context AgletContext cxt2 = runtime.createAgletContext("test2"); cxt2.addContextListener(new ServerApp()); Tahiti.installSecurity(); MAFAgentSystem.startMAFAgentSystem(maf_system, protocol); // start contexts cxt.start(); cxt2.start(); /* * From this point, you can use contexts. * (creating, dispatching an aglet, etc.) * 1. Create HelloAglet in cxt, * 2. And, dispatches it to cxt2. * See the source code for the detail of HelloAglet. */ AgletProxy p = cxt.createAglet(null, "examples.hello.HelloAglet", null); Message msg = new Message("startTrip", cxt2.getHostingURL().toString()); p.sendMessage(msg); } public void showMessage(ContextEvent ev) { System.out.println("message : " + ev.getMessage()); } } |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:05
|
Update of /cvsroot/aglets/aglets/src/com/ibm/aglet/system In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/com/ibm/aglet/system Modified Files: AgletRuntime.java ContextAdapter.java Aglets.java ContextEvent.java Log Message: Merge of experimental branch. Index: AgletRuntime.java =================================================================== RCS file: /cvsroot/aglets/aglets/src/com/ibm/aglet/system/AgletRuntime.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- AgletRuntime.java 27 Jul 2009 10:31:42 -0000 1.7 +++ AgletRuntime.java 28 Jul 2009 07:04:54 -0000 1.8 @@ -47,7 +47,7 @@ public abstract class AgletRuntime { final static String runtimePackagePrefix = "aglet.runtime.packagePrefix"; - static LogCategory logCategory = LogInitializer.getCategory("com.ibm.aglet.system.AgletRuntime"); + private static AgletsLogger logger = AgletsLogger.getLogger(AgletRuntime.class.getName()); private boolean _secure = true; @@ -258,13 +258,13 @@ if (obj instanceof AgletRuntime) { runtime = (AgletRuntime)obj; } else { - logCategory.error("[ \"" + classname + "\" is not Runtime]"); + logger.error("[ \"" + classname + "\" is not Runtime]"); } } catch (ClassNotFoundException ex) { - logCategory.error("[ The class \"" + classname + logger.error("[ The class \"" + classname + "\" not found]"); } catch (Exception ex) { - logCategory.error("[ An instance of \"" + classname + logger.error("[ An instance of \"" + classname + "\" cannot be created]"); } Index: Aglets.java =================================================================== RCS file: /cvsroot/aglets/aglets/src/com/ibm/aglet/system/Aglets.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- Aglets.java 27 Jul 2009 10:31:42 -0000 1.4 +++ Aglets.java 28 Jul 2009 07:04:54 -0000 1.5 @@ -33,19 +33,17 @@ * * <pre> * static public void main(String args[]) { - * Aglets.init(); - * String contextAddress = "atp://server.com:4434"; - * - * // create from server's local path - * AgletProxy p1 = Aglets.createAglet(contextAddress, - * null, - * "test.Aglet", null); - * AgletID id = p1.getAgletID(); - * - * // this returns a proxy equivalent to p1. - * AgletProxy p2 = Aglets.getAgletProxy(contextAddress, id); - * - * p2.sendMessage(new Message("startTrip")); + * String contextAddress = "atp://server.com:4434"; + * + * // create from server's local path + * AgletProxy p1 = Aglets.createAglet(contextAddress, null, + * "test.Aglet", null); + * AgletID id = p1.getAgletID(); + * + * // this returns a proxy equivalent to p1. + * AgletProxy p2 = Aglets.getAgletProxy(contextAddress, id); + * + * p2.sendMessage(new Message("startTrip")); * } * </pre> * @@ -83,7 +81,7 @@ return AgletRuntime.getAgletRuntime().getAgletProxies(contextAddress); } /** - * Obtains a proxy reference the remote aglet. + * Obtains a proxy reference to the remote aglet. */ static public AgletProxy getAgletProxy(String contextAddress, AgletID id) throws IOException { |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:05
|
Update of /cvsroot/aglets/aglets/src/examples/itinerary In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/examples/itinerary Modified Files: CirculateAglet.java VisitingAglet.java MessengerAglet.java Log Message: Merge of experimental branch. |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:05
|
Update of /cvsroot/aglets/aglets/src/examples/http In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/examples/http Modified Files: WebServerAglet.java Log Message: Merge of experimental branch. Index: WebServerAglet.java =================================================================== RCS file: /cvsroot/aglets/aglets/src/examples/http/WebServerAglet.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- WebServerAglet.java 27 Jul 2009 10:31:42 -0000 1.2 +++ WebServerAglet.java 28 Jul 2009 07:04:54 -0000 1.3 @@ -17,6 +17,7 @@ import com.ibm.aglet.*; import com.ibm.aglet.message.Message; +import com.ibm.aglet.message.MessageManager; import com.ibm.awb.misc.Encoding; import java.io.*; import java.net.URL; |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:05
|
Update of /cvsroot/aglets/aglets/src/examples/logger In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/examples/logger Added Files: LoggingAgent.java Log Message: Merge of experimental branch. --- NEW FILE: LoggingAgent.java --- package examples.logger; import org.aglets.log.*; import com.ibm.aglet.Aglet; public class LoggingAgent extends Aglet { public void run(){ System.out.println("Hi, I'm a loggin aglet..."); System.out.println("Let me get a logger "); AgletsLogger myLogger = this.getLogger(true); System.out.println("Ok, my logger is (reinitiliazed): " + myLogger); if( myLogger != null ){ myLogger.info("Here's an info message"); myLogger.warn("Here's a warn message"); myLogger.error("Here's an error message"); myLogger.debug("Here's a debug message"); System.out.println("I've put some messages in the log, please check it!"); } } } |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:05
|
Update of /cvsroot/aglets/aglets/src/org/aglets/log In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/org/aglets/log Added Files: AgletsLogger.java Log Message: Merge of experimental branch. --- NEW FILE: AgletsLogger.java --- package org.aglets.log; import java.util.HashMap; import java.util.Map; import org.apache.log4j.Logger; import org.apache.log4j.Level; import org.apache.log4j.xml.DOMConfigurator; /** * This class represents a wrapper around the Log4J library for logging. Each class in the Aglets library should now * use this wrapper to log messages. This class statically loads the configuration of the Log4J library * to set up the logging facility. * @author Luca Ferrari - cat...@us... * */ public class AgletsLogger implements Cloneable{ /** * The logger to use. */ private Logger logger = null; /** * A map to map each class with a specific logger, thus in * the future different instances of the same class can get the same * logger. */ private static Map<String, AgletsLogger> loggerMap = new HashMap<String, AgletsLogger>(); // configure the loggin system static{ String agletsHome = System.getProperty("aglets.home"); String pathSeparator = "/"; // check if the aglets home has already a path separator if( agletsHome != null && (! (agletsHome.endsWith(pathSeparator)) ) ) agletsHome += pathSeparator; else if( agletsHome == null ) agletsHome = "." + pathSeparator; // append the config directory and the name of the configuration file agletsHome += "cnf" + pathSeparator + "log4j.xml"; // configure the loggin system DOMConfigurator.configure(agletsHome); } /** * Provides a logger for the specified resource. * Please note that this method uses a map to store the logger providden associating * it with the name specified. This means that in further calls, the logger returned will * be the same logger instance. * @param name the name of the logger * @return the logger to use */ public static AgletsLogger getLogger(String name){ AgletsLogger foundLogger = null; foundLogger = loggerMap.get(name); if( foundLogger == null ){ foundLogger = new AgletsLogger(name); loggerMap.put(name, foundLogger); } return foundLogger; } /** * Creates a new logger with the specified name. * @param name the name for the logger. */ private AgletsLogger(String name) { logger = Logger.getLogger(name); } /** * Logs a message at Fatal priority. */ public void fatal(Object msg) { logger.fatal(msg); } /** * Logs a message at error priority. * * @param msg Message to be logged. * @since 1.0 */ public void error(Object msg) { logger.error(msg); } /** * Logs a message at error priority and passes an exception for logging. * * @param msg Message to be logged. * @param exc Description of Parameter * @since 1.0 */ public void error(Object msg, Exception exc) { logger.error(msg, exc); } /** * Logs a message at warn priority. * * @param msg Message to be logged. * @since 1.0 */ public void warn(Object msg) { logger.warn(msg); } /** * Logs a message at debug priority. * * @param msg Message to be logged. * @since 1.0 */ public void debug(Object msg) { logger.debug(msg); } /** * Log a message at the info priority. * @param msg the message to log */ public void info(Object msg){ logger.info(msg); } /** * Check whether this category is enabled for the <code>DEBUG</code> * priority. * * <p> This function is intended to lessen the computational cost of * disabled log debug statements. * * <p> For some <code>cat</code> Category object, when you write, * <pre> * cat.debug("This is entry number: " + i ); * </pre> * * <p>You incur the cost constructing the message, concatenatiion in * this case, regardless of whether the message is logged or not. * * <p>If you are worried about speed, then you should write * <pre> * if(cat.isDebugEnabled()) { * cat.debug("This is entry number: " + i ); * } * </pre> * * <p>This way you will not incur the cost of parameter * construction if debugging is disabled for <code>cat</code>. On * the other hand, if the <code>cat</code> is debug enabled, you * will incur the cost of evaluating whether the category is debug * enabled twice. Once in <code>isDebugEnabled</code> and once in * the <code>debug</code>. This is an insignificant overhead * since evaluating a category takes about 1%% of the time it * takes to actually log. * * @return boolean - <code>true</code> if this category is debug * enabled, <code>false</code> otherwise. * */ public boolean isDebugEnabled() { return logger.isDebugEnabled(); } /** * Logs a translating action, this works only with the debug level activated. * @param src the original string * @param dest the translated string */ public void translation(String src, String dest){ if( src != null || dest != null ) logger.debug("Translated/changed the string <<" + src + ">> into <<" + dest + ">>"); } /** * Sets the debug level for this logger. * */ public void setDebugLevel(){ this.logger.setLevel(Level.DEBUG); } /** * Sets the info level for this logger. * */ public void setInfoLevel(){ this.logger.setLevel(Level.INFO); } /** * Sets the level of this logger to error. * */ public void setErrorLevel(){ this.logger.setLevel(Level.ERROR); } /** * Sets the level of the logger to warning. * */ public void setWarningLevel(){ this.logger.setLevel(Level.WARN); } /** * Sets the level of the logger to trace. * */ public void setTraceLevel(){ this.logger.setLevel(Level.TRACE); } /** * Is this logger working for debug level? * @return true if the debug level on this logger is active */ public boolean isDebugLevel(){ return this.logger.isDebugEnabled(); } /** * Is this worker working as trace? * @return true if the logger is working for trace */ public boolean isTraceLevel(){ return this.logger.isTraceEnabled(); } /** * Is this logger working as info? * @return true if the logger is working at the info level. */ public boolean isInfoLevel(){ return this.logger.isInfoEnabled(); } } |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:05
|
Update of /cvsroot/aglets/aglets/src/com/ibm/agletx/util In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/com/ibm/agletx/util Modified Files: MetaItinerary.java MeetingsItinerary.java SlaveItinerary.java MessengerItinerary.java Task.java SeqItinerary.java MeetingTask.java SeqPlanItinerary.java AlternateItinerary.java SimpleItinerary.java Log Message: Merge of experimental branch. Index: SeqItinerary.java =================================================================== RCS file: /cvsroot/aglets/aglets/src/com/ibm/agletx/util/SeqItinerary.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- SeqItinerary.java 27 Jul 2009 10:31:41 -0000 1.4 +++ SeqItinerary.java 28 Jul 2009 07:04:53 -0000 1.5 @@ -100,7 +100,7 @@ return getAddressAt(index); } /** - * Return the task to be preformed at the current destination + * Return the task to be performed at the current destination */ protected Task getCurrentTask() { return getTaskAt(index); |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:05
|
Update of /cvsroot/aglets/aglets/src/examples/talk In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/examples/talk Modified Files: TalkMaster.java Log Message: Merge of experimental branch. |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:04
|
Update of /cvsroot/aglets/aglets/src/examples/hello In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/examples/hello Modified Files: HelloAglet.java Log Message: Merge of experimental branch. |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:04
|
Update of /cvsroot/aglets/aglets/src/com/ibm/aglets/security In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/com/ibm/aglets/security Modified Files: Lifetime.java PolicyPermission.java PolicyFileReader.java Randoms.java PolicyGrant.java PolicyFileWriter.java PolicyFileParsingException.java DateString.java PolicyImpl.java PolicyDB.java Log Message: Merge of experimental branch. Index: PolicyFileReader.java =================================================================== RCS file: /cvsroot/aglets/aglets/src/com/ibm/aglets/security/PolicyFileReader.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- PolicyFileReader.java 27 Jul 2009 10:31:40 -0000 1.6 +++ PolicyFileReader.java 28 Jul 2009 07:04:53 -0000 1.7 @@ -93,9 +93,7 @@ private StreamTokenizer _st = null; private PolicyDB _db = null; - private static final LogCategory log - = LogInitializer.getCategory(PolicyFileReader.class.getName() ); - + private static AgletsLogger logger = AgletsLogger.getLogger(PolicyFileReader.class.getName()); public PolicyFileReader(String policyFilename) { try { readPolicyFile(policyFilename); @@ -434,7 +432,7 @@ } protected synchronized void readPolicyFile(String filename) throws FileNotFoundException { - log.info("Reading security policy file: " + filename); + logger.info("Reading security policy file: " + filename); if (filename == null) { throw new FileNotFoundException("Policy filename is null."); } @@ -446,11 +444,11 @@ try { readPolicyDB(); reader.close(); - log.debug("Policy file read complete"); + logger.debug("Policy file read complete"); } catch (PolicyFileParsingException excpt) { - log.error("Error parsing policy file: ",excpt); + logger.error("Error parsing policy file: ",excpt); } catch (IOException excpt) { - log.error("Error parsing policy file: ",excpt); + logger.error("Error parsing policy file: ",excpt); } } protected synchronized void readPolicyGrant() Index: PolicyPermission.java =================================================================== RCS file: /cvsroot/aglets/aglets/src/com/ibm/aglets/security/PolicyPermission.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- PolicyPermission.java 27 Jul 2009 10:31:40 -0000 1.5 +++ PolicyPermission.java 28 Jul 2009 07:04:53 -0000 1.6 @@ -31,9 +31,8 @@ * @author ONO Kouichi */ public class PolicyPermission { - private static final LogCategory log = - LogInitializer.getCategory(PolicyPermission.class.getName() ); - private static final String CLASSNAME_PERMISSION = + private static AgletsLogger logger = AgletsLogger.getLogger(PolicyPermission.class.getName()); + private static final String CLASSNAME_PERMISSION = "java.security.Permission"; private static final String CLASSNAME_BASIC_PERMISSION = "java.security.BasicPermission"; @@ -288,7 +287,7 @@ } } _permission = (Permission)obj; - log.debug("Created permission: "+_permission); + logger.debug("Created permission: "+_permission); return _permission; } public boolean equals(PolicyPermission permission) { Index: PolicyGrant.java =================================================================== RCS file: /cvsroot/aglets/aglets/src/com/ibm/aglets/security/PolicyGrant.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- PolicyGrant.java 27 Jul 2009 10:31:40 -0000 1.2 +++ PolicyGrant.java 28 Jul 2009 07:04:53 -0000 1.3 @@ -456,4 +456,38 @@ return lines; } + + + /** + * Returns the number of the permission stored whitin this grant. + * @return the number of permission within this grant, zero if there are no permissions. + */ + public final int getPermissionCount(){ + if( this._permissions == null ) + return 0; + else + return this._permissions.size(); + } + + /** + * Returns the number of signers for the current policy grant. + * @return the number of signers (>= 0) + */ + public final int getSignersCount(){ + if( this._signers == null ) + return 0; + else + return this._signers.size(); + } + + /** + * Returns the number of onwers for this policy grant. + * @return the numbero fo owners or zero if no one has been specified. + */ + public final int getOwnersCount(){ + if( this._owners == null ) + return 0; + else + return this._owners.size(); + } } |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:04
|
Update of /cvsroot/aglets/aglets/src/org/aglets/util/gui In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/org/aglets/util/gui Added Files: WindowManager.java GUICommandStrings.java JComponentBuilder.java ImagePanel.java Log Message: Merge of experimental branch. --- NEW FILE: JComponentBuilder.java --- package org.aglets.util.gui; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionListener; import java.awt.event.ItemListener; import java.util.*; import javax.swing.*; import java.io.*; import org.aglets.log.AgletsLogger; import org.aglets.util.AgletsTranslator; import com.ibm.aglets.tahiti.OkCancelButtonPanel; /** * This class represents an utility class which aim is to build a standardized JCOmponent, * like a JLabel or a JButton to use in the GUI of the platform (i.e., the Tahiti server) or * in a swing application/agent. * * The idea of this class is that for each main JComponent you want to create, you can get one * localized thru a resource bundle or a property file. By default this class works with the * Tahiti property file (lib/tahiti.properties) for the localization. * * You should use this class thru a set of keys, that are strings that represents a component * of your dialog window, thus the system can automatically bind the icon for such key. For instance, * for a JLabel in the status memoryBar com.ibm.aglets.tahiti.MainWindow object, you should use a key like * com.ibm.aglets.tahiti.MainWindow.statusBarLabel (or something similar) and provide * in the tahiti.properties file the translation and the icon as follows: * com.ibm.aglets.tahiti.MainWindow.statusBarLabel = "Text for the status memoryBar" * com.ibm.aglets.tahiti.MainWindow.statusBarLabel.icon = "/path/to/the/icon" * * @author Luca Ferrari - cat...@us... * * 06/set/07 */ public class JComponentBuilder { /** * Static keys for the default. */ public static String OK_BUTTON_KEY = "OK_BUTTON_KEY"; public static String CANCEL_BUTTON_KEY = "CANCEL_BUTTON_KEY"; /** * The suffix of the key of a component for the key specification. */ public static String ICON_KEY_SUFFIX = ".icon"; /** * The suffix for the tooltip key. */ public static String TOOLTIP_KEY_SUFFIX = ".tooltip"; /** * The title suffix. */ public static String TITLE_KEY_SUFFIX = ".title"; /** * The initial content of a component, for example the initial text of * a textfield. */ public static String INITIAL_CONTENT_KEY_SUFFIX = ".initial"; /** * The suffix for a message. */ public static String MESSAGE_KEY_SUFFIX = ".message"; /** * The logo of the project. */ public static String LOGO_FILE = "img/logo.png"; public static String LOGO_SMALL_FILE = "img/logo_small.png"; /** * The translator to use for texts and other stuff. */ private static AgletsTranslator translator = AgletsTranslator.getInstance("tahiti", Locale.getDefault()); /** * The logger of this class. */ private static AgletsLogger logger = AgletsLogger.getLogger(JComponentBuilder.class.getName()); /** * Returns an incon for the specified key, appended with the ".icon" suffix. This means * that if your icon key is something like com.ibm.aglets.tahiti.MainWindow.createButton, * then the image file will be searched in the translator with the key com.ibm.aglets.tahiti.MainWindow.createButton.icon * * Please note that if the file does not exists, then the icon returned will be null. * @param key the key that identifies the component to search the icon for, without the .icon suffix. * @return the created icon */ public static Icon getIcon(String key){ String iconPath = translator.translate(key + ICON_KEY_SUFFIX); File iconFile = new File(iconPath); // check if I found something if( iconPath == null || iconPath.equals(key + ICON_KEY_SUFFIX) || (!(iconFile.exists()) )) return null; else{ ImageIcon icon = new ImageIcon(iconPath); return icon; } } /** * Provides the title for a window, that is the translation for the .title * key. * @param key the key of the window * @return the translated title or null */ public static String getTitle(String key){ //check params if( key == null ) return null; else return translator.translate(key + TITLE_KEY_SUFFIX); } /** * Provides the mnemonic shortcut for a menu entry. * @param key the base key of the menu * @return the char for the memo entry */ public static char getMnemonic(String key){ // check params if( key == null ) return ' '; else{ String memo = translator.translate(key + ".mnemonic"); if( memo != null && memo.length() == 1) return memo.charAt(0); else return ' '; } } /** * Provides the tooltip text of the specified key, already translated and localized * thru the translator. The tooltip for a component must be specified thru the key of the * component itself and the TOOLTIP_KEY_SUFFIX suffix. For instance, the tooltip for the * component com.ibm.aglets.tahiti.mainWindow.OkButton is specfied thru com.ibm.aglets.tahiti.mainWindow.OkButton. * @param key the key of the component * @return the localized tooltip string (if any) */ public static String getTooltipText(String key){ if( key == null ) return null; else return translator.translate(key + TOOLTIP_KEY_SUFFIX); } /** * Creates a new JLabel with the specified text (not to be translated but already translated) and icon. * @param text the text to display in the label * @param icon the icon to show * @return the JLabel created */ protected static final JLabel createJLabel(String text, Icon icon){ JLabel label = new JLabel(text, icon, JLabel.CENTER); return label; } /** * Builds a JLabel for the specified key. You should specify the key the method should use * to refers to your JLabel, and specify in the property file or ResourceBundle. The text to display * will be took from the ResourceBundle/property file, the icon from the same file/bundle but with * the ".icon" suffix appended. * @param key the key to use for the lookup in the property file/resource bundle * @return the created JLabel, with the specified icon and translated text. */ public static final JLabel createJLabel(String key){ String text = translator.translate(key); Icon icon = getIcon(key); return createJLabel(text, icon); } /** * Creates a specific JButton with an associated icon and tooltip, specified from the * key string. In other word the string key is used to lookup in the resource bundle for * the resource specified, and the .icon and .tooltip keys are also looked up. * @param key the key for this entry, you should also specify the key.icon and key.tooltip properties * @param actionCommand the action command for this button, if not specified it will be set equal to * the specified key * @param listener the action listener associated to this button (if there's one) * @return */ public static final JButton createJButton(String key, String actionCommand, ActionListener listener){ // check params if( key == null ) return null; // get the localized text String text = translator.translate(key); // get the icon of this button Icon icon = getIcon(key); // create the button JButton button = new JButton(); button.setText(text); if( icon != null ) button.setIcon(icon); // set the tooltip button.setToolTipText(getTooltipText(key)); // set the action command for the button if( actionCommand == null ) actionCommand = key; button.setActionCommand(actionCommand); if( listener != null ) button.addActionListener(listener); // all done return button; } /** * Creates a checkbox with the specified label, tooltip, and so on. * @param key the key for the lookup in the localized resources * @param selected true if the checkbox must be selected by default * @param listener the listener of this checkbox * @return the checkbox */ public static final JCheckBox createJCheckBox(String key, boolean selected, ItemListener listener){ // check params if( key == null ) return null; // get the texts String tooltip = getTooltipText(key); String text = translator.translate(key); Icon icon = getIcon(key); //create the checkbox JCheckBox cBox = new JCheckBox(); if( tooltip != null ) cBox.setToolTipText(tooltip); if( text != null ) cBox.setText(text); if( icon != null ) cBox.setIcon(icon); if( listener != null ) cBox.addItemListener(listener); cBox.setSelected(selected); // all done return cBox; } /** * Creates a JTextField with the specified size and the initial text. * @param size the size of the textfield, must be greated than zero * @param initialText the initial text to display (not mandatory) * @param key the key for the tooltip or initial text or something else * @return the created textfield or null if the size is less or equal zero */ public static final JTextField createJTextField(int size, String initialText, String key){ // check params if( size <= 0 ) return null; // create the textfield JTextField field = new JTextField(size); // get the values for this textfield String initialContent = translator.translate(key + INITIAL_CONTENT_KEY_SUFFIX); String tooltip = getTooltipText(key); // set the initial text if have it if( initialText != null ) field.setText(initialText); else if( initialContent != null && initialContent.equals(key + INITIAL_CONTENT_KEY_SUFFIX) == false) field.setText(initialContent); // set the tooltip if( tooltip != null ) field.setToolTipText(tooltip); // all done return field; } /** * Creates a password field with the specified size. * @param size the size of the field * @return the field or null */ public static final JPasswordField createJPasswordField(int size){ // check params if( size <= 0 ) return null; // create the textfield JPasswordField field = new JPasswordField(size); return field; } /** * Constructs a generic OK/Cancel two buttons panel with the button associated to the * specified listener. Please note that the keys OK_BUTTON and CANCEL_BUTTON (and their * derivates) must be present in the resource bundle. * @param listener the listener to use with these buttons * @param okKey the key used for the button ok, if null it will be used a default string * @param cancelKey the key for the cancel, if null a default string will be used * @return the panel with the two buttons */ public static final OkCancelButtonPanel createOkCancelButtonPanel(String okKey, String cancelKey, ActionListener listener){ return new OkCancelButtonPanel(okKey, cancelKey, listener); /* JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)); if( okKey == null || okKey.length() == 0 || okKey.equals(translator.translate(okKey)) ) okKey = OK_BUTTON_KEY; if( cancelKey == null || cancelKey.length() == 0 || cancelKey.equals(translator.translate(cancelKey)) ) cancelKey = CANCEL_BUTTON_KEY; JButton okButton = createJButton(okKey, GUICommandStrings.OK_COMMAND, listener); JButton cancelButton = createJButton(cancelKey, GUICommandStrings.CANCEL_COMMAND, listener); buttonPanel.add(okButton); buttonPanel.add(cancelButton); return buttonPanel; */ } public static final void showErrorDialog(JFrame parentFrame, String key){ // check arguments if( key == null ) return; // try to get the translations for this dialog String message = translator.translate(key + MESSAGE_KEY_SUFFIX); String title = getTitle(key); Icon icon = getIcon(key); // create the message dialog JOptionPane.showMessageDialog(parentFrame, message, title, JOptionPane.ERROR_MESSAGE, icon); } /** * Creats a panel that contains the logo of the aglets project. In the case the logo * cannot be found, then null is returned. * @return the image panel or null */ public static ImagePanel createLogoPanel(){ // test if the logo exists File logo = new File(LOGO_FILE); if( logo.exists() ){ ImagePanel panel = new ImagePanel(LOGO_FILE); return panel; } else return null; } /** * Creates a small logo panel with the small logo image. * @return the image panel or null */ public static ImagePanel createSmallLogoPanel(){ // test if the logo exists File logo = new File(LOGO_SMALL_FILE); if( logo.exists() ){ ImagePanel panel = new ImagePanel(LOGO_SMALL_FILE); return panel; } else return null; } /** * Creates a specific menu entry. * @param key the key to lookup for the translation * @param actionCommand the action command to associate to the item * @param listener the listener to add to the menu entry * @return the menu entry */ public static JMenuItem createJMenuItem(String key, String actionCommand, ActionListener listener){ // check params if( key == null || key.length() == 0 ) return null; // create the menu item JMenuItem item = new JMenuItem(); // set the mnemonic accelerator char memo = getMnemonic(key); if( memo != ' ' ) item.setMnemonic(memo); // get the translated text String text = translator.translate(key); // set the text if( text != null ) item.setText(text); else item.setText(key); // get the icon Icon icon = getIcon(key); // set the icon if( icon != null ) item.setIcon(icon); // get the tooltip String tooltip = getTooltipText(key); // set the tooltip if( tooltip != null ) item.setToolTipText(tooltip); // set the action if( actionCommand != null ) item.setActionCommand(actionCommand); else item.setActionCommand(key); // and if i've got the listener add it if( listener != null ) item.addActionListener(listener); // all done return item; } /** * Builds a JMenu with the translated text (if available). * @param key the key for the lookup of the text * @return the menu or null if it cannot be built. */ public static JMenu createJMenu(String key){ // check params if( key == null || key.length() == 0) return null; // create the menu looking up in the translations JMenu menu = new JMenu(); String text = translator.translate(key); // set the mnemonic accelerator char memo = getMnemonic(key); menu.setMnemonic(memo); if( text != null ) menu.setText(text); else menu.setText(key); // all done return menu; } /** * Gets back the translator. * @return the translator */ public static synchronized final AgletsTranslator getTranslator() { return translator; } /** * Returns a text area. * @param fileName if specified and not null, the file is read and each line is * appended to the text area. If the file cannot be read, than the text area cotnent * is set to empty. * @return the text area (empty of with the file content). */ public static JTextArea createJTextArea(String fileName){ JTextArea text = new JTextArea(10,30); // try to load the file if specified if( fileName != null ){ try{ File file = new File(fileName); BufferedReader reader = new BufferedReader( new FileReader(file) ); String line = null; do{ line = reader.readLine(); text.append(line); }while( line != null ); }catch(IOException e){ logger.error("Exception caught while loading file content to display in JTextArea " + fileName, e); text.setText(""); } } // all done return text; } } --- NEW FILE: ImagePanel.java --- package org.aglets.util.gui; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.awt.MediaTracker; import java.awt.Toolkit; import java.awt.image.ImageObserver; import javax.swing.JPanel; public class ImagePanel extends JPanel implements ImageObserver { /** * The image to display */ protected Image image=null; /** * This flag indicates if the image is complete or not. */ protected boolean isComplete=false; /** * The dimension of the panel. */ protected int width=0,height=0; /** * This is the message to display during loading. */ protected String message="Loading..."; /** * Default constructor. * @param image the image object. */ public ImagePanel(Image image) { super(); this.image=image; } /** * Overloaded constructor. It try to load the image itself. You should use * this to avoid image flicking problems. This method use all the * capabilities of the ImageObserver. * @param image the image file name */ public ImagePanel(String image) { super(); /* now load the image */ Toolkit tk=Toolkit.getDefaultToolkit(); this.image=tk.getImage(image); /* use the media tracker to wait untill the image is not loaded */ try{ MediaTracker tracker=new MediaTracker(this); tracker.addImage(this.image,0); tracker.waitForID(0); this.isComplete=true; /* now that the image is fully loaded I need to resize the panel to the size of the image */ this.width=this.image.getWidth(this); this.height=this.image.getHeight(this); this.setSize(this.width,this.height); this.setMinimumSize(this.getSize()); this.setMaximumSize(this.getSize()); this.setVisible(true); } catch(InterruptedException e){ this.message="Exception during loading process!"; this.isComplete=false; } } /** * Draw the image. */ @Override public void paint(Graphics device) { super.paint(device); if(this.isComplete==true) { device.drawImage(this.image,0,0,this.width,this.height,this); } else { device.setColor(Color.RED); device.drawString(this.message,20,20); } } /** * The update image method. This method is called for every update and or * error. */ @Override public boolean imageUpdate(Image image,int infoFlags, int x, int y, int width, int height) { if((infoFlags & ImageObserver.ALLBITS)==0) { /* the image is complete */ this.isComplete=true; this.repaint(); this.setVisible(true); return false; } else if((infoFlags & ImageObserver.ERROR)==0 || (infoFlags & ImageObserver.ABORT)==0 ) { /* error or abort */ this.isComplete=false; this.message="Error during load process (or abort)"; this.repaint(); return true; } else if((infoFlags & ImageObserver.SOMEBITS)==0) { /* some other data loaded, show the loading process percent */ int originalWidth=this.image.getWidth(this); int originalHeight=this.image.getHeight(this); int currentWidth=image.getWidth(this); int currentHeight=image.getHeight(this); /* now calculate the total of pixels */ long originalTotal=originalWidth*originalHeight; long currentTotal=currentWidth*currentHeight; /* now calculate the percent */ float percent=(float)currentTotal/(float)originalTotal *100; /* set the string */ this.message="Loading progress: "+(int)percent+" % done"; this.repaint(); return true; } return true; } /** * Defines the dimension of the panel depending on the size of the image. */ @Override public Dimension getPreferredSize(){ return new Dimension( this.image.getWidth(this), this.image.getHeight(this)); } } --- NEW FILE: GUICommandStrings.java --- package org.aglets.util.gui; public class GUICommandStrings { public static final String OK_COMMAND = "_ok"; public static final String CANCEL_COMMAND = "_cancel"; public static final String CLOSE_COMMAND = "_close"; public static final String EXIT_COMMAND = "_exit"; public static final String REBOOT_COMMAND = "_reboot"; public static final String CREATE_AGLET_COMMAND = "_create"; public static final String KILL_AGLET_COMMAND = "_kill"; public static final String CLONE_AGLET_COMMAND = "_clone"; public static final String DISPATCH_AGLET_COMMAND = "_dispatch"; public static final String RETRACT_AGLET_COMMAND = "_retract"; public static final String DISPOSE_AGLET_COMMAND = "_dispose"; public static final String ACTIVATE_AGLET_COMMAND = "_activate"; public static final String DEACTIVATE_AGLET_COMMAND = "_deactivate"; public static final String SLEEP_AGLET_COMMAND = "_sleep"; public static final String MESSAGE_AGLET_COMMAND = "_message"; public static final String INFO_AGLET_COMMAND = "_info"; public static final String MEMORY_COMMAND = "_memoryPanel"; public static final String GARBAGECOLLECTOR_COMMAND = "_gc"; public static final String REF_COMMAND = "_ref"; public static final String CONSOLE_COMMAND = "_console"; public static final String DEBUG_COMMAND = "_debug"; public static final String LOG_COMMAND = "_log"; public static final String THREAD_COMMAND = "_thread"; public static final String NETPREFS_COMMAND = "_netprefs"; public static final String SERVPREFS_COMMAND = "_servprefs"; public static final String GENPREFS_COMMAND = "_genprefs"; public static final String SECPREFS_COMMAND = "_secprefs"; public static final String ABOUT_COMMAND = "_about"; public static final String CREDITS_COMMAND = "_credits"; public static final String WEB_COMMAND = "_web"; public static final String DOC_COMMAND = "_doc"; public static final String RESIZE_COMMAND = "_resize"; public static final String REDUCE_COMMAND = "_reduce"; public static final String ENLARGE_COMMAND = "_enlarge"; public static final String ADD_COMMAND = "_add"; public static final String REMOVE_COMMAND = "_remove"; public static final String REFRESH_COMMAND = "_refresh"; public static final String CLEAR_CACHE_COMMAND = "_cache"; public static final String CREATE_SHARED_SECRET_COMMAND = "_createSharedSecret"; public static final String REMOVE_SHARED_SECRET_COMMAND = "_removeSharedSecret"; public static final String IMPORT_SHARED_SECRET_COMMAND = "_importSharedSecret"; public static final String EXPORT_SHARED_SECRET_COMMAND = "_exportSharedSecret"; public static final String BROWSE_FILESYSTEM_COMMAND = "_browse"; public static final String ADD_CODE_SOURCE_COMMAND = "_addCodeSource"; public static final String REMOVE_CODE_SOURCE_COMMAND = "_removeCodeSource"; public static final String ADD_PERMISSION_COMMAND = "_addPermission"; public static final String REMOVE_PERMISSION_COMMAND = "_removePermissio"; } --- NEW FILE: WindowManager.java --- package org.aglets.util.gui; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.*; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JWindow; import org.aglets.util.AgletsTranslator; import com.ibm.aglets.tahiti.TahitiWindow; /** * This class is used to manager window events (e.g., closing events) for a set * of windows (at least one). It could manage more than one window at time, thus to * avoid a lot of object creation. * * @author Luca Ferrari - cat...@us... * * 10/set/07 */ public class WindowManager extends WindowAdapter { /** * The owners list. */ protected LinkedList<JFrame> owners = null; /** * Initializes this window closer for the specified frame. * @param owner the owner of this window closer */ public WindowManager(JFrame owner){ super(); this.owners = new LinkedList<JFrame>(); this.add(owner); } /** * Adds a new JWindow object to manage thru this manager. * @param toAdd the JWindow object to add * @return true if it has been added, false otherwise */ public boolean add(JFrame toAdd){ if( toAdd != null && ( ! (this.owners.contains(toAdd)) ) ){ this.owners.add(toAdd); return true; } else return false; } /** * Close all the windows managed from this manager. */ public void windowClosing(WindowEvent event){ if( event == null || this.owners == null || this.owners.size() == 0) return; else{ // dispose each window managed Iterator iter = this.owners.iterator(); while (iter != null && iter.hasNext()) { JFrame window = (JFrame) iter.next(); // check if this window is a tahiti window and should // exit on closing if( window instanceof TahitiWindow && ((TahitiWindow)window).shouldExitOnClosing() ){ TahitiWindow tWindow = (TahitiWindow) window; AgletsTranslator translator = tWindow.getTranslator(); String baseKey = tWindow.getBaseKey(); if( JOptionPane.showConfirmDialog( tWindow, translator.translate( baseKey + ".shutdownMessage"), translator.translate( baseKey + ".shutdownMessage.title"), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION ){ window.setVisible(false); window.dispose(); System.exit(0); } } window.setVisible(false); window.dispose(); } } } } |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:04
|
Update of /cvsroot/aglets/aglets/src/examples/translator In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/examples/translator Added Files: TranslatingAglet.java Log Message: Merge of experimental branch. --- NEW FILE: TranslatingAglet.java --- package examples.translator; import java.util.*; import org.aglets.util.AgletsTranslator; import com.ibm.aglet.Aglet; public class TranslatingAglet extends Aglet { public void run(){ System.out.println("Hello, I'm a translating agent..."); System.out.println("let me see what translator I've got...."); System.out.println("The translator property file should be in a subdirectory that includes my"); System.out.println("fully qualified name and should be in the classpath (for instance under the lib directory"); // get the translator AgletsTranslator translator = this.getTranslator(true); if( translator != null ){ System.out.println("My translator has been loaded, check it:"); System.out.println("\tBasename:" + translator.getResourceBaseName()); System.out.println("\tLocale:" + translator.getLocale()); } else System.out.println("Problem! My translator has not been loaded!"); System.out.println("Let me show you which translator keys and values I've got..."); Enumeration<String> keys = translator.getKeys(); while( keys != null && keys.hasMoreElements() ){ String currentKey = keys.nextElement(); System.out.println("Translation for the key [" + currentKey + "]:" + translator.translate(currentKey)); } } } |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:03
|
Update of /cvsroot/aglets/aglets/src/examples/openurl In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/examples/openurl Modified Files: OpenURL.java Log Message: Merge of experimental branch. |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:03
|
Update of /cvsroot/aglets/aglets/src/com/ibm/net/protocol/atp In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/com/ibm/net/protocol/atp Modified Files: URLConnectionForATP.java Log Message: Merge of experimental branch. |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:03
|
Update of /cvsroot/aglets/aglets/src/examples/patterns In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/examples/patterns Modified Files: Writer.java Watcher.java WriterSlave.java Log Message: Merge of experimental branch. Index: WriterSlave.java =================================================================== RCS file: /cvsroot/aglets/aglets/src/examples/patterns/WriterSlave.java,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- WriterSlave.java 28 Jul 2001 06:34:33 -0000 1.1.1.1 +++ WriterSlave.java 28 Jul 2009 07:04:53 -0000 1.2 @@ -17,6 +17,7 @@ import com.ibm.aglet.*; import com.ibm.agletx.patterns.*; +import com.ibm.aglet.message.Arguments; import com.ibm.aglet.util.*; import java.util.Vector; Index: Writer.java =================================================================== RCS file: /cvsroot/aglets/aglets/src/examples/patterns/Writer.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- Writer.java 27 Jul 2009 10:31:41 -0000 1.2 +++ Writer.java 28 Jul 2009 07:04:53 -0000 1.3 @@ -16,6 +16,7 @@ */ import com.ibm.aglet.*; +import com.ibm.aglet.message.Arguments; import com.ibm.aglet.message.Message; import com.ibm.aglet.util.*; import com.ibm.agletx.patterns.Slave; Index: Watcher.java =================================================================== RCS file: /cvsroot/aglets/aglets/src/examples/patterns/Watcher.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- Watcher.java 27 Jul 2009 10:31:41 -0000 1.2 +++ Watcher.java 28 Jul 2009 07:04:53 -0000 1.3 @@ -17,6 +17,7 @@ import com.ibm.aglet.*; import com.ibm.agletx.patterns.*; +import com.ibm.aglet.message.Arguments; import com.ibm.aglet.message.Message; import com.ibm.aglet.util.*; |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:03
|
Update of /cvsroot/aglets/aglets/src/org/aglets/util In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/org/aglets/util Added Files: AgletsTranslator.java Log Message: Merge of experimental branch. --- NEW FILE: AgletsTranslator.java --- package org.aglets.util; import java.util.Enumeration; import java.util.HashMap; import java.util.Locale; import java.util.MissingResourceException; import java.util.ResourceBundle; import org.aglets.log.*; /** * This class represnts a "translator" object for anything in the platform (even the platform * itself). Internally, this class uses a ResourceBundle object to provide the translation of contents. * @author Luca Ferrari - cat...@us... * * 04/set/07 */ public class AgletsTranslator implements Cloneable { /** * An hashmap used for the storing of already loaded translators. */ private static HashMap<String, AgletsTranslator> translators = new HashMap<String, AgletsTranslator>(); /** * The resource bundle used to handle locale content. */ private transient ResourceBundle bundle = null; /** * The basename of the resource bundle. */ private String baseName = null; /** * The logger of this class. */ private transient static AgletsLogger logger = AgletsLogger.getLogger(AgletsTranslator.class.getName()); /** * Where the localization files should be. */ public static String LOCALIZATION_PATH = "localization"; /** * Builds this translator object with the specified resource name and locale. * @param localeBaseName the resource name (e.g., the name of properties file) * @param currentLocale the locale for which it is required the translation */ private AgletsTranslator(String localeBaseName, Locale currentLocale){ super(); this.baseName = localeBaseName; // build the resource bundle try{ this.bundle = ResourceBundle.getBundle(this.baseName, currentLocale); }catch(MissingResourceException e){ logger.error("Exception caught while trying to build a resource bundle", e); this.bundle = null; } catch(NullPointerException e){ logger.error("Exception caught while trying to build a resource bundle", e); this.bundle = null; } } /** * Translates a specific part of text, without arguments (i.e., you have to handle * escape characters outside this method). If the bundle has not been created or * if the text has no way to be translated (e.g., it is the string ""), then the original * string will be returned. * @param text the string to translate * @return the translated string */ public String translate(String text){ // be sure there is something to translate and I have a bundle to // ask for translation if( text != null && text.length() > 0 && this.bundle != null && this.bundle.containsKey(text)){ String translated = null; translated = this.bundle.getString(text); logger.translation(text, translated); return translated; } else // nothing to do, return the string passed as argument return text; } /** * Provides the locale this object is working with, or null if none. * @return the locale for the translations. */ public final Locale getLocale(){ if( this.bundle != null ) return this.bundle.getLocale(); else return null; } /** * Gets the basename of this translator. * @return the basename that has been used to initialize this object. */ public final String getResourceBaseName(){ return this.baseName; } /** * Provides the keys of this translator object. * @return the enumeration of the keys. */ public Enumeration<String> getKeys(){ if( this.bundle != null ) return this.bundle.getKeys(); else return null; } /** * Provides an implementation of the AgletsTranslator. If the translator has already been * loaded, the previous one is returned. * @param localeBaseName the base name for the translation * @param currentLocale the locale * @return the aglets translator */ public static AgletsTranslator getInstance(String localeBaseName, Locale currentLocale) { String key = localeBaseName + currentLocale.toString(); // search first in the cache if( translators.containsKey(key) ) return translators.get(key); else{ AgletsTranslator translator = new AgletsTranslator(localeBaseName, currentLocale); translators.put(key, translator); return translator; } } } |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:03
|
Update of /cvsroot/aglets/aglets/src/com/ibm/aglet/event In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/com/ibm/aglet/event Modified Files: MobilityAdapter.java PersistencyAdapter.java PersistencyEvent.java CloneAdapter.java PersistencyListener.java AgletEvent.java MobilityEvent.java CloneEvent.java CloneListener.java AgletEventListener.java MobilityListener.java Log Message: Merge of experimental branch. |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:03
|
Update of /cvsroot/aglets/aglets/src/examples/watcher In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/examples/watcher Modified Files: WatcherSlave.java ProxyWatcher.java Log Message: Merge of experimental branch. Index: WatcherSlave.java =================================================================== RCS file: /cvsroot/aglets/aglets/src/examples/watcher/WatcherSlave.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- WatcherSlave.java 27 Jul 2009 10:31:40 -0000 1.2 +++ WatcherSlave.java 28 Jul 2009 07:04:53 -0000 1.3 @@ -18,6 +18,7 @@ import com.ibm.aglet.*; import com.ibm.aglet.event.*; import com.ibm.aglet.message.Message; +import com.ibm.aglet.message.MessageManager; import java.io.IOException; import java.net.URL; |
From: Luca F. <cat...@us...> - 2009-07-28 07:05:03
|
Update of /cvsroot/aglets/aglets/src/com/ibm/maf/atp In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18746/src/com/ibm/maf/atp Modified Files: Handler.java Daemon.java ConnectionHandler.java HttpFilter.java Log Message: Merge of experimental branch. Index: Daemon.java =================================================================== RCS file: /cvsroot/aglets/aglets/src/com/ibm/maf/atp/Daemon.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- Daemon.java 27 Jul 2009 10:31:41 -0000 1.6 +++ Daemon.java 28 Jul 2009 07:04:53 -0000 1.7 @@ -68,7 +68,7 @@ * @author ONO Kouichi */ final public class Daemon { - public static final LogCategory log = LogInitializer.getCategory(Daemon.class.getName() ); + private static AgletsLogger logger = AgletsLogger.getLogger(Daemon.class.getName()); static Hashtable locals = new Hashtable(); @@ -299,17 +299,17 @@ Randoms.setUseSecureRandomSeed(secureseed); if (secureseed) { - log.info("USE SECURE RANDOM SEED."); + logger.info("USE SECURE RANDOM SEED."); } else { - log.info("USE UNSECURE PSEUDO RANDOM SEED."); + logger.info("USE UNSECURE PSEUDO RANDOM SEED."); } if (auth) { - log.info("Generating random seed ... wait for a while."); + logger.info("Generating random seed ... wait for a while."); Randoms.getRandomGenerator(Challenge.LENGTH); - log.info("done."); + logger.info("done."); } if (auth && SharedSecrets.getSharedSecrets() == null) { - log.error("No shared secret file for authentication."+ + logger.error("No shared secret file for authentication."+ "Authentication requires a shared secret file"+ "which is duplicated from other host,"+ "or newly created file."); @@ -318,9 +318,9 @@ auth = false; } if (auth) { - log.info("AUTHENTICATION MODE ON."); + logger.info("AUTHENTICATION MODE ON."); } else { - log.info("AUTHENTICATION MODE OFF."); + logger.info("AUTHENTICATION MODE OFF."); } ServerSocket socket = null; Index: Handler.java =================================================================== RCS file: /cvsroot/aglets/aglets/src/com/ibm/maf/atp/Handler.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- Handler.java 27 Jul 2009 10:31:41 -0000 1.6 +++ Handler.java 28 Jul 2009 07:04:53 -0000 1.7 @@ -37,9 +37,7 @@ import org.aglets.log.*; public class Handler implements AgentSystemHandler { - static private final LogCategory log - = LogInitializer.getCategory(Handler.class.getName() ); - + private static AgletsLogger logger = AgletsLogger.getLogger(Handler.class.getName()); static final int DEFAULT_PORT = 4434; static boolean initialized = false; @@ -67,7 +65,7 @@ } if( res.getBoolean("atp.useip", false) ) { - log.debug("Hostname: "+ipaddr); + logger.debug("Hostname: "+ipaddr); return ipaddr; } |