@Override public void testInheritanceClass(InheritanceClass v) throws Exception { System.getProperties().setProperty(TemplatePrecompiler.DEST, "./target/test-classes"); MessagePack msgpack = new MessagePack(); try { TemplatePrecompiler.saveTemplateClass(new TemplateRegistry(null), InheritanceClass.class); Template<InheritanceClass> tmpl = msgpack.lookup(InheritanceClass.class); BufferPacker packer = msgpack.createBufferPacker(); tmpl.write(packer, v); byte[] bytes = packer.toByteArray(); BufferUnpacker unpacker = msgpack.createBufferUnpacker(); unpacker.wrap(bytes); InheritanceClass ret = tmpl.read(unpacker, null); assertEquals(v, ret); } finally { TemplatePrecompiler.deleteTemplateClass(InheritanceClass.class); msgpack.unregister(InheritanceClass.class); } }
@Override public void testEnumTypeFieldsClassNotNullable(EnumTypeFieldsClassNotNullable v) throws Exception { MessagePack msgpack = new MessagePack(); TemplateRegistry registry = new TemplateRegistry(null); registry.register(EnumTypeFieldsClassNotNullable.SampleEnum.class, new OrdinalEnumTemplateBuilder(registry).buildTemplate(EnumTypeFieldsClassNotNullable.SampleEnum.class)); ReflectionTemplateBuilder builder = new ReflectionTemplateBuilder(registry); Template<EnumTypeFieldsClassNotNullable> tmpl = builder.buildTemplate(EnumTypeFieldsClassNotNullable.class); ByteArrayOutputStream out = new ByteArrayOutputStream(); Packer packer = msgpack.createPacker(out); tmpl.write(packer, v); byte[] bytes = out.toByteArray(); BufferUnpacker u = msgpack.createBufferUnpacker(); u.resetReadByteCount(); u.wrap(bytes); Value value = u.readValue(); Converter unpacker = new Converter(value); EnumTypeFieldsClassNotNullable ret = tmpl.read(unpacker, null); assertEquals(v, ret); assertEquals(bytes.length, u.getReadByteCount()); }
@org.junit.Ignore @Override // FIXME #MN next version public void testReferenceCycleTypeFieldsClass(ReferenceCycleTypeFieldsClass v) throws Exception { System.getProperties().setProperty(TemplatePrecompiler.DEST, "./target/test-classes"); MessagePack msgpack = new MessagePack(); try { TemplatePrecompiler.saveTemplateClass( new TemplateRegistry(null), ReferenceCycleTypeFieldsClass.class); Template<ReferenceCycleTypeFieldsClass> tmpl = msgpack.lookup(ReferenceCycleTypeFieldsClass.class); BufferPacker packer = msgpack.createBufferPacker(); tmpl.write(packer, v); byte[] bytes = packer.toByteArray(); BufferUnpacker unpacker = msgpack.createBufferUnpacker(); unpacker.wrap(bytes); ReferenceCycleTypeFieldsClass ret = tmpl.read(unpacker, null); assertEquals(v, ret); } finally { TemplatePrecompiler.deleteTemplateClass(ReferenceCycleTypeFieldsClass.class); msgpack.unregister(ReferenceCycleTypeFieldsClass.class); } }
/** * onMessage implementation. * * <p>This method has two roles: * * <ul> * <li>Works like a mail transfer agent to transfer a received request or event to {@link * org.o3project.odenos.remoteobject.RemoteObject}. * <li>Supports both synchronous and asynchronous messaging. * </ul> */ @Override public void onMessage(final String channel, byte[] message) { serial++; // Serial number for incoming messages. try { BufferUnpacker upk = msgpack.createBufferUnpacker(message); // read delivery header. byte type = upk.readByte(); final int sno = upk.readInt(); // Sequence number for outgoing request messages. final String sourceObjectId = upk.readString(); // i.e., channel RemoteObject localObject = null; Queue<Mail> mailbox = null; Mail mail = null; switch (type) { case TYPE_REQUEST: // Transaction(request): synchronous operation /* * --- request --> dispatchRequest() -------> [RemoteObject] * | * <-- response --- publishResponseAsync() <-------+ */ final Request request = upk.read(Request.class); if (log.isDebugEnabled()) { log.debug( "Request received:\n" + " MessageDispatcher: {}\n" + " sno: {}\n" + " channel: {}\n" + " method: {}\n" + " objectId: {}\n" + " sourceObjectId: {}\n" + " path: /{}/\n" + " body: {}", sourceDispatcherId, sno, channel, request.method, request.objectId, sourceObjectId, request.path, request.getBodyValue()); } // Wraps the request with Mail and deliver it to a mailbox. String to = request.objectId; mail = new Mail(serial, sno, to, sourceObjectId, this, request, null); localObject = localObjectsMap.get(to); if (localObject != null) { mailbox = localObject.getMailbox(); synchronized (mailbox) { mailbox.add(mail); if (!localObject.isRunning()) { localObject.setRunning(true); // Assigns a thread to read a mail in the mailbox. actor.read(localObject); } } } break; case TYPE_RESPONSE: // Transaction(response): synchronous operation /* * publishRequestAsync() * requestSync() -> [RemoteTransaction] ---- request -----> [RemoteObject] * <-- ^ | * | publishResponseAsync() * | | * +- signalResponse() <-- response --+ */ Response response = upk.read(Response.class); if (log.isDebugEnabled()) { log.debug( "Response received:\n" + " MessageDispatcher: {}\n" + " channel: {}\n" + " statusCode: {}\n" + " body: {}", sourceDispatcherId, channel, response.statusCode, response.getBodyValue()); } remoteTransactions.signalResponse(sno, response); break; case TYPE_EVENT: // Asynchronous /* * publishEventAsync() -- event --> dispatchEvent() --> [RemoteObject] * : * [EventSubscriptionMap] */ final Event event = upk.read(Event.class); if (log.isDebugEnabled()) { log.debug( "Event received:\n" + " MessageDispatcher: {}\n" + " channel: {}\n" + " body: {}", sourceDispatcherId, channel, event.getBodyValue()); } // All the subscribers of the channel final Collection<String> subscribers = subscribersMap.getSubscribers(channel); if (subscribers == null) { // No subscribers found on the channel if (log.isDebugEnabled()) { log.debug("no subscribers subscribing the channel: {}", channel); } return; // Silently discards the event } // Wraps the event with Mail and deliver it to a mailbox. for (String subscriber : subscribers) { localObject = localObjectsMap.get(subscriber); if (localObject != null) { mail = new Mail(serial, sno, subscriber, channel, this, null, event); mailbox = localObject.getMailbox(); synchronized (mailbox) { mailbox.add(mail); if (!localObject.isRunning()) { localObject.setRunning(true); // Assigns a thread to read a mail in the mailbox. actor.read(localObject); } } } } break; default: break; } } catch (Exception e) { log.error("onMessage failed", e); } }