Search in sources :

Example 1 with Template

use of org.apache.openejb.api.resource.Template in project tomee by apache.

the class ConfigurationFactory method configureService.

/**
 * This is the major piece of code that configures services.
 * It merges the data from the <ServiceProvider> declaration
 * with the data from the openejb.xml file (say <Resource>)
 *
 * The end result is a canonical (i.e. flattened) ServiceInfo
 * The ServiceInfo will be of a specific type (ContainerInfo, ResourceInfo, etc)
 *
 * @param service  Service
 * @param infoType Class
 * @param <T>      infoType
 * @return ServiceInfo
 * @throws OpenEJBException On error
 */
public <T extends ServiceInfo> T configureService(org.apache.openejb.config.Service service, final Class<? extends T> infoType) throws OpenEJBException {
    try {
        if (infoType == null) {
            throw new NullPointerException("type");
        }
        if (service == null) {
            service = getDefaultService(infoType);
            if (service == null) {
                throw new OpenEJBException(messages.format("configureService.noDefaultService", infoType.getName()));
            }
        }
        {
            String template = service.getTemplate();
            if (template == null) {
                template = SystemInstance.get().getProperty(Template.class.getName());
            }
            if (template != null) {
                template = unaliasPropertiesProvider(template);
                // don't trim them, user wants to handle it himself, let him do it
                final ObjectRecipe recipe = newObjectRecipe(template);
                recipe.setProperty("serviceId", service.getId());
                // note: we can also use reflection if needed to limit the dependency
                Template.class.cast(recipe.create()).configure(service);
            }
        }
        final ServiceProvider provider = getServiceProvider(service, infoType);
        if (service.getId() == null) {
            service.setId(provider.getId());
        }
        final Properties overrides = trim(getSystemProperties(overrideKey(service), provider.getService()));
        final Properties serviceProperties = service.getProperties();
        trim(serviceProperties);
        trim(provider.getProperties());
        logger.info("configureService.configuring", service.getId(), provider.getService(), provider.getId());
        if (logger.isDebugEnabled()) {
            for (final Map.Entry<Object, Object> entry : serviceProperties.entrySet()) {
                final Object key = entry.getKey();
                Object value = entry.getValue();
                if (key instanceof String && "password".equalsIgnoreCase((String) key)) {
                    value = "<hidden>";
                }
                logger.debug("[" + key + "=" + value + "]");
            }
            for (final Map.Entry<Object, Object> entry : overrides.entrySet()) {
                final Object key = entry.getKey();
                Object value = entry.getValue();
                if (key instanceof String && "password".equalsIgnoreCase((String) key)) {
                    value = "<hidden>";
                }
                logger.debug("Override [" + key + "=" + value + "]");
            }
        }
        final Properties props = new SuperProperties().caseInsensitive(true);
        // weird hack but sometimes we don't want default values when we want null for instance
        if (serviceProperties == null || "false".equals(serviceProperties.getProperty(IGNORE_DEFAULT_VALUES_PROP, "false"))) {
            props.putAll(provider.getProperties());
        }
        if (serviceProperties != null) {
            props.putAll(serviceProperties);
        }
        props.putAll(overrides);
        {
            // force user properties last
            String propertiesProvider = service.getPropertiesProvider();
            if (propertiesProvider == null) {
                propertiesProvider = SystemInstance.get().getProperty(PropertiesResourceProvider.class.getName());
            }
            if (propertiesProvider != null) {
                propertiesProvider = unaliasPropertiesProvider(propertiesProvider);
                // don't trim them, user wants to handle it himself, let him do it
                final ObjectRecipe recipe = newObjectRecipe(propertiesProvider);
                recipe.setFactoryMethod("provides");
                recipe.setProperty("serviceId", service.getId());
                recipe.setProperties(props);
                // let user get all config
                recipe.setProperty("properties", props);
                final Properties p = Properties.class.cast(recipe.create());
                props.putAll(p);
            }
        }
        props.remove(IGNORE_DEFAULT_VALUES_PROP);
        final T info;
        try {
            info = infoType.newInstance();
        } catch (final Exception e) {
            throw new OpenEJBException(messages.format("configureService.cannotInstantiateClass", infoType.getName()), e);
        }
        // some jndi adjustment
        if (service.getId().startsWith("java:/")) {
            service.setId(service.getId().substring("java:/".length()));
        }
        info.service = provider.getService();
        info.types.addAll(provider.getTypes());
        info.description = provider.getDescription();
        info.displayName = provider.getDisplayName();
        info.className = provider.getClassName();
        info.factoryMethod = provider.getFactoryName();
        info.id = service.getId();
        info.properties = props;
        info.constructorArgs.addAll(parseConstructorArgs(provider));
        if (info instanceof ResourceInfo && service instanceof Resource) {
            final ResourceInfo ri = ResourceInfo.class.cast(info);
            final Resource resource = Resource.class.cast(service);
            ri.jndiName = resource.getJndi();
            ri.postConstruct = resource.getPostConstruct();
            ri.preDestroy = resource.getPreDestroy();
            ri.aliases.addAll(resource.getAliases());
            ri.dependsOn.addAll(resource.getDependsOn());
        }
        if (service.getClasspath() != null && service.getClasspath().length() > 0) {
            info.classpath = resolveClasspath(service.getClasspath());
        }
        info.classpathAPI = service.getClasspathAPI();
        specialProcessing(info);
        return info;
    } catch (final NoSuchProviderException e) {
        final String message = logger.fatal("configureService.failed", e, (null != service ? service.getId() : ""));
        throw new OpenEJBException(message + ": " + e.getMessage());
    } catch (final Throwable e) {
        final String message = logger.fatal("configureService.failed", e, (null != service ? service.getId() : ""));
        throw new OpenEJBException(message, e);
    }
}
Also used : OpenEJBException(org.apache.openejb.OpenEJBException) ResourceInfo(org.apache.openejb.assembler.classic.ResourceInfo) Resource(org.apache.openejb.config.sys.Resource) Properties(java.util.Properties) SuperProperties(org.apache.openejb.util.SuperProperties) SuperProperties(org.apache.openejb.util.SuperProperties) IOException(java.io.IOException) URISyntaxException(java.net.URISyntaxException) OpenEJBException(org.apache.openejb.OpenEJBException) MalformedURLException(java.net.MalformedURLException) Template(org.apache.openejb.api.resource.Template) ObjectRecipe(org.apache.xbean.recipe.ObjectRecipe) ServiceProvider(org.apache.openejb.config.sys.ServiceProvider) PropertiesResourceProvider(org.apache.openejb.api.resource.PropertiesResourceProvider) Map(java.util.Map) HashMap(java.util.HashMap)

Aggregations

IOException (java.io.IOException)1 MalformedURLException (java.net.MalformedURLException)1 URISyntaxException (java.net.URISyntaxException)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1 Properties (java.util.Properties)1 OpenEJBException (org.apache.openejb.OpenEJBException)1 PropertiesResourceProvider (org.apache.openejb.api.resource.PropertiesResourceProvider)1 Template (org.apache.openejb.api.resource.Template)1 ResourceInfo (org.apache.openejb.assembler.classic.ResourceInfo)1 Resource (org.apache.openejb.config.sys.Resource)1 ServiceProvider (org.apache.openejb.config.sys.ServiceProvider)1 SuperProperties (org.apache.openejb.util.SuperProperties)1 ObjectRecipe (org.apache.xbean.recipe.ObjectRecipe)1