/*
* JBoss, Home of Professional Open Source
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.ejb3.client;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Collection;
import java.util.Map;
import javax.ejb.EJBContext;
import javax.ejb.EJBException;
import javax.transaction.UserTransaction;
import org.jboss.injection.EJBContextPropertyInjector;
import org.jboss.injection.InjectionContainer;
import org.jboss.injection.InjectionHandler;
import org.jboss.injection.Injector;
import org.jboss.injection.InjectorFactory;
import org.jboss.injection.UserTransactionPropertyInjector;
import org.jboss.injection.lang.reflect.BeanProperty;
import org.jboss.injection.lang.reflect.BeanPropertyFactory;
import org.jboss.logging.Logger;
import org.jboss.metadata.javaee.spec.EnvironmentEntryMetaData;
import org.jboss.metadata.javaee.spec.MessageDestinationReferenceMetaData;
import org.jboss.metadata.javaee.spec.RemoteEnvironment;
import org.jboss.metadata.javaee.spec.ResourceEnvironmentReferenceMetaData;
import org.jboss.metadata.javaee.spec.ResourceReferenceMetaData;
import org.omg.CORBA.ORB;
/**
* Handler for @Resources on the client
*
* @author <a href="mailto:bill@jboss.org">Bill Burke</a>
* @author Scott.Stark@jboss.org
* @version $Revision: 85945 $
*/
public class ClientResourceHandler<X extends RemoteEnvironment>
implements InjectionHandler<X>
{
private static final Logger log = Logger.getLogger(ClientResourceHandler.class);
private Class<?> clientClass;
public ClientResourceHandler(Class<?> clientClass)
{
this.clientClass = clientClass;
}
private void loadEnvEntry(InjectionContainer container, Collection<EnvironmentEntryMetaData> envEntries)
{
for (EnvironmentEntryMetaData envEntry : envEntries)
{
String encName = "env/" + envEntry.getEnvEntryName();
// 16.4.1.3: If the env-entry-value is not specified, no value will be injected and it
// will not be initialized into the naming context.
if(envEntry.getValue() == null)
{
log.debug("ignoring env-entry " + envEntry);
continue;
}
Utils.injectionTarget(encName, envEntry, container);
}
}
private void loadXmlResourceRefs(InjectionContainer container, Collection<ResourceReferenceMetaData> refs)
{
for (ResourceReferenceMetaData envRef : refs)
{
String encName = "env/" + envRef.getResourceRefName();
if (envRef.getMappedName() == null || envRef.getMappedName().equals(""))
{
// Handle known injection types
if (envRef.getResUrl() != null)
{
try
{
URL resURL = new URL(envRef.getResUrl().trim());
URLInjectorFactory factory = new URLInjectorFactory(resURL);
Utils.createInjectors(container.getInjectors(), container.getClassloader(), factory, envRef.getInjectionTargets());
continue;
}
catch (MalformedURLException e)
{
throw new RuntimeException(e);
}
}
else if (UserTransaction.class.getName().equals(envRef.getType()))
{
final InjectionContainer ic = container;
InjectorFactory<?> factory = new InjectorFactory<UserTransactionPropertyInjector>()
{
public UserTransactionPropertyInjector create(BeanProperty property)
{
return new UserTransactionPropertyInjector(property, ic);
}
};
Utils.createInjectors(container.getInjectors(), container.getClassloader(), factory, envRef.getInjectionTargets());
continue;
}
else if (ORB.class.getName().equals(envRef.getType()))
{
encName = "java:comp/ORB";
}
else
{
throw new RuntimeException("mapped-name is required for " + envRef.getResourceRefName() + " of deployment " + container.getIdentifier());
}
}
Utils.injectionTarget(encName, envRef, container);
}
}
private static void loadXmlResourceEnvRefs(InjectionContainer container, Collection<ResourceEnvironmentReferenceMetaData> refs)
{
for (ResourceEnvironmentReferenceMetaData envRef : refs)
{
// EJBTHREE-712
String resTypeName = envRef.getType();
String mappedName = envRef.getMappedName();
try
{
if(resTypeName != null)
{
Class<?> resType = Class.forName(resTypeName);
if (resType.equals(UserTransaction.class))
{
final InjectionContainer ic = container;
InjectorFactory<?> factory = new InjectorFactory<UserTransactionPropertyInjector>()
{
public UserTransactionPropertyInjector create(BeanProperty property)
{
return new UserTransactionPropertyInjector(property, ic);
}
};
if(envRef.getInjectionTargets() != null)
{
Utils.createInjectors(container.getInjectors(), container.getClassloader(), factory, envRef.getInjectionTargets());
continue;
}
else
{
mappedName = "java:comp/UserTransaction";
}
}
else if (resType.equals(ORB.class))
{
mappedName = "java:comp/ORB";
}
}
}
catch(ClassNotFoundException e)
{
throw new EJBException(e);
}
String encName = "env/" + envRef.getResourceEnvRefName();
if (mappedName == null || mappedName.equals(""))
{
throw new RuntimeException("mapped-name is required for " + envRef.getResourceEnvRefName() + " of deployment " + container.getIdentifier());
}
Utils.injectionTarget(encName, envRef, container);
}
}
private static void loadXmlMessageDestinationRefs(InjectionContainer container, Collection<MessageDestinationReferenceMetaData> refs)
{
for (MessageDestinationReferenceMetaData envRef : refs)
{
String encName = "env/" + envRef.getMessageDestinationRefName();
String jndiName = envRef.getMappedName();
if (jndiName == null || jndiName.equals(""))
{
// Look for a message-destination-link
jndiName = envRef.getResolvedJndiName();
if (jndiName == null)
throw new RuntimeException("message-destination has no jndi-name/resolved-jndi-name " + envRef);
}
Utils.injectionTarget(encName, envRef, container);
}
}
public void loadXml(X xml, InjectionContainer container)
{
if (xml == null)
return;
if (xml.getMessageDestinationReferences() != null)
loadXmlMessageDestinationRefs(container, xml.getMessageDestinationReferences());
if (xml.getResourceEnvironmentReferences() != null)
loadXmlResourceEnvRefs(container, xml.getResourceEnvironmentReferences());
if (xml.getResourceReferences() != null)
loadXmlResourceRefs(container, xml.getResourceReferences());
if (xml.getEnvironmentEntries() != null)
loadEnvEntry(container, xml.getEnvironmentEntries());
}
public void handleClassAnnotations(Class<?> clazz, InjectionContainer container)
{
throw new IllegalStateException("Annotations are not handled in the client");
}
public void handleMethodAnnotations(Method method, InjectionContainer container, Map<AccessibleObject, Injector> injectors)
{
throw new IllegalStateException("Annotations are not handled in the client");
}
public void handleFieldAnnotations(Field field, InjectionContainer container, Map<AccessibleObject, Injector> injectors)
{
throw new IllegalStateException("Annotations are not handled in the client");
}
}