You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@manifoldcf.apache.org by kw...@apache.org on 2010/07/06 21:45:54 UTC

svn commit: r960994 [2/2] - in /incubator/lcf/trunk/modules: ./ connectors/jcifs/ framework/ framework/core/org/apache/lcf/core/common/ framework/core/org/apache/lcf/core/interfaces/ framework/core/org/apache/lcf/core/system/ framework/crawler-ui/ fram...

Modified: incubator/lcf/trunk/modules/framework/jetty-runner/org/apache/lcf/jettyrunner/LCFJettyRunner.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/modules/framework/jetty-runner/org/apache/lcf/jettyrunner/LCFJettyRunner.java?rev=960994&r1=960993&r2=960994&view=diff
==============================================================================
--- incubator/lcf/trunk/modules/framework/jetty-runner/org/apache/lcf/jettyrunner/LCFJettyRunner.java (original)
+++ incubator/lcf/trunk/modules/framework/jetty-runner/org/apache/lcf/jettyrunner/LCFJettyRunner.java Tue Jul  6 19:45:53 2010
@@ -20,6 +20,8 @@ package org.apache.lcf.jettyrunner;
 import java.io.*;
 import org.apache.lcf.core.interfaces.*;
 import org.apache.lcf.agents.interfaces.*;
+import org.apache.lcf.crawler.interfaces.*;
+import org.apache.lcf.authorities.interfaces.*;
 import org.apache.lcf.agents.system.*;
 
 import java.io.IOException;
@@ -49,6 +51,16 @@ public class LCFJettyRunner
 
   public static final String agentShutdownSignal = org.apache.lcf.agents.AgentRun.agentShutdownSignal;
 
+  // Configuration parameters
+  public static final String connectorsConfigurationFile = "org.apache.lcf.connectorsconfigurationfile";
+  
+  // Connectors configuration file
+  public static final String NODE_OUTPUTCONNECTOR = "outputconnector";
+  public static final String NODE_AUTHORITYCONNECTOR = "authorityconnector";
+  public static final String NODE_REPOSITORYCONNECTOR = "repositoryconnector";
+  public static final String ATTRIBUTE_NAME = "name";
+  public static final String ATTRIBUTE_CLASS = "class";
+  
   protected Server server;
   
   public LCFJettyRunner( int port, String crawlerWarPath, String authorityServiceWarPath )
