org.jbpm.pvm.internal.wire.descriptor.HibernateConfigurationDescriptor.java Source code

Java tutorial

Introduction

Here is the source code for org.jbpm.pvm.internal.wire.descriptor.HibernateConfigurationDescriptor.java

Source

/*
 * JBoss, Home of Professional Open Source
 * Copyright 2005, JBoss Inc., and individual contributors as indicated
 * 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.jbpm.pvm.internal.wire.descriptor;

import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import org.hibernate.cfg.Configuration;
import org.jbpm.api.JbpmException;
import org.jbpm.internal.log.Log;
import org.jbpm.pvm.internal.util.ReflectUtil;
import org.jbpm.pvm.internal.wire.WireContext;
import org.jbpm.pvm.internal.wire.WireDefinition;
import org.jbpm.pvm.internal.wire.WireException;
import org.jbpm.pvm.internal.wire.operation.Operation;

/**
 * @author Tom Baeyens
 */
public class HibernateConfigurationDescriptor extends AbstractDescriptor {

    private static final long serialVersionUID = 1L;

    private static final Log log = Log.getLog(HibernateConfigurationDescriptor.class.getName());

    String className;
    String namingStrategyClassName;
    List<Operation> cfgOperations = new ArrayList<Operation>();
    List<Operation> cfgCacheOperations = new ArrayList<Operation>();
    PropertiesDescriptor propertiesDescriptor = null;

    public Object construct(WireContext wireContext) {
        // instantiation of the configuration
        Configuration configuration = null;
        if (className != null) {
            ClassLoader classLoader = wireContext.getClassLoader();
            log.trace("instantiating hibernate configuration class " + className);
            Class<?> configurationClass = ReflectUtil.loadClass(classLoader, className);
            configuration = (Configuration) ReflectUtil.newInstance(configurationClass);
        } else {
            log.trace("instantiating default hibernate configuration");
            configuration = new Configuration();
        }
        return configuration;
    }

    public void initialize(Object object, WireContext wireContext) {
        Configuration configuration = (Configuration) object;

        apply(cfgOperations, configuration, wireContext);
        apply(cfgCacheOperations, configuration, wireContext);

        if (propertiesDescriptor != null) {
            Properties properties = (Properties) wireContext.create(propertiesDescriptor, false);
            if (log.isDebugEnabled())
                log.debug("adding properties to hibernate configuration: " + properties);
            configuration.addProperties(properties);
        }
    }

    private void apply(List<Operation> operations, Configuration configuration, WireContext wireContext) {
        if (operations != null) {
            for (Operation operation : operations) {
                log.trace(operation.toString());
                operation.apply(configuration, wireContext);
            }
        }
    }

    public Class<?> getType(WireDefinition wireDefinition) {
        if (className != null) {
            try {
                return ReflectUtil.loadClass(wireDefinition.getClassLoader(), className);
            } catch (JbpmException e) {
                throw new WireException(
                        "couldn't create hibernate configuration '" + className + "': " + e.getMessage(),
                        e.getCause());
            }
        }
        return Configuration.class;
    }

    public void addCfgResource(String cfgResource) {
        cfgOperations.add(new AddCfgResource(cfgResource));
    }

    public void addCfgFile(String cfgFile) {
        cfgOperations.add(new AddCfgFile(cfgFile));
    }

    public void addCfgUrl(String cfgUrl) {
        cfgOperations.add(new AddCfgUrl(cfgUrl));
    }

    public void addMappingResource(String mappingResource) {
        cfgOperations.add(new AddMappingResource(mappingResource));
    }

    public void addMappingFile(String mappingFileName) {
        cfgOperations.add(new AddMappingFile(mappingFileName));
    }

    public void addMappingClass(String mappingClassName) {
        cfgOperations.add(new AddMappingClass(mappingClassName));
    }

    public void addMappingUrl(String mappingUrl) {
        cfgOperations.add(new AddMappingUrl(mappingUrl));
    }

    public void addClassToCache(String className, String concurrencyStrategy) {
        cfgCacheOperations.add(new SetCacheConcurrencyStrategy(className, concurrencyStrategy));
    }

    public void addCollectionToCache(String collectionName, String concurrencyStrategy) {
        cfgCacheOperations.add(new SetCollectionCacheConcurrencyStrategy(collectionName, concurrencyStrategy));
    }

    public static class AddCfgResource implements Operation {
        private static final long serialVersionUID = 1L;
        String cfgResource;

        public AddCfgResource(String cfgResource) {
            this.cfgResource = cfgResource;
        }

        public void apply(Object target, WireContext wireContext) {
            Configuration configuration = (Configuration) target;
            configuration.configure(cfgResource);
        }

        public String toString() {
            return "adding hibernate cfg resource " + cfgResource;
        }
    }

    public static class AddCfgFile implements Operation {
        private static final long serialVersionUID = 1L;
        String cfgFileName;

