@Override public void toXML(Object instance, Element parent) throws Exception { Object v = accessor.getValue(instance); if (v != null) { Object[] objects = null; if (v instanceof Object[]) { objects = (Object[]) v; } else if (v instanceof List) { objects = ((List) v).toArray(); } else { objects = PrimitiveArrays.toObjectArray(v); } if (objects != null) { if (xao == null) { for (Object o : objects) { String value = valueFactory.serialize(null, o); if (value != null) { Element e = XMLBuilder.addElement(parent, path); XMLBuilder.fillField(e, value, path.attribute); } } } else { for (Object o : objects) { Element e = XMLBuilder.addElement(parent, path); XMLBuilder.toXML(o, e, xao); } } } } }
/** * Send response with a result for a specific request message * * @param requestID the id of request to be responsed * @param result the result of invoked operation * @param destination the target endpoint */ private void sendResponse(int requestID, Object result, String destination) { Response response = new Response(messageCount.incrementAndGet(), requestID, this.endpoint, result); XMLBuilder build = new XMLBuilder(); String responseMessage = build.toXML(response); serviceProvider.sendMessage(responseMessage, destination); }
/** * Send request to invoke a service with specific waiting time * * @param service the service name * @param destination the target endpoint * @param reply requires reply or not * @param responseTime the max time for waiting a reply * @param opName the invoked operation name * @param params parameters for the operation * @return the service result */ public Object sendRequest( String service, String destination, boolean reply, long responseTime, String opName, Object... params) { try { int messageID = messageCount.incrementAndGet(); Request request = new Request(messageID, this.endpoint, service, opName, params); XMLBuilder build = new XMLBuilder(); String requestMessage = build.toXML(request); serviceProvider.sendMessage(requestMessage, destination); if (DEBUG) System.out.println("The request message is: \n" + requestMessage); if (reply) { synchronized (this) { if (responseTime == -1) { while (!results.containsKey(messageID)) { this.wait(); } } else { long startTime = System.currentTimeMillis(); while (!results.containsKey(messageID)) { this.wait(responseTime * Time.scale); long endTime = System.currentTimeMillis(); if ((endTime - startTime) / Time.scale >= responseTime) { results.put(messageID, new TimeOutError()); } } } } Object result = results.get(messageID); results.remove(messageID); return result != NullObject ? result : null; } return null; } catch (Exception e) { e.printStackTrace(); return null; } }