com.opengamma.web.bundle.BundleManagerFactory.java Source code

Java tutorial

Introduction

Here is the source code for com.opengamma.web.bundle.BundleManagerFactory.java

Source

/**
 * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
 *
 * Please see distribution for license.
 */
package com.opengamma.web.bundle;

import java.io.InputStream;

import javax.servlet.ServletContext;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;

import com.opengamma.util.ArgumentChecker;

/**
 * Factory to create a {@code BundleManager} from the Bundle XML configuration file.
 * <p>
 * This exists to handle the late arrival of the {@code ServletContext}
 */
public class BundleManagerFactory {

    private static final String DEFAULT_CONFIG_XML_PATH = "/WEB-INF/uiResourceConfig.xml";

    /**
     * The base directory.
     */
    private String _baseDir;
    /**
     * The config xml path
     */
    private String _configXmlPath;
    /**
     * The manager created from this factory.
     */
    private volatile BundleManager _manager;
    /**
     * The uri provider.
     */
    private volatile UriProvider _uriProvider;

    /**
     * Creates an instance.
     */
    public BundleManagerFactory() {
    }

    //-------------------------------------------------------------------------
    /**
     * Gets the base directory.
     * @return the base directory
     */
    public String getBaseDir() {
        return _baseDir;
    }

    /**
     * Sets the base directory.
     * 
     * @param baseDir  the base directory
     */
    public void setBaseDir(String baseDir) {
        _baseDir = baseDir;
    }

    /**
     * Gets the configXmlPath.
     * @return the configXmlPath
     */
    public String getConfigXmlPath() {
        return _configXmlPath;
    }

    /**
     * Sets the configXmlPath.
     * @param configXmlPath  the configXmlPath
     */
    public void setConfigXmlPath(String configXmlPath) {
        if (!StringUtils.isEmpty(configXmlPath)) {
            _configXmlPath = configXmlPath.startsWith("/") ? configXmlPath : "/" + configXmlPath;
        }
    }

    /**
     * Gets the uriProvider.
     * @return the uriProvider
     */
    public UriProvider getUriProvider() {
        return _uriProvider;
    }

    /**
     * Sets the uriProvider.
     * @param uriProvider  the uriProvider
     */
    public void setUriProvider(UriProvider uriProvider) {
        _uriProvider = uriProvider;
    }

    //-------------------------------------------------------------------------
    /**
     * Obtains a bundle manager using the servlet context.
     * <p>
     * This is used to obtain the manager from the servlet context, because the
     * servlet context is usually available after the factory is setup.
     * 
     * @param servletContext  the servlet context, not null
     * @return the manager, not null
     */
    public BundleManager get(ServletContext servletContext) {
        BundleManager manager = _manager;
        if (manager == null) {
            synchronized (this) {
                manager = _manager;
                if (manager == null) {
                    _manager = manager = createManager(servletContext); // CSIGNORE
                }
            }
        }
        return manager;
    }

    /**
     * Creates a bundle manager using the servlet context.
     * 
     * @param servletContext  the servlet context, not null
     * @return the manager, not null
     */
    protected BundleManager createManager(ServletContext servletContext) {
        ArgumentChecker.notNull(servletContext, "servletContext");
        InputStream uiResource = null;
        try {
            ServletContextUriProvider uriProvider = new ServletContextUriProvider(getBaseDir(), servletContext);
            setUriProvider(uriProvider);
            uiResource = getXMLStream(servletContext);
            BundleParser parser = new BundleParser(uriProvider, getBaseDir());
            return parser.parse(uiResource);
        } finally {
            IOUtils.closeQuietly(uiResource);
        }
    }

    /**
     * Resolves the config file.
     * @param servletContext 
     * 
     * @return the resolved file
     */
    private InputStream getXMLStream(ServletContext servletContext) {
        String configXMlPath = _configXmlPath == null ? DEFAULT_CONFIG_XML_PATH : _configXmlPath;
        InputStream result = servletContext.getResourceAsStream(configXMlPath);
        if (result == null) {
            throw new IllegalStateException("Cannot find resource XML in " + configXMlPath);
        }
        return result;
    }

}