You are viewing a plain text version of this content. The canonical link for it is here.
Posted to muse-commits@ws.apache.org by da...@apache.org on 2006/07/23 22:33:44 UTC

svn commit: r424806 - in /webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core: platform/ routing/

Author: danj
Date: Sun Jul 23 13:33:43 2006
New Revision: 424806

URL: http://svn.apache.org/viewvc?rev=424806&view=rev
Log:
Modified router component to rely on RouterPersistence interface for saving and re-loading of router table entries during 
initialization. This allows clients to talk to resource instances even after a reboot of the appserver/container. There 
is an interface whose implementation class can be specified in the deployment descriptor under /router/persistence/java-persistence-class, 
and there is a default implementation, FilePersistence. The default impl writes all EPRs in the routing table to a 
directory, with EPRs sorted by resource type.

The persistence layer also takes over the role of the 'instances-at-startup' feature, allowing users to auto-create 
instances by having pre-existing EPR entries in a data store rather than having Muse create them on its own. Users of 
File Persistence can simply put EPR files on disk (in the directory they name in the descriptor) and Muse will load 
them into the router table and create resource instances for them.


Added:
    webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/FilePersistence.java
    webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/RouterPersistence.java
Modified:
    webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/platform/AbstractIsolationLayer.java
    webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/Messages.properties
    webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/ResourceRouter.java
    webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/SimpleResourceRouter.java

Modified: webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/platform/AbstractIsolationLayer.java
URL: http://svn.apache.org/viewvc/webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/platform/AbstractIsolationLayer.java?rev=424806&r1=424805&r2=424806&view=diff
==============================================================================
--- webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/platform/AbstractIsolationLayer.java (original)
+++ webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/platform/AbstractIsolationLayer.java Sun Jul 23 13:33:43 2006
@@ -177,7 +177,7 @@
             // the router didn't finish initializing, so there's probably 
             // no log to write to. just print to the console
             //
-            fault.printStackTrace(System.err);
+            fault.printStackTrace();
         }
         
         finally