@@ -126,26 +138,36 @@ public class LCFJettyRunner
    */
   public static void main( String[] args )
   {
-    if (args.length != 3)
+    if (args.length != 3 && args.length != 1 && args.length != 0)
     {
-      System.err.println("Usage: LCFJettyRunner <port> <crawler-war-path> <authority-service-war-path>");
+      System.err.println("Usage: LCFJettyRunner [<port> [<crawler-war-path> <authority-service-war-path>]]");
       System.exit(1);
     }
 
-    int jettyPort = 8888;
-    try
+    int jettyPort = 8345;
+    if (args.length > 0)
     {
-      jettyPort = Integer.parseInt(args[0]);
+      try
+      {
+        jettyPort = Integer.parseInt(args[0]);
+      }
+      catch (NumberFormatException e)
+      {
+        e.printStackTrace(System.err);
+        System.exit(1);
+      }
     }
-    catch (NumberFormatException e)
+    
+    String crawlerWarPath = "war/lcf-crawler-ui.war";
+    String authorityserviceWarPath = "war/lcf-authority-service.war";
+    if (args.length == 3)
     {
-      e.printStackTrace(System.err);
-      System.exit(1);
+      crawlerWarPath = args[1];
+      authorityserviceWarPath = args[2];
     }
     
     // Ready to begin in earnest...
-    
-    
+        
     try
     {
       LCF.initializeEnvironment();
@@ -155,19 +177,234 @@ public class LCFJettyRunner
       ILockManager lockManager = LockManagerFactory.make(tc);
       lockManager.clearGlobalFlag(agentShutdownSignal);
 
+      // Grab a database handle, so we can use transactions later.
+      IDBInterface database = DBInterfaceFactory.make(tc,
+        LCF.getMasterDatabaseName(),
+        LCF.getMasterDatabaseUsername(),
+        LCF.getMasterDatabasePassword());
+
       // Do the basic initialization of the database and its schema
       LCF.createSystemDatabase(tc,"","");
       LCF.installTables(tc);
-      IAgentManager mgr = AgentManagerFactory.make(tc);
-      mgr.registerAgent("org.apache.lcf.crawler.system.CrawlerAgent");
+      IAgentManager agentMgr = AgentManagerFactory.make(tc);
+      agentMgr.registerAgent("org.apache.lcf.crawler.system.CrawlerAgent");
 
-      // Other code will go here to discover and register various connectors that exist in the classpath
-      // MHL
+      // Read connectors configuration file (to figure out what we need to register)
+      Connectors c = null;
+      File connectorConfigFile = LCF.getFileProperty(connectorsConfigurationFile);
+      if (connectorConfigFile != null)
+      {
+        try
+        {
+          // Open the file, read it, and attempt to do the connector registrations
+          InputStream is = new FileInputStream(connectorConfigFile);
+          try
+          {
+            c = new Connectors(is);
+          }
+          finally
+          {
+            is.close();
+          }
+        }
+        catch (FileNotFoundException e)
+        {
+          throw new LCFException("Couldn't find connector configuration file: "+e.getMessage(),e);
+        }
+        catch (IOException e)
+        {
+          throw new LCFException("Error reading connector configuration file: "+e.getMessage(),e);
+        }
+      }
+      
+      // Unregister all connectors.
+      
+      // Output connectors...
+      {
+        IOutputConnectorManager mgr = OutputConnectorManagerFactory.make(tc);
+        IOutputConnectionManager connManager = OutputConnectionManagerFactory.make(tc);
+        IResultSet classNames = mgr.getConnectors();
+        int i = 0;
+        while (i < classNames.getRowCount())
+        {
+          IResultRow row = classNames.getRow(i++);
+          String className = (String)row.getValue("classname");
+          // Deregistration should be done in a transaction
+          database.beginTransaction();
+          try
+          {
+            // Find the connection names that come with this class
+            String[] connectionNames = connManager.findConnectionsForConnector(className);
+            // For all connection names, notify all agents of the deregistration
+            AgentManagerFactory.noteOutputConnectorDeregistration(tc,connectionNames);
+            // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
+            mgr.unregisterConnector(className);
+          }
+          catch (LCFException e)
+          {
+            database.signalRollback();
+            throw e;
+          }
+          catch (Error e)
+          {
+            database.signalRollback();
+            throw e;
+          }
+          finally
+          {
+            database.endTransaction();
+          }
+        }
+        System.err.println("Successfully unregistered all output connectors");
+      }
+      
+      // Authority connectors...
+      {
+        IAuthorityConnectorManager mgr = AuthorityConnectorManagerFactory.make(tc);
+        IResultSet classNames = mgr.getConnectors();
+        int i = 0;
+        while (i < classNames.getRowCount())
+        {
+          IResultRow row = classNames.getRow(i++);
+          mgr.unregisterConnector((String)row.getValue("classname"));
+        }
+        System.err.println("Successfully unregistered all authority connectors");
+      }
+      
+      // Repository connectors...
+      {
+        IConnectorManager mgr = ConnectorManagerFactory.make(tc);
+        IJobManager jobManager = JobManagerFactory.make(tc);
+        IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
+        IResultSet classNames = mgr.getConnectors();
+        int i = 0;
+        while (i < classNames.getRowCount())
+        {
+          IResultRow row = classNames.getRow(i++);
+          String className = (String)row.getValue("classname");
+          // Deregistration should be done in a transaction
+          database.beginTransaction();
+          try
+          {
+            // Find the connection names that come with this class
+            String[] connectionNames = connManager.findConnectionsForConnector(className);
+            // For each connection name, modify the jobs to note that the connector is no longer installed
+            jobManager.noteConnectorDeregistration(connectionNames);
+            // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
+            mgr.unregisterConnector(className);
+          }
+          catch (LCFException e)
+          {
+            database.signalRollback();
+            throw e;
+          }
+          catch (Error e)
+          {
+            database.signalRollback();
+            throw e;
+          }
+          finally
+          {
+            database.endTransaction();
+          }
+        }
+        System.err.println("Successfully unregistered all repository connectors");
+      }
+      
+      if (c != null)
+      {
 
+        // Other code will go here to discover and register various connectors that exist in the classpath
+        int i = 0;
+        while (i < c.getChildCount())
+        {
+          ConfigurationNode cn = c.findChild(i++);
+          if (cn.getType().equals(NODE_OUTPUTCONNECTOR))
+          {
+            String name = cn.getAttributeValue(ATTRIBUTE_NAME);
+            String className = cn.getAttributeValue(ATTRIBUTE_CLASS);
+            IOutputConnectorManager mgr = OutputConnectorManagerFactory.make(tc);
+            IOutputConnectionManager connManager = OutputConnectionManagerFactory.make(tc);
+            // Registration should be done in a transaction
+            database.beginTransaction();
+            try
+            {
+              // First, register connector
+              mgr.registerConnector(name,className);
+              // Then, signal to all jobs that might depend on this connector that they can switch state
+              // Find the connection names that come with this class
+              String[] connectionNames = connManager.findConnectionsForConnector(className);
+              // For all connection names, notify all agents of the registration
+              AgentManagerFactory.noteOutputConnectorRegistration(tc,connectionNames);
+            }
+            catch (LCFException e)
+            {
+              database.signalRollback();
+              throw e;
+            }
+            catch (Error e)
+            {
+              database.signalRollback();
+              throw e;
+            }
+            finally
+            {
+              database.endTransaction();
+            }
+            System.err.println("Successfully registered output connector '"+className+"'");
+          }
+          else if (cn.getType().equals(NODE_AUTHORITYCONNECTOR))
+          {
+            String name = cn.getAttributeValue(ATTRIBUTE_NAME);
+            String className = cn.getAttributeValue(ATTRIBUTE_CLASS);
+            IAuthorityConnectorManager mgr = AuthorityConnectorManagerFactory.make(tc);
+            mgr.registerConnector(name,className);
+            System.err.println("Successfully registered authority connector '"+className+"'");
+          }
+          else if (cn.getType().equals(NODE_REPOSITORYCONNECTOR))
+          {
+            String name = cn.getAttributeValue(ATTRIBUTE_NAME);
+            String className = cn.getAttributeValue(ATTRIBUTE_CLASS);
+            IConnectorManager mgr = ConnectorManagerFactory.make(tc);
+            IJobManager jobManager = JobManagerFactory.make(tc);
+            IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(tc);
+            // Deregistration should be done in a transaction
+            database.beginTransaction();
+            try
+            {
+              // First, register connector
+              mgr.registerConnector(name,className);
+              // Then, signal to all jobs that might depend on this connector that they can switch state
+              // Find the connection names that come with this class
+              String[] connectionNames = connManager.findConnectionsForConnector(className);
+              // For each connection name, modify the jobs to note that the connector is now installed
+              jobManager.noteConnectorRegistration(connectionNames);
+            }
+            catch (LCFException e)
+            {
+              database.signalRollback();
+              throw e;
+            }
+            catch (Error e)
+            {
+              database.signalRollback();
+              throw e;
+            }
+            finally
+            {
+              database.endTransaction();
+            }
+            System.err.println("Successfully registered repository connector '"+className+"'");
+          }
+          else
+            throw new LCFException("Unrecognized connectors node type '"+cn.getType()+"'");
+        }
+      }
+      
       System.err.println("Starting jetty...");
       
       // Create a jetty instance
-      LCFJettyRunner jetty = new LCFJettyRunner(jettyPort,args[1],args[2]);
+      LCFJettyRunner jetty = new LCFJettyRunner(jettyPort,crawlerWarPath,authorityserviceWarPath);
       // This will register a shutdown hook as well.
       jetty.start();