/** * Copyright (c) 2006 - 2010 Smaxe Ltd (www.smaxe.com). * All rights reserved. */ import com.smaxe.me.core.LinkedHashtable; import com.smaxe.me.io.Externalizable; import com.smaxe.me.io.ObjectInput; import com.smaxe.me.io.ObjectOutput; import com.smaxe.me.uv.ObjectEncoding; import com.smaxe.me.uv.Responder; import com.smaxe.me.uv.amf.ClassObject; import com.smaxe.me.uv.amf.IObjectCreator; import com.smaxe.me.uv.amf.support.ObjectCreator; import com.smaxe.me.uv.amf3.ArrayCollection; import com.smaxe.me.uv.client.License; import com.smaxe.me.uv.remoting.ds.AmfConnection; import com.smaxe.me.uv.remoting.ds.RemotingResponder; import com.smaxe.me.uv.remoting.ds.messages.AbstractMessage; import com.smaxe.me.uv.remoting.ds.messages.RemotingMessage; import java.io.IOException; import java.util.Enumeration; import java.util.Hashtable; /** * <code>ExMeAmfConnection</code> - {@link AmfConnection} usage example. * <p> Note: * <br> The example is based on Samples applications provided with BlazeDS server. * * @author Andrei Sochirca */ public final class ExMeAmfConnection extends Object { /** * Entry point. * * @param args * @throws Exception if an exception occurred */ public static void main(final String[] args) throws Exception { // NOTE: // you can get Evaluation Key at: // http://www.smaxe.com/order.jsf#request_evaluation_key // or buy at: // http://www.smaxe.com/order.jsf License.setKey("SET-YOUR-KEY"); final String url = "http://localhost:8400/samples/messagebroker/amf"; Hashtable configuration = new Hashtable(); // configuration.put(AmfConnection.Configuration.USE_HTTP_CONNECTION, new Boolean(false)); configuration.put(AmfConnection.Configuration.OBJECT_CREATOR, new CustomObjectCreator()); AmfConnection connection = new AmfConnection(configuration); connection.objectEncoding(ObjectEncoding.AMF3); connection.addEventListener(new AmfConnection.IListener() { public void onIOError(AmfConnection connection, final String message) { System.out.println("AmfConnection$IListener#onIOError: " + connection.uri() + " " + message); } public void onConnect(AmfConnection connection, final String id) { System.out.println("AmfConnection$IListener#onConnect: " + connection.uri() + " " + id); } public void onDisconnect(AmfConnection connection) { disconnected = true; System.out.println("AmfConnection$IListener#onDisconnect: " + connection.uri()); } }); connection.connect(url, new Object[] {}); // wait till connected while (!connection.connected() && !disconnected) { try { Thread.sleep(100); } catch (Exception e) {/*ignore*/} } if (!disconnected) { connection.call("my-amf" /*endpoint*/, "runtime-employee-ro" /*destination*/, "getEmployees", new Responder() { public void onResult(final Object result) { System.out.println("getEmployees() result: " + result); if (result instanceof ArrayCollection) { Enumeration e = ((ArrayCollection) result).array.elements(); while (e.hasMoreElements()) { final Object o = e.nextElement(); System.out.println(o); } } } public void onStatus(final Hashtable status) { System.out.println("getEmployees() status: " + status); } }, new Object[] {}); // other way to call remote method is using RemotingMessage instance RemotingMessage call = new RemotingMessage(); call.messageId = AmfConnection.createUUID(); call.destination = "runtime-employee-ro"; call.operation = "getEmployees"; call.body = new Object[0]; // getEmployees() arguments call.headers.put(RemotingMessage.ENDPOINT_HEADER, "my-amf"); // NOTE: // call.headers.put(RemotingMessage.FLEX_CLIENT_ID_HEADER, <id>); // this ID is added by AmfConnection class before sending to the server connection.sendMessage(call, new RemotingResponder() { public void onMessage(final AbstractMessage message) { System.out.println("getEmployees() message: " + message); } // Responder implementation public void onResult(final Object result) { System.out.println("getEmployees() result: " + result); if (result instanceof ArrayCollection) { Enumeration e = ((ArrayCollection) result).array.elements(); while (e.hasMoreElements()) { final Object o = e.nextElement(); System.out.println(o); } } } public void onStatus(final Hashtable status) { System.out.println("getEmployees() status: " + status); } }); } try { Thread.sleep(2 * 1000); } catch (Exception e) {/*ignore*/} connection.close(); } private static boolean disconnected = false; /** * <code>Employee</code> - employee class. */ public static class Employee extends Object { // fields /** * employee id. */ public int employeeId; /** * first name. */ public String firstName; /** * last name. */ public String lastName; /** * company. */ public Company company; /** * title. */ public String title; /** * phone number. */ public String phone; /** * email address. */ public String email; /** * Constructor. */ public Employee() { } @Override public String toString() { return "Employee [" + "employeeId=" + employeeId + ", " + "firstName=" + firstName + ", " + "lastName=" + lastName + ", " + "company=" + company + ", " + "title=" + title + ", " + "phone=" + phone + ", " + "email=" + email + "]"; } } /** * <code>Company</code> - company class. */ public static class Company extends Object { // fields /** * company id. */ public int companyId; /** * company name. */ public String name; /** * industry. */ public String industry; /** * state. */ public String state; /** * city. */ public String city; /** * zip code. */ public String zip; /** * address. */ public String address; /** * Constructor. */ public Company() { } @Override public String toString() { return "Company [" + "companyId=" + companyId + ", " + "name=" + name + ", " + "industry=" + industry + ", " + "state=" + state + ", " + "city=" + city + ", " + "zip=" + zip + ", " + "address=" + address + "]"; } } /** * <code>Money</code> - money. */ public static class Money extends Object implements Externalizable { // fields private String currency; private long amount; /** * Constructor. */ public Money() { } // Externalizable implementation public void readExternal(ObjectInput in) throws IOException { currency = in.readUTF(); amount = in.readLong(); } public void writeExternal(ObjectOutput out) throws IOException { out.writeUTF(currency); out.writeLong(amount); } } /** * <code>CustomObjectCreator</code> - custom {@link IObjectCreator} implementation. */ public static class CustomObjectCreator extends Object implements IObjectCreator { // fields private IObjectCreator defaultObjectCreator = new ObjectCreator(); /** * Constructor. */ public CustomObjectCreator() { } // IObjectCreator implementation public ClassObject toClassObject(Object o) { if (o instanceof Employee) { final Employee employee = (Employee) o; LinkedHashtable h = new LinkedHashtable(); h.put("employeeId", new Integer(employee.employeeId)); h.put("firstName", employee.firstName); h.put("lastName", employee.lastName); h.put("company", employee.company); h.put("title", employee.title); h.put("phone", employee.phone); h.put("email", employee.email); return new ClassObject("flex.samples.crm.employee.Employee", h); } else if (o instanceof Company) { final Company company = (Company) o; LinkedHashtable h = new LinkedHashtable(); h.put("companyId", new Integer(company.companyId)); h.put("name", company.name); h.put("industry", company.industry); h.put("state", company.state); h.put("city", company.city); h.put("zip", company.zip); h.put("address", company.address); return new ClassObject("flex.samples.crm.company.Company", h); } else { return defaultObjectCreator.toClassObject(o); } } public Object toObject(ClassObject co) { if ("flex.samples.crm.employee.Employee".equals(co.className)) { Employee employee = new Employee(); employee.employeeId = ((Integer) co.propertyValues.get("employeeId")).intValue(); employee.firstName = (String) co.propertyValues.get("firstName"); employee.lastName = (String) co.propertyValues.get("lastName"); employee.company = (Company) co.propertyValues.get("company"); employee.title = (String) co.propertyValues.get("title"); employee.phone = (String) co.propertyValues.get("phone"); employee.email = (String) co.propertyValues.get("email"); return employee; } else if ("flex.samples.crm.company.Company".equals(co.className)) { Company company = new Company(); company.companyId = ((Integer) co.propertyValues.get("companyId")).intValue(); company.name = (String) co.propertyValues.get("name"); company.industry = (String) co.propertyValues.get("industry"); company.state = (String) co.propertyValues.get("state"); company.city = (String) co.propertyValues.get("city"); company.zip = (String) co.propertyValues.get("zip"); company.address = (String) co.propertyValues.get("address"); return company; } else { return defaultObjectCreator.toObject(co); } } public String getClassName(Externalizable e) { if (e instanceof Money) { return "Money"; } else { return defaultObjectCreator.getClassName(e); } } public Externalizable getExternalizable(String className) { if ("Money".equals(className)) { return new Money(); } else { return defaultObjectCreator.getExternalizable(className); } } } }