/*
* Copyright 2014 Red Hat, Inc. and/or its affiliates.
*
* Licensed 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.jbpm.services.ejb.client.impl;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.jbpm.services.ejb.api.DefinitionServiceEJBRemote;
import org.jbpm.services.ejb.api.DeploymentServiceEJBRemote;
import org.jbpm.services.ejb.api.ProcessServiceEJBRemote;
import org.jbpm.services.ejb.api.RuntimeDataServiceEJBRemote;
import org.jbpm.services.ejb.api.UserTaskServiceEJBRemote;
import org.jbpm.services.ejb.api.admin.ProcessInstanceMigrationServiceEJBRemote;
import org.jbpm.services.ejb.api.query.QueryServiceEJBRemote;
import org.jbpm.services.ejb.client.ClientServiceFactory;
/**
* JBoss specific (AS 7 / EAP6 / WildFly 8) implementation of <code>ClientServiceFactory</code>
* that is responsible for remote EJB look up.
*
*/
public class JBossEJBClientServiceFactory implements ClientServiceFactory {
private static final String NAME = "JBoss";
private Map<Class<?>, String> beansMappedNames = new HashMap<Class<?>, String>();
public JBossEJBClientServiceFactory() {
beansMappedNames.put(ProcessServiceEJBRemote.class, "ProcessServiceEJBImpl!org.jbpm.services.ejb.api.ProcessServiceEJBRemote");
beansMappedNames.put(DeploymentServiceEJBRemote.class, "DeploymentServiceEJBImpl!org.jbpm.services.ejb.api.DeploymentServiceEJBRemote");
beansMappedNames.put(DefinitionServiceEJBRemote.class, "DefinitionServiceEJBImpl!org.jbpm.services.ejb.api.DefinitionServiceEJBRemote");
beansMappedNames.put(RuntimeDataServiceEJBRemote.class, "RuntimeDataServiceEJBImpl!org.jbpm.services.ejb.api.RuntimeDataServiceEJBRemote");
beansMappedNames.put(UserTaskServiceEJBRemote.class, "UserTaskServiceEJBImpl!org.jbpm.services.ejb.api.UserTaskServiceEJBRemote");
beansMappedNames.put(QueryServiceEJBRemote.class, "QueryServiceEJBImpl!org.jbpm.services.ejb.api.query.QueryServiceEJBRemote");
beansMappedNames.put(ProcessInstanceMigrationServiceEJBRemote.class, "ProcessInstanceMigrationServiceEJBImpl!org.jbpm.services.ejb.api.admin.ProcessInstanceMigrationServiceEJBRemote");
}
@SuppressWarnings("unchecked")
public <T> T getService(String application, Class<T> serviceInterface) throws NamingException {
final Hashtable<String, String> jndiProperties = new Hashtable<String, String>();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
final Context context = new InitialContext(jndiProperties);
String mappedName = beansMappedNames.get(serviceInterface);
if (mappedName == null) {
throw new IllegalArgumentException("Unknown service interface " + serviceInterface.getName());
}
String jndi = "ejb:/" + application + "/" + mappedName;
T bean = (T) context.lookup(jndi);
return bean;
}
@Override
public String getName() {
return NAME;
}
}