Added: webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/FilePersistence.java
URL: http://svn.apache.org/viewvc/webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/FilePersistence.java?rev=424806&view=auto
==============================================================================
--- webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/FilePersistence.java (added)
+++ webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/FilePersistence.java Sun Jul 23 13:33:43 2006
@@ -0,0 +1,264 @@
+/*=============================================================================*
+ *  Copyright 2006 The Apache Software Foundation
+ *
+ *  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.muse.core.routing;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeSet;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import org.apache.muse.core.Resource;
+import org.apache.muse.core.ResourceManager;
+import org.apache.muse.util.messages.Messages;
+import org.apache.muse.util.messages.MessagesFactory;
+import org.apache.muse.util.xml.XmlUtils;
+import org.apache.muse.ws.addressing.EndpointReference;
+import org.apache.muse.ws.addressing.soap.SoapFault;
+
+/**
+ * 
+ * FilePersistence is a component that saves router entries (EPRs and 
+ * their resource types) to XML files on disk.
+ *
+ * @author Dan Jemiolo (danj)
+ *
+ */
+
+public class FilePersistence implements RouterPersistence
+{
+    //
+    // Used to look up all exception messages
+    //
+    private static Messages _MESSAGES = MessagesFactory.get(FilePersistence.class);
+    
+    private static final String _FILE_PREFIX = "resource-instance-";
+    
+    private static final String _PERSISTENCE_LOCATION_PARAM = "persistence-location";
+    
+    private Map _fileNumbersByEPR = new HashMap();
+    
+    private ResourceManager _manager = null;
+    
+    //
+    // name-value pairs specified with <init-param/>
+    //
+    private Map _parameters = null;
+    
+    protected Resource createResource(Element eprXML)
+        throws SoapFault
+    {
+        ResourceManager manager = getResourceManager();
+
+        EndpointReference epr = new EndpointReference(eprXML);
+        
+        String contextPath = getContextPath(epr);
+        Resource resource = manager.createResource(contextPath);
+        resource.setEndpointReference(epr);
+        
+        resource.initialize();
+        manager.addResource(epr, resource);
+        
+        return resource;
+    }
+    
+    protected void createResources(File resourceTypeDir) 
+        throws SoapFault
+    {
+        File[] resourceFiles = resourceTypeDir.listFiles(new ResourceFileFilter());
+        
+        for (int n = 0; n < resourceFiles.length; ++n)
+        {
+            Document xmlDoc = null;
+            
+            try
+            {
+                xmlDoc = XmlUtils.createDocument(resourceFiles[n]);
+            }
+            catch (Throwable error)
+            {
+                throw new RuntimeException(error.getMessage(), error);
+            }
+            
+            Element eprXML = XmlUtils.getFirstElement(xmlDoc);
+            Resource resource = createResource(eprXML);
+            
+            String fileName = resourceFiles[n].getName();
+            Integer fileNumber = getFileNumber(fileName);
+            
+            _fileNumbersByEPR.put(resource.getEndpointReference(), fileNumber);
+        }
+    }
+    
+    public void createResources() 
+        throws SoapFault
+    {
+        Iterator i = getResourceManager().getResourceContextPaths().iterator();
+        
+        while (i.hasNext())
+        {
+            String contextPath = (String)i.next();
+            File resourceTypeDir = getResourceTypeDirectory(contextPath);
+            createResources(resourceTypeDir);
+        }
+    }
+    
+    protected String getContextPath(EndpointReference epr)
+    {
+        String addressPath = epr.getAddress().getPath();
+        int slash = addressPath.lastIndexOf('/');        
+        return addressPath.substring(slash + 1);
+    }
+    
+    protected Integer getFileNumber(String fileName)
+    {
+        int underscore = fileName.lastIndexOf('-');
+        int extension = fileName.lastIndexOf('.');
+        String numberString = fileName.substring(underscore + 1, extension);
+        return new Integer(numberString);
+    }
+    
+    public String getInitializationParameter(String name)
+    {
+        return (String)getInitializationParameters().get(name);
+    }
+    
+    public Map getInitializationParameters()
+    {
+        return _parameters;
+    }
+    
+    protected String getNextFileName(int fileNumber)
+    {
+        return _FILE_PREFIX + fileNumber + ".xml";
+    }
+    
+    protected int getNextFileNumber()
+    {
+        if (_fileNumbersByEPR.isEmpty())
+            return 1;
+        
+        TreeSet sortedNumbers = new TreeSet(_fileNumbersByEPR.values());
+        Integer largest = (Integer)sortedNumbers.last();
+        return largest.intValue() + 1;
+    }
+    
+    protected File getPersistenceLocation()
+    {
+        String path = getInitializationParameter(_PERSISTENCE_LOCATION_PARAM);
+        
+        if (path == null)
+            throw new RuntimeException(_MESSAGES.get("NoPersistenceLocation"));
+        
+        File workingDir = getResourceManager().getEnvironment().getRealDirectory();
+        return new File(workingDir, path);
+    }
+    
+    protected File getResourceTypeDirectory(String contextPath)
+    {
+        File dir = new File(getPersistenceLocation(), contextPath);
+        
+        if (!dir.exists())
+            dir.mkdirs();
+        
+        return dir;
+    }
+
+    public ResourceManager getResourceManager()
+    {
+        return _manager;
+    }
+    
+    public void resourceAdded(EndpointReference epr, Resource resource)
+        throws SoapFault
+    {
+        int nextNumber = getNextFileNumber();
+        String nextFileName = getNextFileName(nextNumber);
+        File resourceTypeDir = getResourceTypeDirectory(resource.getContextPath());
+        File resourceFile = new File(resourceTypeDir, nextFileName); 
+        
+        try
+        {
+            XmlUtils.toFile(epr.toXML(), resourceFile);
+        }
+        
+        catch (IOException error)
+        {
+            throw new SoapFault(error);
+        }
+        
+        _fileNumbersByEPR.put(epr, new Integer(nextNumber));
+    }
+    
+    public void resourceRemoved(EndpointReference epr)
+        throws SoapFault
+    {
+        Integer fileNumber = (Integer)_fileNumbersByEPR.get(epr);
+        FileNumberFilter filter = new FileNumberFilter(fileNumber);
+        
+        String contextPath = getContextPath(epr);
+        File resourceTypeDir = getResourceTypeDirectory(contextPath);
+        File[] results = resourceTypeDir.listFiles(filter);
+        
+        if (results.length == 0)
+        {
+            Object[] filler = { "\n\n" + epr };
+            throw new SoapFault(_MESSAGES.get("NoFileForEPR", filler));
+        }
+        
+        results[0].delete();
+        _fileNumbersByEPR.remove(epr);
+    }
+
+    public void setInitializationParameters(Map parameters)
+    {
+        _parameters = parameters;
+    }
+    
+    public void setResourceManager(ResourceManager manager)
+    {
+        _manager = manager;
+    }
+    
+    private class FileNumberFilter implements FileFilter
+    {
+        private Integer _fileNumber = null;
+        
+        public FileNumberFilter(Integer fileNumber)
+        {
+            _fileNumber = fileNumber;
+        }
+        
+        public boolean accept(File file)
+        {
+            return file.getName().indexOf("-" + _fileNumber + ".xml") >= 0;
+        }
+    }
+    
+    private class ResourceFileFilter implements FileFilter
+    {
+        public boolean accept(File file)
+        {
+            return file.getName().startsWith(_FILE_PREFIX);
+        }
+    }
+}

Modified: webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/Messages.properties
URL: http://svn.apache.org/viewvc/webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/Messages.properties?rev=424806&r1=424805&r2=424806&view=diff
==============================================================================
--- webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/Messages.properties (original)
+++ webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/Messages.properties Sun Jul 23 13:33:43 2006
@@ -16,3 +16,5 @@
 NullAction = The wsa:Action URI is null.
 DestinationUnreachable = There is no resource available at the given EPR: XXXThe existing EPRs hosted by this endpoint are: XXX
 RouterIsInitialized = The resource router has been initialized.
