/**
* Copyright (c) 2006 - 2010 Smaxe Ltd (www.smaxe.com).
* All rights reserved.
*/
import com.smaxe.uv.ObjectEncoding;
import com.smaxe.uv.Responder;
import com.smaxe.uv.amf.ClassObject;
import com.smaxe.uv.amf.IObjectCreator;
import com.smaxe.uv.amf.support.ObjectCreator;
import com.smaxe.uv.amf3.ArrayCollection;
import com.smaxe.uv.client.License;
import com.smaxe.uv.remoting.ds.AmfConnection;
import com.smaxe.uv.remoting.ds.RemotingResponder;
import com.smaxe.uv.remoting.ds.messages.AbstractMessage;
import com.smaxe.uv.remoting.ds.messages.RemotingMessage;
import java.io.Externalizable;
import java.util.HashMap;
import java.util.Map;
/**
* <code>ExAmfConnection</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 ExAmfConnection 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";
Map<String, Object> configuration = new HashMap<String, Object>();
// configuration.put(AmfConnection.Configuration.USE_HTTP_URL_CONNECTION, 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);
// 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)
{
for (Object o : ((ArrayCollection) result).array)
{
System.out.println(o);
}
}
}
public void onStatus(final Map<String, Object> status)
{
System.out.println("getEmployees() status: " + status);
}
});
// 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)
{
for (Object o : ((ArrayCollection) result).array)
{
System.out.println(o);
}
}
}
public void onStatus(final Map<String, Object> 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>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)
{
ClassObject co = defaultObjectCreator.toClassObject(o);
if (o instanceof Employee)
{
co.className = "flex.samples.crm.employee.Employee";
}
else
if (o instanceof Company)
{
co.className = "flex.samples.crm.company.Company";
}
return co;
}
public Object toObject(ClassObject co)
{
if ("flex.samples.crm.employee.Employee".equals(co.className))
{
co.className = ExAmfConnection.class.getCanonicalName() + "$" + Employee.class.getSimpleName();
}
else
if ("flex.samples.crm.company.Company".equals(co.className))
{
co.className = ExAmfConnection.class.getCanonicalName() + "$" + Company.class.getSimpleName();
}
return defaultObjectCreator.toObject(co);
}
public String getClassName(Externalizable e)
{
return defaultObjectCreator.getClassName(e);
}
public Externalizable getExternalizable(String className)
{
return defaultObjectCreator.getExternalizable(className);
}
}
}