package ${package}; import java.io.DataOutputStream; import java.io.Serializable; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.*; import javax.naming.NamingException; import javax.slee.Address; import javax.slee.AddressPlan; import javax.slee.UnrecognizedActivityException; import javax.slee.UnrecognizedEventException; import javax.slee.facilities.FacilityException; import javax.slee.resource.ActivityIsEndingException; import javax.slee.resource.ResourceAdaptorTypeID; import javax.slee.resource.ResourceException; import javax.slee.resource.ResourceAdaptor; import javax.slee.resource.BootstrapContext; import javax.slee.resource.SleeEndpoint; import javax.slee.facilities.EventLookupFacility; import javax.slee.resource.ActivityHandle; import javax.slee.resource.FailureReason; import javax.slee.resource.Marshaler; import org.apache.log4j.Logger; import org.mobicents.slee.container.SleeContainer; import org.mobicents.slee.resource.ResourceAdaptorActivityContextInterfaceFactory; import org.mobicents.slee.resource.ResourceAdaptorEntity; import java.net.Socket; import java.net.ServerSocket; import com.opencloud.sleetck.lib.resource.events.TCKResourceEventX; import com.opencloud.sleetck.lib.resource.impl.TCKResourceEventImpl; import EDU.oswego.cs.dl.util.concurrent.ConcurrentHashMap; import EDU.oswego.cs.dl.util.concurrent.ConcurrentReaderHashMap; import org.mobicents.slee.runtime.ActivityContextFactory; import org.mobicents.slee.runtime.ActivityContextInterfaceImpl; import org.mobicents.slee.runtime.DeferredEvent; import org.mobicents.slee.runtime.SleeInternalEndpoint; import org.mobicents.slee.runtime.transaction.SleeTransactionManager; import org.mobicents.slee.container.SleeContainer; import org.mobicents.slee.container.component.ComponentKey; import org.mobicents.slee.resource.ResourceAdaptorActivityContextInterfaceFactory; import org.mobicents.slee.resource.ResourceAdaptorEntity; import org.mobicents.slee.resource.ResourceAdaptorState; import javax.slee.EventTypeID; import javax.slee.FactoryException; import javax.slee.InvalidStateException; import javax.slee.SLEEException; import javax.slee.TransactionRequiredLocalException; import javax.slee.UnrecognizedActivityException; import javax.slee.UnrecognizedEventException; import javax.slee.facilities.EventLookupFacility; import javax.slee.facilities.FacilityException; import javax.slee.management.SleeState; import javax.slee.nullactivity.NullActivity; import javax.slee.nullactivity.NullActivityContextInterfaceFactory; import javax.slee.nullactivity.NullActivityFactory; import javax.slee.resource.ActivityHandle; import javax.slee.resource.ActivityHandle; import javax.slee.*; import javax.transaction.SystemException; public class DummyResourceAdaptor implements ResourceAdaptor, Serializable { private Byte byteProperty; private Boolean booleanProperty; private Integer intProperty; private Long longProperty; private Short shortProperty; private Float floatProperty; private Double doubleProperty; private String stringProperty; private Date dateProperty; private ServerSocket serverSocket; private static Logger log=Logger.getLogger(DummyResourceAdaptor.class); // STUFF FOR TCK EVENTS, WHICH WILL BE FIRED TO TEST RA AND CONTAINER public static final String TCK_EVENT_NAME = "com.opencloud.sleetck.lib.resource.events.TCKResourceEventX.X"; public static final String TCK_VENDOR = "jain.slee.tck"; public static final String TCK_VERSION = "1.0"; public static final ComponentKey TckX1Key = new ComponentKey( TCK_EVENT_NAME + 1, TCK_VENDOR, TCK_VERSION); public static final ComponentKey TckX2Key = new ComponentKey( TCK_EVENT_NAME + 2, TCK_VENDOR, TCK_VERSION); public static final ComponentKey TckX3Key = new ComponentKey( TCK_EVENT_NAME + 3, TCK_VENDOR, TCK_VERSION); private static ActivityContextInterface nullAci = null; private transient EventLookupFacility eventLookup; //EVENT FILTERING PART private Map eventIDsOfServicesInstalled = new ConcurrentHashMap(31); private Map myComponentKeys = new ConcurrentHashMap(31); private Map eventResourceOptionsOfServicesInstalled = new ConcurrentHashMap( 31); private ActivityContextFactory activityContextFactory; private transient SleeTransactionManager tm = null; private ComponentKey raTypeKey = null; private ComponentKey raKey = null; private static SleeInternalEndpoint sleeInternalEndpoint = SleeContainer .lookupFromJndi().getSleeEndpoint(); private transient SleeContainer serviceContainer; private transient BootstrapContext bootstrapContext; /** Creates a new instance of DummyResourceAdaptor */ public DummyResourceAdaptor() { } public Byte getByteProperty() { return byteProperty; } public void setByteProperty(Byte byteProperty) { this.byteProperty = byteProperty; } public Boolean getBooleanProperty() { return booleanProperty; } public void setBooleanProperty(Boolean booleanProperty) { this.booleanProperty = booleanProperty; } public Integer getIntProperty() { return intProperty; } public void setIntProperty(Integer intProperty) { this.intProperty = intProperty; } public Short getShortProperty() { return shortProperty; } public void setShortProperty(Short shortProperty) { this.shortProperty = shortProperty; } public Long getLongProperty() { return longProperty; } public void setLongProperty(Long longProperty) { this.longProperty = longProperty; } public Float getFloatProperty() { return floatProperty; } public void setFloatProperty(Float floatProperty) { this.floatProperty = floatProperty; } public Double getDoubleProperty() { return doubleProperty; } public void setDoubleProperty(Double doubleProperty) { this.doubleProperty = doubleProperty; } public String getStringProperty() { return stringProperty; } public void setStringProperty(String stringProperty) { this.stringProperty = stringProperty; } public Date getDateProperty() { return dateProperty; } public void setDateProperty(Date dateProperty) { this.dateProperty = dateProperty; } public void entityCreated(BootstrapContext bootstrapContext) throws ResourceException { log.info(" === +++ ==="); new Thread(new TestReporter()).start(); this.eventLookup = bootstrapContext.getEventLookupFacility(); this.bootstrapContext = bootstrapContext; SleeContainer container = SleeContainer.lookupFromJndi(); serviceContainer = container; } public void entityRemoved() { } public void entityActivated() throws ResourceException { log.info("___ === ___"); try { ResourceAdaptorEntity resourceAdaptorEntity = ((ResourceAdaptorEntity) serviceContainer .getResourceAdaptorEnitity(this.bootstrapContext .getEntityName())); log.info("___ = 1 = ___"); // TCK LIKE TEST raTypeKey = resourceAdaptorEntity.getInstalledResourceAdaptor() .getRaType().getResourceAdaptorTypeID().getComponentKey(); raKey = resourceAdaptorEntity.getInstalledResourceAdaptor() .getKey().getComponentKey(); log.info("___ = 2 = ___"); SleeContainer container = SleeContainer.lookupFromJndi(); serviceContainer = container; activityContextFactory = serviceContainer.getActivityContextFactory(); tm = serviceContainer.getTransactionManager(); ResourceAdaptorTypeID raTypeId = resourceAdaptorEntity .getInstalledResourceAdaptor().getRaType() .getResourceAdaptorTypeID(); log.info("___ = 3 = ___"); DummyActivityContextInterfaceFactoryImpl acif=new DummyActivityContextInterfaceFactoryImpl(container,this.bootstrapContext.getEntityName()); resourceAdaptorEntity.getServiceContainer() .getActivityContextInterfaceFactories() .put(raTypeId, acif); String entityName = this.bootstrapContext.getEntityName(); log.info("___ = 4 = ___"); try { if (acif != null) { String jndiName = ((ResourceAdaptorActivityContextInterfaceFactory) acif) .getJndiName(); int begind = jndiName.indexOf(':'); int toind = jndiName.lastIndexOf('/'); String prefix = jndiName.substring(begind + 1, toind); String name = jndiName.substring(toind + 1); log .debug("jndiName prefix =" + prefix + "; jndiName = " + name); log.info("___ = 5 = ___"); SleeContainer.registerWithJndi(prefix, name, acif); } }catch(Exception e) { e.printStackTrace(); } log.info("___ = 6 = ___"); } catch (Exception ex) { throw new ResourceException(ex.getMessage()); } } public void entityDeactivating() { try { serverSocket.close(); } catch (Exception e) { } } public void entityDeactivated() { } public void eventProcessingSuccessful(ActivityHandle activityHandle, Object object, int i, Address address, int i0) { } public void eventProcessingFailed(ActivityHandle activityHandle, Object object, int i, Address address, int i0, FailureReason failureReason) { } public void activityEnded(ActivityHandle activityHandle) { } public void activityUnreferenced(ActivityHandle activityHandle) { } public void queryLiveness(ActivityHandle activityHandle) { } public Object getActivity(ActivityHandle handle) { return ((DummyActivityHandle) handle).getActivity(); } public ActivityHandle getActivityHandle(Object object) { return new DummyActivityHandle("unknown"); } public Object getSBBResourceAdaptorInterface(String string) { return this; } public Marshaler getMarshaler() { return null; } public void serviceInstalled(String serviceID, int[] eventIDs, String[] resourceOptions) { log.info("------------------- serviceInstalled"); fireX1(serviceID, eventIDs, resourceOptions); // STORE SOME INFORMATION FOR LATER log.info("------------------- fired"); eventIDsOfServicesInstalled.put(serviceID, eventIDs); eventResourceOptionsOfServicesInstalled.put(serviceID, resourceOptions); } public void serviceUninstalled(String serviceID) { eventIDsOfServicesInstalled.remove(serviceID); eventResourceOptionsOfServicesInstalled.remove(serviceID); } public void serviceActivated(String string) { } public void serviceDeactivated(String string) { } private class TestReporter implements Runnable { public void run() { try { serverSocket = new ServerSocket(9201); Socket socket = serverSocket.accept(); DataOutputStream in = new DataOutputStream(socket.getOutputStream()); in.writeBoolean(booleanProperty.booleanValue()); in.writeByte(byteProperty.byteValue()); in.writeDouble(doubleProperty.doubleValue()); in.writeFloat(floatProperty.floatValue()); in.writeInt(intProperty.intValue()); in.writeLong(longProperty.longValue()); in.writeShort(shortProperty.shortValue()); in.writeUTF(stringProperty); } catch (IOException e) { e.printStackTrace(); } } } private void fireX1(String serviceID, int[] eventIDs, String[] resourceOptions) { SleeTransactionManager tm = SleeContainer.lookupFromJndi().getTransactionManager(); boolean newTx = tm.requireTransaction(); boolean rb = true; try { Object[] message = makeMessage(serviceID, eventIDs, resourceOptions); EventTypeID eventTypeID = SleeContainer.lookupFromJndi().getEventType( TckX1Key); TCKResourceEventX event1 = new TCKResourceEventImpl(12, TCKResourceEventX.X1, message, null); if (nullAci == null) { // check container state is not stopping if (SleeContainer.lookupFromJndi().getSleeState().equals(SleeState.STOPPING)) { return; } nullAci = retrieveNullActivityContext(); } new DeferredEvent(eventTypeID, event1, ((ActivityContextInterfaceImpl)nullAci).getActivityContext(), null); log.info("==== FIRED ===="); rb = false; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if (newTx) { if (rb) { tm.rollback(); } else { tm.commit(); } } else { if (rb) { tm.setRollbackOnly(); } } } catch (SystemException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private void fireX2(String serviceID, int[] eventIDs, String[] resourceOptions) { SleeTransactionManager tm = SleeContainer.lookupFromJndi().getTransactionManager(); boolean newTx = tm.requireTransaction(); boolean rb = true; try { Object[] message = makeMessage(serviceID, eventIDs, resourceOptions); EventTypeID eventTypeID = SleeContainer.lookupFromJndi().getEventType( TckX2Key); TCKResourceEventX event1 = new TCKResourceEventImpl(12, TCKResourceEventX.X2, message, null); if (nullAci == null) { // check container state is not stopping if (SleeContainer.lookupFromJndi().getSleeState().equals(SleeState.STOPPING)) { return; } nullAci = retrieveNullActivityContext(); } sleeInternalEndpoint.enqueueEvent(new DeferredEvent(eventTypeID, event1, ((ActivityContextInterfaceImpl)nullAci).getActivityContext(), null)); rb = false; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if (newTx) { if (rb) { tm.rollback(); } else { tm.commit(); } } else { if (rb) { tm.setRollbackOnly(); } } } catch (SystemException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private void fireX3(String serviceID, int[] eventIDs, String[] resourceOptions) { SleeTransactionManager tm = SleeContainer.lookupFromJndi().getTransactionManager(); boolean newTx = tm.requireTransaction(); boolean rb = true; try { Object[] message = makeMessage(serviceID, eventIDs, resourceOptions); EventTypeID eventTypeID = SleeContainer.lookupFromJndi().getEventType( TckX3Key); TCKResourceEventX event1 = new TCKResourceEventImpl(12, TCKResourceEventX.X3, message, null); if (nullAci == null) { // check container state is not stopping if (SleeContainer.lookupFromJndi().getSleeState().equals(SleeState.STOPPING)) { return; } nullAci = retrieveNullActivityContext(); } sleeInternalEndpoint.enqueueEvent(new DeferredEvent(eventTypeID, event1, ((ActivityContextInterfaceImpl)nullAci).getActivityContext(), null)); rb = false; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if (newTx) { if (rb) { tm.rollback(); } else { tm.commit(); } } else { if (rb) { tm.setRollbackOnly(); } } } catch (SystemException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * Encapsulates JNDI lookups for creation of nullActivityContextInterface. * * @return New NullActivityContextInterface. */ protected static ActivityContextInterface retrieveNullActivityContext() { ActivityContextInterface localACI = null; NullActivityFactory nullACFactory = null; NullActivityContextInterfaceFactory nullActivityContextFactory = null; SleeContainer cotainer = SleeContainer.lookupFromJndi(); nullACFactory = cotainer.getNullActivityFactory(); NullActivity na = nullACFactory.createNullActivity(); nullActivityContextFactory = cotainer .getNullActivityContextInterfaceFactory(); try { localACI = nullActivityContextFactory .getActivityContextInterface(na); } catch (TransactionRequiredLocalException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FactoryException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NullPointerException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnrecognizedActivityException e) { // TODO Auto-generated catch block e.printStackTrace(); } return localACI; } private Object[] makeMessage(String serviceID, int[] eventIDs, String[] resourceOptions) { Object message[] = new Object[7]; String[] options = new String[resourceOptions.length]; int[] ids = new int[eventIDs.length]; for (int i = 0; i < ids.length; i++) { options[i] = resourceOptions[i]; ids[i] = eventIDs[i]; String tmp[]=null; try { tmp = eventLookup.getEventType(eventIDs[i]); } catch (FacilityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnrecognizedEventException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(tmp==null) {} else { } } message[0] = serviceID; message[1] = ids; message[2] = options; HashMap componentKeysToServiceIDs = new HashMap(); Iterator it = myComponentKeys.keySet().iterator(); while (it.hasNext()) { Object key = it.next(); componentKeysToServiceIDs.put(key, new HashSet( (Set) myComponentKeys.get(key))); } message[3] = raTypeKey; message[4] = raKey; message[5] = componentKeysToServiceIDs; message[6] = null; return message; } }