+NoPersistenceLocation = If you use the FilePersistence class as your persistence mechansim, you must provide an initialization parameter (init-param) named 'persistence-location', which is a relative path to the directory storing the router entry files.
+NoFileForEPR = There is no XML file storing a router entry for the following EPR: XXX

Modified: webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/ResourceRouter.java
URL: http://svn.apache.org/viewvc/webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/ResourceRouter.java?rev=424806&r1=424805&r2=424806&view=diff
==============================================================================
--- webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/ResourceRouter.java (original)
+++ webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/ResourceRouter.java Sun Jul 23 13:33:43 2006
@@ -60,6 +60,8 @@
      */
     Logger getLog();
     
+    RouterPersistence getPersistence();
+    
     Collection getResourceDefinitions();
     
     /**
@@ -106,4 +108,6 @@
     void setLog(Logger log);
     
     void setResourceDefinitions(Collection definitions);
+    
+    void setPersistence(RouterPersistence persistence);
 }

Added: webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/RouterPersistence.java
URL: http://svn.apache.org/viewvc/webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/RouterPersistence.java?rev=424806&view=auto
==============================================================================
--- webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/RouterPersistence.java (added)
+++ webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/RouterPersistence.java Sun Jul 23 13:33:43 2006
@@ -0,0 +1,44 @@
+/*=============================================================================*
+ *  Copyright 2006 The Apache Software Foundation
+ *
+ *  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.muse.core.routing;
+
+import org.apache.muse.core.InitializationParameters;
+import org.apache.muse.core.ResourceManager;
+import org.apache.muse.core.ResourceManagerListener;
+import org.apache.muse.ws.addressing.soap.SoapFault;
+
+/**
+ * 
+ * RouterPersistence is an interface for components that will serialize and 
+ * deserialize the routing table (EPRs and resource types) to a persistence 
+ * layer during reboots. It builds on the ResourceManagerListener interface 
+ * for creation and destruction of resource instances and adds its own method 
+ * for re-creating instances on startup.
+ * 
+ * @author Dan Jemiolo (danj)
+ *
+ */
+
+public interface RouterPersistence extends ResourceManagerListener, InitializationParameters
+{
+    void createResources()
+        throws SoapFault;
+    
+    ResourceManager getResourceManager();
+    
+    void setResourceManager(ResourceManager manager);
+}

Modified: webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/SimpleResourceRouter.java
URL: http://svn.apache.org/viewvc/webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/SimpleResourceRouter.java?rev=424806&r1=424805&r2=424806&view=diff
==============================================================================
--- webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/SimpleResourceRouter.java (original)
+++ webservices/muse/trunk/modules/muse-core/src/org/apache/muse/core/routing/SimpleResourceRouter.java Sun Jul 23 13:33:43 2006
@@ -64,6 +64,8 @@
     //
     private Logger _log = null;
     
+    private RouterPersistence _persistence = null;
+    
     private Collection _resourceDefinitions = null;
     
     //
@@ -207,7 +209,28 @@
         _resourceManager.setEnvironment(env);
         _resourceManager.addResourceDefinitions(definitions);
         
-        _resourceManager.createStartupResources();
+        //
+        // add persistence component to manager, if one exists
+        //
+        RouterPersistence persistence = getPersistence();
+        
+        if (persistence != null)
+        {
+            //
+            // first, ask the persistence component to reload any resources 
+            // that were saved last time we shut down
+            //
+            persistence.setResourceManager(_resourceManager);
+            persistence.createResources();
+            
+            //
+            // then add the component as a listener so it can save any new 
+            // resources and cleanup resources that were destroyed
+            //
+            _resourceManager.addListener(persistence);
+        }
+        
+        _resourceManager.initialize();
         
         getLog().info(_MESSAGES.get("RouterIsInitialized"));
         
@@ -270,23 +293,26 @@
      */
     public void shutdown()
     {
-        ResourceManager manager = getResourceManager();
-        Iterator i = manager.getResourceEPRs();
-                
-        while (i.hasNext())
+        try
         {
-            try
-            {
-                Resource next = manager.getResource((EndpointReference)i.next());
-                next.shutdown();
-            }
-            
-            catch (Throwable error)
-            {
-                LoggingUtils.logError(getLog(), error);
-            }
+            getResourceManager().shutdown();
+        }
+        
+        catch (SoapFault error)
+        {
+            LoggingUtils.logError(getLog(), error);
         }
         
         _hasBeenShutdown = true;
+    }
+
+    public RouterPersistence getPersistence()
+    {
+        return _persistence;
+    }
+
+    public void setPersistence(RouterPersistence persistence)
+    {
+        _persistence = persistence;
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: muse-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: muse-commits-help@ws.apache.org