} else {
String jndiName = "openejb/Deployment/" + JndiBuilder.format(referenceInfo.ejbDeploymentId, referenceInfo.interfaceClassName, referenceInfo.localbean ? InterfaceType.LOCALBEAN : InterfaceType.BUSINESS_REMOTE);
if (useCrossClassLoaderRef && referenceInfo.externalReference) {
reference = new CrossClassLoaderJndiReference(jndiName);
} else {
reference = new IntraVmJndiReference(jndiName);
}
}
bindings.put(normalize(referenceInfo.referenceName), reference);
}
for (EjbReferenceInfo referenceInfo : jndiEnc.ejbLocalReferences) {
Reference reference;
if (referenceInfo.location != null) {
reference = buildReferenceLocation(referenceInfo.location);
} else if (referenceInfo.ejbDeploymentId == null) {
reference = new LazyEjbReference(new Ref(referenceInfo), moduleUri, false);
} else {
String jndiName = "openejb/Deployment/" + JndiBuilder.format(referenceInfo.ejbDeploymentId, referenceInfo.interfaceClassName, referenceInfo.localbean ? InterfaceType.LOCALBEAN : InterfaceType.BUSINESS_LOCAL);
reference = new IntraVmJndiReference(jndiName);
}
bindings.put(normalize(referenceInfo.referenceName), reference);
}
for (EnvEntryInfo entry : jndiEnc.envEntries) {
if (entry.location != null) {
Reference reference = buildReferenceLocation(entry.location);
bindings.put(normalize(entry.referenceName), reference);
continue;
}
//It is possible that the value and location are both null, as it is allowed to use @Resource(name="java:global/env/abc") with no value is specified in DD
if (entry.value == null) {
continue;
}
try {
Class type = Classes.deprimitivize(getType(entry.type, entry));
Object obj;
if (type == String.class)
obj = new String(entry.value);
else if (type == Double.class) {
obj = new Double(entry.value);
} else if (type == Integer.class) {
obj = new Integer(entry.value);
} else if (type == Long.class) {
obj = new Long(entry.value);
} else if (type == Float.class) {
obj = new Float(entry.value);
} else if (type == Short.class) {
obj = new Short(entry.value);
} else if (type == Boolean.class) {
obj = new Boolean(entry.value);
} else if (type == Byte.class) {
obj = new Byte(entry.value);
} else if (type == Character.class) {
StringBuilder sb = new StringBuilder(entry.value + " ");
obj = new Character(sb.charAt(0));
} else if (type == URL.class) {
obj = new URL(entry.value);
} else if (type == Class.class) {
obj = new ClassReference(entry.value.trim());
} else if (type.isEnum()) {
obj = Enum.valueOf(type, entry.value.trim());
} else {
throw new IllegalArgumentException("Invalid env-entry-type " + type);
}
bindings.put(normalize(entry.referenceName), obj);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("The env-entry-value for entry " + entry.referenceName + " was not recognizable as type " + entry.type + ". Received Message: " + e.getLocalizedMessage(), e);
} catch (MalformedURLException e) {
throw new IllegalArgumentException("URL for reference " + entry.referenceName + " was not a valid URL: " + entry.value, e);
}
}
for (ResourceReferenceInfo referenceInfo : jndiEnc.resourceRefs) {
if (referenceInfo.location != null) {
Reference reference = buildReferenceLocation(referenceInfo.location);
bindings.put(normalize(referenceInfo.referenceName), reference);
continue;
}
Class<?> type = getType(referenceInfo.referenceType, referenceInfo);
Object reference;
if (URL.class.equals(type)) {
reference = new URLReference(referenceInfo.resourceID);
} else if (type.isAnnotationPresent(ManagedBean.class)) {
ManagedBean managed = type.getAnnotation(ManagedBean.class);
String name = managed.value().length() == 0 ? type.getSimpleName() : managed.value();
reference = new LinkRef("module/" + name);
} else if (Request.class.equals(type)) {
reference = new ObjectReference(ThreadLocalContextManager.REQUEST);
} else if (UriInfo.class.equals(type)) {
reference = new ObjectReference(ThreadLocalContextManager.URI_INFO);
} else if (HttpHeaders.class.equals(type)) {
reference = new ObjectReference(ThreadLocalContextManager.HTTP_HEADERS);
} else if (SecurityContext.class.equals(type)) {
reference = new ObjectReference(ThreadLocalContextManager.SECURITY_CONTEXT);
} else if (ContextResolver.class.equals(type)) {
reference = new ObjectReference(ThreadLocalContextManager.CONTEXT_RESOLVER);
} else if (referenceInfo.resourceID != null) {
String jndiName = "openejb/Resource/" + referenceInfo.resourceID;
reference = new IntraVmJndiReference(jndiName);
} else {
String jndiName = "openejb/Resource/" + referenceInfo.referenceName;
reference = new IntraVmJndiReference(jndiName);
}
bindings.put(normalize(referenceInfo.referenceName), reference);
}
for (ResourceEnvReferenceInfo referenceInfo : jndiEnc.resourceEnvRefs) {
if (referenceInfo.location != null) {
Reference reference = buildReferenceLocation(referenceInfo.location);
bindings.put(normalize(referenceInfo.referenceName), reference);
continue;
}
final Class<?> type = getType(referenceInfo.resourceEnvRefType, referenceInfo);
final Object reference;
if (EJBContext.class.isAssignableFrom(type)) {
String jndiName = "comp/EJBContext";
reference = new LinkRef(jndiName);
// Let the container bind this into JNDI
if (jndiName.equals(referenceInfo.referenceName)) continue;
} else if (Validator.class.equals(type)) {
String jndiName = "comp/Validator";
reference = new LinkRef(jndiName);
} else if (ValidatorFactory.class.equals(type)) {
String jndiName = "comp/ValidatorFactory";
reference = new LinkRef(jndiName);
} else if (WebServiceContext.class.equals(type)) {
String jndiName = "comp/WebServiceContext";
reference = new LinkRef(jndiName);
} else if (TimerService.class.equals(type)) {
String jndiName = "comp/TimerService";
reference = new LinkRef(jndiName);
// TODO Bind the BeanManager
} else if (BeanManager.class.equals(type)) {
String jndiName = "java:app/BeanManager";
reference = new LinkRef(jndiName);
} else if (UserTransaction.class.equals(type)) {
reference = new IntraVmJndiReference("comp/UserTransaction");
} else if (referenceInfo.resourceID != null) {
String jndiName = "openejb/Resource/" + referenceInfo.resourceID;
reference = new IntraVmJndiReference(jndiName);
} else {
String jndiName = "openejb/Resource/" + referenceInfo.referenceName;
reference = new IntraVmJndiReference(jndiName);
}
bindings.put(normalize(referenceInfo.referenceName), reference);
}
for (PersistenceUnitReferenceInfo referenceInfo : jndiEnc.persistenceUnitRefs) {
if (referenceInfo.location != null) {
Reference reference = buildReferenceLocation(referenceInfo.location);
bindings.put(normalize(referenceInfo.referenceName), reference);
continue;
}
String jndiName = PersistenceBuilder.getOpenEJBJndiName(referenceInfo.unitId);
Reference reference = new IntraVmJndiReference(jndiName);
bindings.put(normalize(referenceInfo.referenceName), reference);
}
for (PersistenceContextReferenceInfo contextInfo : jndiEnc.persistenceContextRefs) {
if (contextInfo.location != null) {
Reference reference = buildReferenceLocation(contextInfo.location);
bindings.put(normalize(contextInfo.referenceName), reference);
continue;
}
Context context = SystemInstance.get().getComponent(ContainerSystem.class).getJNDIContext();
EntityManagerFactory factory;
try {
String jndiName = PersistenceBuilder.getOpenEJBJndiName(contextInfo.unitId);
factory = (EntityManagerFactory) context.lookup(jndiName);
} catch (NamingException e) {
throw new OpenEJBException("PersistenceUnit '" + contextInfo.unitId + "' not found for EXTENDED ref '" + contextInfo.referenceName + "'");
}
JtaEntityManager jtaEntityManager = new JtaEntityManager(contextInfo.persistenceUnitName, jtaEntityManagerRegistry, factory, contextInfo.properties, contextInfo.extended);
Reference reference = new PersistenceContextReference(jtaEntityManager);
bindings.put(normalize(contextInfo.referenceName), reference);
}
for (ServiceReferenceInfo referenceInfo : jndiEnc.serviceRefs) {
if (referenceInfo.location != null) {
Reference reference = buildReferenceLocation(referenceInfo.location);
bindings.put(normalize(referenceInfo.referenceName), reference);
continue;
}
// load service class which is used to construct the port
Class<? extends Service> serviceClass = Service.class;
if (referenceInfo.serviceType != null) {
try {
serviceClass = classLoader.loadClass(referenceInfo.serviceType).asSubclass(Service.class);
} catch (Exception e) {
throw new OpenEJBException("Could not load service type class " + referenceInfo.serviceType, e);
}
}
// load the reference class which is the ultimate type of the port
Class<?> referenceClass = null;
if (referenceInfo.referenceType != null) {
try {
referenceClass = classLoader.loadClass(referenceInfo.referenceType);
} catch (Exception e) {
throw new OpenEJBException("Could not load reference type class " + referenceInfo.referenceType, e);
}
}
// if ref class is a subclass of Service, use it for the service class
if (referenceClass != null && Service.class.isAssignableFrom(referenceClass)) {
serviceClass = referenceClass.asSubclass(Service.class);
}
// determine the location of the wsdl file
URL wsdlUrl = null;
if (referenceInfo.wsdlFile != null) {
try {
wsdlUrl = new URL(referenceInfo.wsdlFile);
} catch (MalformedURLException e) {
wsdlUrl = classLoader.getResource(referenceInfo.wsdlFile);
if (wsdlUrl == null) {
logger.warning("Error obtaining WSDL: " + referenceInfo.wsdlFile, e);
}
}
}
// port refs
List<PortRefData> portRefs = new ArrayList<PortRefData>(referenceInfo.portRefs.size());
for (PortRefInfo portRefInfo : referenceInfo.portRefs) {
PortRefData portRef = new PortRefData();
portRef.setQName(portRefInfo.qname);
portRef.setServiceEndpointInterface(portRefInfo.serviceEndpointInterface);
portRef.setEnableMtom(portRefInfo.enableMtom);
portRef.getProperties().putAll(portRefInfo.properties);
portRefs.add(portRef);
}
// create the handle chains
List<HandlerChainData> handlerChains = null;
if (!referenceInfo.handlerChains.isEmpty()) {
handlerChains = WsBuilder.toHandlerChainData(referenceInfo.handlerChains, classLoader);
}
if (!client) {
Reference reference = new JaxWsServiceReference(referenceInfo.id,
referenceInfo.serviceQName,
serviceClass, referenceInfo.portQName,
referenceClass,
wsdlUrl,
portRefs,
handlerChains,
injections);
bindings.put(normalize(referenceInfo.referenceName), reference);
} else {
ServiceRefData serviceRefData = new ServiceRefData(referenceInfo.id,
referenceInfo.serviceQName,
serviceClass, referenceInfo.portQName,
referenceClass,
wsdlUrl,
handlerChains,
portRefs);
bindings.put(normalize(referenceInfo.referenceName), serviceRefData);
}
}
OpenEjbConfiguration config = SystemInstance.get().getComponent(OpenEjbConfiguration.class);
if (config != null) {
for (ResourceInfo resource : config.facilities.resources) {
String jndiName = resource.jndiName;
if (jndiName != null && !jndiName.isEmpty()) {
String refName = "openejb/Resource/" + resource.id;
Object reference = new IntraVmJndiReference(refName);
String boundName = normalize(jndiName);
bindings.put(boundName, reference);
}
}