001: /*
002: * <copyright>
003: *
004: * Copyright 1997-2004 BBNT Solutions, LLC
005: * under sponsorship of the Defense Advanced Research Projects
006: * Agency (DARPA).
007: *
008: * You can redistribute this software and/or modify it under the
009: * terms of the Cougaar Open Source License as published on the
010: * Cougaar Open Source Website (www.cougaar.org).
011: *
012: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
013: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
014: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
015: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
016: * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
017: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
018: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
019: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
020: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
021: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
022: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
023: *
024: * </copyright>
025: */
026: package org.cougaar.glm.execution.common;
027:
028: import java.io.EOFException;
029: import java.lang.reflect.Array;
030: import java.lang.reflect.Method;
031:
032: /**
033: * Low level EG communications. Invokes handlers for received
034: * EGObjects. Terminates on connection error (usually eof).
035: **/
036:
037: public class EGReceiver implements Runnable {
038: private static class HandlerMethod {
039: Method method;
040: Object handler;
041:
042: public HandlerMethod(Object handler, Method method) {
043: this .method = method;
044: this .handler = handler;
045: }
046:
047: public void invoke(String source, Object egObject) {
048: try {
049: method.invoke(handler,
050: new Object[] { source, egObject });
051: } catch (Exception e) {
052: e.printStackTrace();
053: }
054: }
055:
056: public String toString() {
057: return handler.getClass().getName() + "."
058: + method.getName() + "(Object, "
059: + method.getParameterTypes()[1].getName() + ")";
060: }
061: }
062:
063: private HandlerMethod[] handlers = new HandlerMethod[EGObject.egObjectClasses.length];
064: private HandlerMethod[] arrayHandlers = new HandlerMethod[EGObject.egObjectClasses.length];
065:
066: private LineReader reader;
067:
068: private String source;
069: private String myName;
070:
071: public EGReceiver(String receiverName, String source) {
072: this .myName = receiverName;
073: this .source = source.intern();
074: }
075:
076: public void setReader(LineReader reader) {
077: this .reader = reader;
078: }
079:
080: public void addHandler(Object handler) {
081: Class handlerClass = handler.getClass();
082: Method[] methods = handlerClass.getMethods();
083: int nHandlers = 0;
084: for (int i = 0; i < methods.length; i++) {
085: Method method = methods[i];
086: if (method.getName().equals("execute")) {
087: Class[] parameterTypes = method.getParameterTypes();
088: if (parameterTypes.length == 2) {
089: if (String.class
090: .isAssignableFrom(parameterTypes[0])) {
091: Class arg2Type = parameterTypes[1];
092: if (arg2Type.isArray()) {
093: arg2Type = arg2Type.getComponentType();
094: if (EGObject.class
095: .isAssignableFrom(arg2Type)) {
096: int classIndex = EGObjectBase
097: .findClassIndex(arg2Type);
098: arrayHandlers[classIndex] = new HandlerMethod(
099: handler, method);
100: nHandlers++;
101: }
102: } else {
103: if (EGObject.class
104: .isAssignableFrom(arg2Type)) {
105: int classIndex = EGObjectBase
106: .findClassIndex(arg2Type);
107: handlers[classIndex] = new HandlerMethod(
108: handler, method);
109: nHandlers++;
110: }
111: }
112: }
113: }
114: }
115: }
116: if (nHandlers == 0) {
117: throw new IllegalArgumentException(handler.getClass()
118: .getName()
119: + " has no execute methods handling EGObjects");
120: }
121: }
122:
123: public void run() {
124: try {
125: while (true) {
126: EGObject egObject = reader.readEGObject();
127: Object arg;
128: HandlerMethod handler;
129: Class componentClass;
130: if (egObject instanceof EGObjectArray) {
131: EGObjectArray array = (EGObjectArray) egObject;
132: if (array.egObjects.length == 0)
133: continue; // Ignore empty arrays
134: EGObject component = array.egObjects[0];
135: handler = arrayHandlers[component.getClassIndex()];
136: componentClass = component.getClass(); // Array should be homogeneous
137: EGObject[] args = (EGObject[]) Array.newInstance(
138: componentClass, array.egObjects.length);
139: System.arraycopy(array.egObjects, 0, args, 0,
140: args.length);
141: arg = args;
142: } else {
143: handler = handlers[egObject.getClassIndex()];
144: arg = egObject;
145: componentClass = arg.getClass();
146: }
147: if (handler == null) {
148: System.err.println("No handler for "
149: + componentClass);
150: } else {
151: // System.out.println(myName + ": " + handler);
152: handler.invoke(source, arg);
153: }
154: }
155: } catch (EOFException eofe) {
156: return; // This is normal.
157: } catch (Exception e) {
158: e.printStackTrace();
159: }
160: }
161: }
|