Package org.apache.wookie.server

Source Code of org.apache.wookie.server.Start$MonitorThread

/*
*  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);
    }
}
TOP

Related Classes of org.apache.wookie.server.Start$MonitorThread

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.