        public AddCfgFile(String cfgFileName) {
            this.cfgFileName = cfgFileName;
        }

        public void apply(Object target, WireContext wireContext) {
            Configuration configuration = (Configuration) target;
            File file = new File(cfgFileName);
            configuration.configure(file);
        }

        public String toString() {
            return "adding hibernate cfg file " + cfgFileName;
        }
    }

    public static class AddCfgUrl implements Operation {
        private static final long serialVersionUID = 1L;
        String cfgUrl;

        public AddCfgUrl(String cfgUrl) {
            this.cfgUrl = cfgUrl;
        }

        public void apply(Object target, WireContext wireContext) {
            Configuration configuration = (Configuration) target;
            try {
                URL url = new URL(cfgUrl);
                configuration.configure(url);
            } catch (Exception e) {
                throw new JbpmException("couldn't configure hibernate with url " + cfgUrl, e);
            }
        }

        public String toString() {
            return "adding hibernate cfg url " + cfgUrl;
        }
    }

    public static class AddMappingResource implements Operation {
        private static final long serialVersionUID = 1L;
        String resource;

        public AddMappingResource(String resource) {
            this.resource = resource;
        }

        public void apply(Object target, WireContext wireContext) {
            Configuration configuration = (Configuration) target;
            configuration.addResource(resource, wireContext.getClassLoader());
        }

        public String toString() {
            return "adding mapping resource " + resource + " to hibernate configuration";
        }
    }

    public static class AddMappingFile implements Operation {
        private static final long serialVersionUID = 1L;
        String fileName;

        public AddMappingFile(String fileName) {
            this.fileName = fileName;
        }

        public void apply(Object target, WireContext wireContext) {
            Configuration configuration = (Configuration) target;
            configuration.addFile(fileName);
        }

        public String toString() {
            return "adding hibernate mapping file " + fileName + " to configuration";
        }
    }

    public static class AddMappingClass implements Operation {
        private static final long serialVersionUID = 1L;
        String className;

        public AddMappingClass(String className) {
            this.className = className;
        }

        public void apply(Object target, WireContext wireContext) {
            Configuration configuration = (Configuration) target;
            try {
                Class<?> persistentClass = wireContext.getClassLoader().loadClass(className);
                configuration.addClass(persistentClass);
            } catch (Exception e) {
                throw new JbpmException("couldn't add mapping for class " + className, e);
            }
        }

        public String toString() {
            return "adding persistent class " + className + " to hibernate configuration";
        }
    }

    public static class AddMappingUrl implements Operation {
        private static final long serialVersionUID = 1L;
        String url;

        public AddMappingUrl(String url) {
            this.url = url;
        }

        public void apply(Object target, WireContext wireContext) {
            Configuration configuration = (Configuration) target;
            try {
                configuration.addURL(new URL(url));
            } catch (Exception e) {
                throw new JbpmException("couldn't add hibernate mapping from URL " + url, e);
            }
        }
    }

    public static class SetCacheConcurrencyStrategy implements Operation {
        private static final long serialVersionUID = 1L;
        String className;
        String concurrencyStrategy;

        public SetCacheConcurrencyStrategy(String className, String concurrencyStrategy) {
            this.className = className;
            this.concurrencyStrategy = concurrencyStrategy;
        }

        public void apply(Object target, WireContext wireContext) {
            Configuration configuration = (Configuration) target;
            configuration.setCacheConcurrencyStrategy(className, concurrencyStrategy);
        }

        public String toString() {
            return "setting cache concurrency strategy on class " + className + " to " + concurrencyStrategy
                    + " on hibernate configuration";
        }
    }

    public static class SetCollectionCacheConcurrencyStrategy implements Operation {
        private static final long serialVersionUID = 1L;
        String collection;
        String concurrencyStrategy;

        public SetCollectionCacheConcurrencyStrategy(String collection, String concurrencyStrategy) {
            this.collection = collection;
            this.concurrencyStrategy = concurrencyStrategy;
        }

        public void apply(Object target, WireContext wireContext) {
            Configuration configuration = (Configuration) target;
            configuration.setCollectionCacheConcurrencyStrategy(collection, concurrencyStrategy);
        }

        public String toString() {
            return "setting cache concurrency strategy on collection " + collection + " to " + concurrencyStrategy
                    + " on hibernate configuration";
        }
    }

    // getters and setters //////////////////////////////////////////////////////

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public PropertiesDescriptor getPropertiesDescriptor() {
        return propertiesDescriptor;
    }

    public void setPropertiesDescriptor(PropertiesDescriptor propertiesDescriptor) {
        this.propertiesDescriptor = propertiesDescriptor;
    }

    public String getNamingStrategyClassName() {
        return namingStrategyClassName;
    }

    public void setNamingStrategyClassName(String namingStrategyClassName) {
        this.namingStrategyClassName = namingStrategyClassName;
    }
}