/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.openejb;
import org.apache.openejb.assembler.classic.Assembler;
import org.apache.openejb.client.JNDIContext;
import org.apache.openejb.client.RemoteInitialContextFactory;
import org.apache.openejb.client.serializer.EJBDSerializer;
import org.apache.openejb.config.ConfigurationFactory;
import org.apache.openejb.config.DeploymentsResolver;
import org.apache.openejb.core.ServerFederation;
import org.apache.openejb.jee.EjbJar;
import org.apache.openejb.jee.StatelessBean;
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.server.ServiceDaemon;
import org.apache.openejb.server.ejbd.EjbServer;
import org.junit.Test;
import javax.ejb.EJBException;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.io.Serializable;
import java.util.Properties;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.core.StringStartsWith.startsWith;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
public class SerializerTest {
@Test
public void invoke() throws Exception {
invokeRemote(new Properties() {{
setProperty("serializer", MySerializer.class.getName());
}}, MySerializer.class.getName());
}
@Test
public void ensureItFailBecauseNotSerializeByDefault() throws Exception {
try {
invokeRemote(new Properties(), null);
} catch (final EJBException e) {
assertThat(e.getCause(), instanceOf(IllegalArgumentException.class));
assertThat(e.getCause().getMessage(), startsWith("Object is not serializable"));
}
}
private void invokeRemote(final Properties serverProps, final String serializer) throws Exception {
final EjbServer ejbServer = new EjbServer();
final Properties initProps = new Properties();
initProps.put(DeploymentsResolver.DEPLOYMENTS_CLASSPATH_PROPERTY, "false");
OpenEJB.init(initProps, new ServerFederation());
ejbServer.init(serverProps);
final ServiceDaemon serviceDaemon = new ServiceDaemon(ejbServer, 0, "localhost");
serviceDaemon.start();
final int port = serviceDaemon.getPort();
final Assembler assembler = SystemInstance.get().getComponent(Assembler.class);
final ConfigurationFactory config = new ConfigurationFactory();
final EjbJar ejbJar = new EjbJar();
ejbJar.addEnterpriseBean(new StatelessBean(AnEjbRemote.class));
assembler.createApplication(config.configureApplication(ejbJar));
try {
final Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, RemoteInitialContextFactory.class.getName());
props.put(Context.PROVIDER_URL, "ejbd://127.0.0.1:" + port);
if (serializer != null) {
props.put(JNDIContext.SERIALIZER, serializer);
}
final Context context = new InitialContext(props);
final AnInterfaceRemote client = AnInterfaceRemote.class.cast(context.lookup("AnEjbRemoteRemote"));
assertNotNull(client);
final OutputNotSerializable out = client.call(new InputNotSerilizable("cloud"));
assertEquals("cloud", out.name);
} finally {
serviceDaemon.stop();
OpenEJB.destroy();
}
}
@Remote
public static interface AnInterfaceRemote {
OutputNotSerializable call(InputNotSerilizable input);
}
@Stateless
public static class AnEjbRemote implements AnInterfaceRemote {
@Override
public OutputNotSerializable call(InputNotSerilizable input) {
return new OutputNotSerializable(input.rename);
}
}
public static class InputNotSerilizable {
public String rename;
public InputNotSerilizable(final String cloud) {
rename = cloud;
}
}
public static class OutputNotSerializable {
public String name;
public OutputNotSerializable(final String rename) {
name = rename;
}
}
public static class MySerializer implements EJBDSerializer {
@Override
public Serializable serialize(final Object o) {
if (InputNotSerilizable.class.isInstance(o)) {
return InputNotSerilizable.class.cast(o).rename;
}
return OutputNotSerializable.class.cast(o).name;
}
@Override
public Object deserialize(final Serializable o, final Class<?> clazz) {
final String cast = String.class.cast(o);
if (InputNotSerilizable.class.equals(clazz)) {
return new InputNotSerilizable(cast);
}
return new OutputNotSerializable(cast);
}
}
}