org.apache.wookie.server.Start.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.wookie.server.Start.java

Source

/*
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.wookie.server;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

import javax.jcr.Repository;
import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.DataSourceConnectionFactory;
import org.apache.commons.dbcp.PoolableConnectionFactory;
import org.apache.commons.dbcp.PoolingDataSource;
import org.apache.commons.pool.impl.GenericObjectPool;
import org.apache.jackrabbit.core.TransientRepository;
import org.apache.log4j.Logger;
import org.apache.wookie.beans.jcr.JCRPersistenceManager;
import org.apache.wookie.beans.jpa.JPAPersistenceManager;
import org.apache.wookie.beans.util.PersistenceManagerFactory;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.plus.naming.Resource;
import org.mortbay.jetty.security.HashUserRealm;
import org.mortbay.jetty.security.UserRealm;
import org.mortbay.jetty.webapp.WebAppContext;

public class Start {
    static final private Logger logger = Logger.getLogger(Start.class);
    private static int port = 8080;

    public static final String DB_USER_PROPERTY_NAME = "wookie.db.user";
    public static final String DB_PASSWORD_PROPERTY_NAME = "wookie.db.password";
    public static final String DB_DRIVER_CLASS_PROPERTY_NAME = "wookie.db.driver";
    public static final String DB_URI_PROPERTY_NAME = "wookie.db.uri";
    public static final String DB_TYPE_PROPERTY_NAME = "wookie.db.type";
    public static final String REPOSITORY_USER_PROPERTY_NAME = "wookie.repository.user";
    public static final String REPOSITORY_PASSWORD_PROPERTY_NAME = "wookie.repository.password";
    public static final String REPOSITORY_ROOT_PATH_PROPERTY_NAME = "wookie.repository.rootpath";
    public static final String REPOSITORY_WORKSPACE_PROPERTY_NAME = "wookie.repository.workspace";
    public static final String PERSISTENCE_MANAGER_TYPE_PROPERTY_NAME = "wookie.persistence.manager.type";
    public static final String PERSISTENCE_MANAGER_TYPE_JPA = "jpa";
    public static final String PERSISTENCE_MANAGER_TYPE_JCR = "jcr";

    private static String persistenceManagerType;
    private static String dbUser;
    private static String dbPassword;
    private static String dbDriver;
    private static String dbUri;
    private static String dbType;
    private static String repositoryUser;
    private static String repositoryPassword;
    private static String repositoryRootPath;
    private static String repositoryWorkspace;
    private static Server server;

    public static void main(String[] args) throws Exception {
        boolean initDB = true;
        for (int i = 0; i < args.length; i++) {
            String arg = args[i];
            System.out.println("Runtime argument: " + arg);
            if (arg.startsWith("port=")) {
                port = new Integer(arg.substring(5));
            } else if (arg.startsWith("initDB=")) {
                initDB = !arg.substring(7).toLowerCase().equals("false");
            } else {
                System.out.println("argument UNRECOGNISED - ignoring");
            }
        }

        // load configuration from environment
        persistenceManagerType = getSystemProperty(PERSISTENCE_MANAGER_TYPE_PROPERTY_NAME,
                PERSISTENCE_MANAGER_TYPE_JPA);
        dbUser = getSystemProperty(DB_USER_PROPERTY_NAME, "java");
        dbPassword = getSystemProperty(DB_PASSWORD_PROPERTY_NAME, "java");
        dbDriver = getSystemProperty(DB_DRIVER_CLASS_PROPERTY_NAME, "org.apache.derby.jdbc.EmbeddedDriver");
        dbUri = getSystemProperty(DB_URI_PROPERTY_NAME, "jdbc:derby:widgetDatabase/widgetDB;create=true");
        dbType = getSystemProperty(DB_TYPE_PROPERTY_NAME, "derby");
        repositoryUser = getSystemProperty(REPOSITORY_USER_PROPERTY_NAME, "java");
        repositoryPassword = getSystemProperty(REPOSITORY_PASSWORD_PROPERTY_NAME, "java");
        repositoryRootPath = getSystemProperty(REPOSITORY_ROOT_PATH_PROPERTY_NAME, "/wookie");
        repositoryWorkspace = getSystemProperty(REPOSITORY_WORKSPACE_PROPERTY_NAME, "default");

        // set configuration properties
        if (persistenceManagerType.equals(PERSISTENCE_MANAGER_TYPE_JPA)) {
            System.setProperty(PersistenceManagerFactory.PERSISTENCE_MANAGER_CLASS_NAME_PROPERTY_NAME,
                    JPAPersistenceManager.class.getName());
        } else if (persistenceManagerType.equals(PERSISTENCE_MANAGER_TYPE_JCR)) {
            System.setProperty(PersistenceManagerFactory.PERSISTENCE_MANAGER_CLASS_NAME_PROPERTY_NAME,
                    JCRPersistenceManager.class.getName());
        }
        if (initDB) {
            System.setProperty(PersistenceManagerFactory.PERSISTENCE_MANAGER_INITIALIZE_STORE_PROPERTY_NAME,
                    "true");
        }
        System.setProperty(JPAPersistenceManager.PERSISTENCE_MANAGER_DB_TYPE_PROPERTY_NAME, dbType);
        System.setProperty(JCRPersistenceManager.PERSISTENCE_MANAGER_USER_PROPERTY_NAME, repositoryUser);
        System.setProperty(JCRPersistenceManager.PERSISTENCE_MANAGER_PASSWORD_PROPERTY_NAME, repositoryPassword);
        System.setProperty(JCRPersistenceManager.PERSISTENCE_MANAGER_ROOT_PATH_PROPERTY_NAME, repositoryRootPath);
        System.setProperty(JCRPersistenceManager.PERSISTENCE_MANAGER_WORKSPACE_PROPERTY_NAME, repositoryWorkspace);

        // configure and start server
        configureServer();
        startServer();
    }

    private static void startServer() throws Exception, InterruptedException {
        logger.info("Starting Wookie Server");
        logger.info("point your browser at http://localhost:" + port + "/wookie");
        // The monitor thread will end this server instance when it receives a \n\r on port 8079
        Thread monitor = new MonitorThread();
        monitor.start();
        server.start();
        server.join();
        monitor = null;
        System.exit(0);
    }

    private static void configureServer() throws Exception {
        // create embedded jetty instance
        logger.info("Configuring Jetty server");
        server = new Server(port);

        // configure embedded jetty to handle wookie web application
        WebAppContext context = new WebAppContext();
        context.setServer(server);
        context.setContextPath("/wookie");
        context.setWar("build/webapp/wookie");

        // enable and configure JNDI container resources
        context.setConfigurationClasses(new String[] { "org.mortbay.jetty.webapp.WebInfConfiguration",
                "org.mortbay.jetty.plus.webapp.EnvConfiguration", "org.mortbay.jetty.plus.webapp.Configuration",
                "org.mortbay.jetty.webapp.JettyWebXmlConfiguration",
                "org.mortbay.jetty.webapp.TagLibConfiguration" });
        if (persistenceManagerType.equals(PERSISTENCE_MANAGER_TYPE_JPA)) {
            logger.info("Configuring JPA persistence manager");

            // setup derby database directory and logging properties
            if (dbType.equals("derby") && dbUri.startsWith("jdbc:derby:")) {
                int dbUriArgsIndex = dbUri.indexOf(";", 11);
                if (dbUriArgsIndex == -1) {
                    dbUriArgsIndex = dbUri.length();
                }
                String databasePath = dbUri.substring(11, dbUriArgsIndex);
                int databaseDirIndex = databasePath.lastIndexOf(File.separatorChar);
                if ((databaseDirIndex == -1) && (File.separatorChar != '/')) {
                    databaseDirIndex = databasePath.lastIndexOf('/');
                }
                if (databaseDirIndex != -1) {
                    String databaseDir = databasePath.substring(0, databaseDirIndex);
                    File databaseDirFile = new File(databaseDir);
                    if (!databaseDirFile.exists()) {
                        databaseDirFile.mkdirs();
                    }
                    String derbyLog = databaseDirFile.getAbsolutePath() + File.separator + "derby.log";
                    System.setProperty("derby.stream.error.file", derbyLog);
                }
            }

            // Setup a database connection resource using DBCP
            BasicDataSource dataSource = new BasicDataSource();
            dataSource.setDriverClassName(dbDriver);
            dataSource.setUrl(dbUri);
            dataSource.setUsername(dbUser);
            dataSource.setPassword(dbPassword);
            dataSource.setMaxActive(80);
            dataSource.setMaxIdle(80);
            dataSource.setInitialSize(5);
            dataSource.setMaxOpenPreparedStatements(0);

            // Set up connection pool
            GenericObjectPool pool = new GenericObjectPool();
            // setup factory and pooling DataSource
            DataSourceConnectionFactory factory = new DataSourceConnectionFactory(dataSource);
            @SuppressWarnings("unused")
            PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(factory, pool, null,
                    null, false, true);
            DataSource poolingDataSource = new PoolingDataSource(pool);

            new Resource(JPAPersistenceManager.WIDGET_DATABASE_JNDI_DATASOURCE_NAME, poolingDataSource);
        } else if (persistenceManagerType.equals(PERSISTENCE_MANAGER_TYPE_JCR)) {
            logger.info("Configuring JCR persistence manager");

            // setup repository directory and derby logging properties
            File repositoryDirFile = new File("widgetRepository");
            if (!repositoryDirFile.exists()) {
                repositoryDirFile.mkdirs();
            }
            String derbyLog = repositoryDirFile.getAbsolutePath() + File.separator + "derby.log";
            System.setProperty("derby.stream.error.file", derbyLog);

            // setup Jackrabbit JCR repository JNDI resource
            String repositoryConfig = repositoryDirFile.getAbsolutePath() + File.separator + "repository.xml";
            Repository repository = new TransientRepository(repositoryConfig, repositoryDirFile.getAbsolutePath());
            new Resource(JCRPersistenceManager.WIDGET_REPOSITORY_JNDI_REPOSITORY_NAME, repository);
        }

        // configure embedded jetty web application handler
        server.addHandler(context);

        // configure embedded jetty authentication realm
        HashUserRealm authedRealm = new HashUserRealm("Authentication Required", "etc/jetty-realm.properties");
        server.setUserRealms(new UserRealm[] { authedRealm });

        logger.info("Configured Jetty server");
    }

    private static class MonitorThread extends Thread {

        private ServerSocket socket;

        public MonitorThread() {
            setDaemon(true);
            setName("StopMonitor");
            try {
                socket = new ServerSocket(8079, 1, InetAddress.getByName("127.0.0.1"));
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }

        @Override
        public void run() {
            System.out.println("*** running jetty 'stop' thread");
            Socket accept;
            try {
                accept = socket.accept();
                BufferedReader reader = new BufferedReader(new InputStreamReader(accept.getInputStream()));
                reader.readLine();
                System.out.println("*** stopping jetty embedded server");
                server.stop();
                accept.close();
                socket.close();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }

    /**
      * Get configuration system property.
      * 
      * @param name property name
      * @param defaultValue default property value
      * @return property value
      */
    private static String getSystemProperty(String name, String defaultValue) {
        String value = System.getProperty(name);
        return (((value != null) && (value.length() > 0) && !value.startsWith("$")) ? value : defaultValue);
    }
}