You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@synapse.apache.org by ru...@apache.org on 2010/02/13 13:25:03 UTC

svn commit: r909803 - in /synapse/trunk/java: modules/core/src/main/java/org/apache/synapse/config/xml/ modules/core/src/main/java/org/apache/synapse/deployers/ repository/conf/

Author: ruwan
Date: Sat Feb 13 12:25:01 2010
New Revision: 909803

URL: http://svn.apache.org/viewvc?rev=909803&view=rev
Log:
Further HotDeployment updates, HotDeployment is mostly completed, HotUpdate to be supported

Added:
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/FileNameToArtifactNameHolder.java
Modified:
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/MultiXMLConfigurationBuilder.java
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/AbstractSynapseArtifactDeployer.java
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/EndpointDeployer.java
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/EventSourceDeployer.java
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/LocalEntryDeployer.java
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/ProxyServiceDeployer.java
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/SequenceDeployer.java
    synapse/trunk/java/repository/conf/axis2.xml

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/MultiXMLConfigurationBuilder.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/MultiXMLConfigurationBuilder.java?rev=909803&r1=909802&r2=909803&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/MultiXMLConfigurationBuilder.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/MultiXMLConfigurationBuilder.java Sat Feb 13 12:25:01 2010
@@ -30,7 +30,7 @@
 import org.apache.synapse.config.SynapseConfigUtils;
 import org.apache.synapse.config.SynapseConfiguration;
 import org.apache.synapse.core.axis2.ProxyService;
-import org.apache.synapse.endpoints.AbstractEndpoint;
+import org.apache.synapse.deployers.FileNameToArtifactNameHolder;
 import org.apache.synapse.endpoints.Endpoint;
 import org.apache.synapse.eventing.SynapseEventSource;
 import org.apache.synapse.mediators.base.SequenceMediator;
@@ -168,6 +168,8 @@
                     Entry entry = SynapseXMLConfigurationFactory.defineEntry(
                             synapseConfig, document);
                     entry.setFileName(file.getName());
+                    FileNameToArtifactNameHolder.getInstance().addArtifact(
+                            file.getAbsolutePath(), entry.getKey());
                 } catch (FileNotFoundException ignored) {}
             }
         }
@@ -188,6 +190,8 @@
                     ProxyService proxy = SynapseXMLConfigurationFactory.defineProxy(
                             synapseConfig, document);
                     proxy.setFileName(file.getName());
+                    FileNameToArtifactNameHolder.getInstance().addArtifact(
+                            file.getAbsolutePath(), proxy.getName());
                 } catch (FileNotFoundException ignored) {}
             }
         }
@@ -210,6 +214,8 @@
                     if (startup instanceof AbstractStartup) {
                         ((AbstractStartup) startup).setFileName(file.getName());
                     }
+                    FileNameToArtifactNameHolder.getInstance().addArtifact(
+                            file.getAbsolutePath(), startup.getName());
                 } catch (FileNotFoundException ignored) {}
             }
         }
@@ -230,7 +236,10 @@
                     Mediator seq = SynapseXMLConfigurationFactory.defineSequence(
                             synapseConfig, document);
                     if (seq instanceof SequenceMediator) {
-                        ((SequenceMediator) seq).setFileName(file.getName());
+                        SequenceMediator sequence = (SequenceMediator) seq;
+                        sequence.setFileName(file.getName());
+                        FileNameToArtifactNameHolder.getInstance().addArtifact(
+                                file.getAbsolutePath(), sequence.getName());
                     }
                 } catch (FileNotFoundException ignored) {}
             }
@@ -251,9 +260,9 @@
                     OMElement document = parseFile(file);
                     Endpoint endpoint = SynapseXMLConfigurationFactory.defineEndpoint(
                             synapseConfig, document);
-                    if (endpoint instanceof AbstractEndpoint) {
-                        ((AbstractEndpoint) endpoint).setFileName(file.getName());
-                    }
+                    endpoint.setFileName(file.getName());
+                    FileNameToArtifactNameHolder.getInstance().addArtifact(
+                            file.getAbsolutePath(), endpoint.getName());
                 } catch (FileNotFoundException ignored) {}
             }
         }
@@ -274,6 +283,8 @@
                     SynapseEventSource eventSource = SynapseXMLConfigurationFactory.
                             defineEventSource(synapseConfig, document);
                     eventSource.setFileName(file.getName());
+                    FileNameToArtifactNameHolder.getInstance().addArtifact(
+                            file.getAbsolutePath(), eventSource.getName());
                 } catch (FileNotFoundException ignored) {}
            }
         }
@@ -294,6 +305,8 @@
                     PriorityExecutor executor = SynapseXMLConfigurationFactory.
                             defineExecutor(synapseConfig, document);
                     executor.setFileName(file.getName());
+                    FileNameToArtifactNameHolder.getInstance().addArtifact(
+                            file.getAbsolutePath(), executor.getName());
                 } catch (FileNotFoundException ignored) {}
            }
         }

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/AbstractSynapseArtifactDeployer.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/AbstractSynapseArtifactDeployer.java?rev=909803&r1=909802&r2=909803&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/AbstractSynapseArtifactDeployer.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/AbstractSynapseArtifactDeployer.java Sat Feb 13 12:25:01 2010
@@ -28,6 +28,10 @@
 import org.apache.axis2.deployment.DeploymentException;
 import org.apache.axis2.deployment.repository.util.DeploymentFileData;
 import org.apache.axis2.description.Parameter;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.synapse.ServerManager;
+import org.apache.synapse.ServerState;
 import org.apache.synapse.SynapseConstants;
 import org.apache.synapse.config.SynapseConfiguration;
 import org.apache.synapse.core.SynapseEnvironment;
@@ -51,14 +55,10 @@
  */
 public abstract class AbstractSynapseArtifactDeployer implements Deployer {
 
+    private static final Log log = LogFactory.getLog(AbstractSynapseArtifactDeployer.class);
     protected ConfigurationContext cfgCtx;
 
     /**
-     * Keeps track of the deployed artifacts in the synapse environment 
-     */
-    private Map<String, String> fileName2ArtifactName = new HashMap<String, String>();
-
-    /**
      * Initializes the Synapse artifact deployment
      * 
      * @param configCtx Axis2 ConfigurationContext
@@ -73,12 +73,23 @@
      * artifact deployers.
      *
      * @param deploymentFileData file to be used for the deployment
-     * @throws DeploymentException incase of an error in deploying the file
+     * @throws DeploymentException in-case of an error in deploying the file
      * 
      * @see org.apache.synapse.deployers.AbstractSynapseArtifactDeployer#deploySynapseArtifact(
      * org.apache.axiom.om.OMElement, String)
      */
     public void deploy(DeploymentFileData deploymentFileData) throws DeploymentException {
+
+        if (ServerManager.getInstance().getServerState() != ServerState.STARTED) {
+            // synapse server has not yet being started
+            if (log.isDebugEnabled()) {
+                log.debug("Skipped the artifact deployment (since the Synapse " +
+                        "server doesn't seem to be started yet), from file : "
+                        + deploymentFileData.getAbsolutePath());
+            }
+            return;
+        }
+
         String filename = deploymentFileData.getAbsolutePath();
         try {
             InputStream in = new FileInputStream(filename);
@@ -89,7 +100,7 @@
                         StAXUtils.createXMLStreamReader(in)).getDocumentElement();
                 String artifatcName = deploySynapseArtifact(element, filename);
                 if (artifatcName != null) {
-                    fileName2ArtifactName.put(filename, artifatcName);
+                    FileNameToArtifactNameHolder.getInstance().addArtifact(filename, artifatcName);
                 }
             } finally {
                 in.close();
@@ -117,8 +128,14 @@
      * @see org.apache.synapse.deployers.AbstractSynapseArtifactDeployer#undeploySynapseArtifact(String) 
      */
     public void unDeploy(String fileName) throws DeploymentException {
-        undeploySynapseArtifact(fileName2ArtifactName.get(fileName));
-        fileName2ArtifactName.remove(fileName);
+        FileNameToArtifactNameHolder holder = FileNameToArtifactNameHolder.getInstance();
+        if (holder.containsFileName(fileName)) {
+            undeploySynapseArtifact(holder.getArtifactNameForFile(fileName));
+            holder.removeArtifactWithFileName(fileName);
+        } else {
+            throw new DeploymentException("Artifact representing the filename " + fileName
+                    + " is not deployed on Synapse");
+        }
     }
 
     // We do not support dynamically setting the directory nor the extension

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/EndpointDeployer.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/EndpointDeployer.java?rev=909803&r1=909802&r2=909803&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/EndpointDeployer.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/EndpointDeployer.java Sat Feb 13 12:25:01 2010
@@ -57,6 +57,8 @@
                 if (log.isDebugEnabled()) {
                     log.debug("Endpoint Deployment from file : " + fileName + " : Completed");
                 }
+                log.info("Endpoint named '" + ep.getName()
+                        + "' has been deployed from file : " + fileName);
                 return ep.getName();
             } else {
                 log.error("Endpoint Deployment Failed. The artifact described in the file "

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/EventSourceDeployer.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/EventSourceDeployer.java?rev=909803&r1=909802&r2=909803&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/EventSourceDeployer.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/EventSourceDeployer.java Sat Feb 13 12:25:01 2010
@@ -57,6 +57,8 @@
                 if (log.isDebugEnabled()) {
                     log.debug("EventSource Deployment from file : " + fileName + " : Completed");
                 }
+                log.info("EventSource named '" + es.getName()
+                        + "' has been deployed from file : " + fileName);
                 return es.getName();
             } else {
                 log.error("EventSource Deployment Failed. The artifact described in the file "

Added: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/FileNameToArtifactNameHolder.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/FileNameToArtifactNameHolder.java?rev=909803&view=auto
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/FileNameToArtifactNameHolder.java (added)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/FileNameToArtifactNameHolder.java Sat Feb 13 12:25:01 2010
@@ -0,0 +1,109 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.synapse.deployers;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Keeps track of the artifacts deployed with files inside the synapse repository</p>
+ *
+ * <p>For hot deployment to properly work we need to, keep track fo not only the artifacts
+ * deployed by deployers but also the artifacts deployed from files at the startup as well. Otherwise
+ * it is not possible to track the hot update cases. This is introduced as a <code>singleton</code>
+ * for the startup to report back for the deployed artifacts at startup apart from the deployers.</p>
+ *
+ * @see org.apache.synapse.deployers.AbstractSynapseArtifactDeployer
+ * @see org.apache.synapse.config.xml.MultiXMLConfigurationBuilder
+ */
+public class FileNameToArtifactNameHolder {
+
+    /**
+     * Keeps track of the deployed artifacts in the synapse environment
+     */
+    private static Map<String, String> fileName2ArtifactName = new HashMap<String, String>();
+
+    private static FileNameToArtifactNameHolder _instance;
+
+    private static final Log log = LogFactory.getLog(FileNameToArtifactNameHolder.class);
+    
+    private FileNameToArtifactNameHolder() {}
+
+    /**
+     * Provides the <code>singleton</code> instance of
+     * {@link org.apache.synapse.deployers.FileNameToArtifactNameHolder}
+     *
+     * @return the singleton instance of FileNameToArtifactNameHolder 
+     */
+    public static FileNameToArtifactNameHolder getInstance() {
+        
+        if (_instance == null) {
+            _instance = new FileNameToArtifactNameHolder();
+        }
+        return _instance;
+    }
+
+    /**
+     * Adds artifacts indexed with the respective filename
+     * 
+     * @param fileName name of the file from which the artifact being added is loaded
+     * @param artifactName name of the artifact being added
+     */
+    public void addArtifact(String fileName, String artifactName) {
+
+        if (!fileName2ArtifactName.containsKey(fileName)) {
+            fileName2ArtifactName.put(fileName, artifactName);
+        } else {
+            log.error("An artifact has already been loaded from the file : " + fileName);
+        }
+    }
+
+    /**
+     * Checks whether there is an artifact indexed with the given <code>filename</code>
+     * 
+     * @param fileName artifact filename to be checked for the existence
+     * @return boolean <code>true</code> if it is available, <code>false</code> if not
+     */
+    public boolean containsFileName(String fileName) {
+        return fileName2ArtifactName.containsKey(fileName);
+    }
+
+    /**
+     * Retrieves the artifact name indexed with the given <code>filename</code>
+     *
+     * @param fileName name of the file which maps to the artifact
+     * @return String artifact name mapped with the give <code>filename</code>
+     */
+    public String getArtifactNameForFile(String fileName) {
+        return fileName2ArtifactName.get(fileName);
+    }
+
+    /**
+     * Removes the indexed artifacts to the <code>filename</code> mapping from the holder
+     * 
+     * @param fileName name of the file of which the artifact required to be removed
+     */
+    public void removeArtifactWithFileName(String fileName) {
+        fileName2ArtifactName.remove(fileName);
+    }
+}

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/LocalEntryDeployer.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/LocalEntryDeployer.java?rev=909803&r1=909802&r2=909803&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/LocalEntryDeployer.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/LocalEntryDeployer.java Sat Feb 13 12:25:01 2010
@@ -53,6 +53,8 @@
                 if (log.isDebugEnabled()) {
                     log.debug("LocalEntry Deployment from file : " + fileName + " : Completed");
                 }
+                log.info("LocalEntry named '" + e.getKey()
+                        + "' has been deployed from file : " + fileName);
                 return e.getKey();
             } else {
                 log.error("LocalEntry Deployment Failed. The artifact described in the file "

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/ProxyServiceDeployer.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/ProxyServiceDeployer.java?rev=909803&r1=909802&r2=909803&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/ProxyServiceDeployer.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/ProxyServiceDeployer.java Sat Feb 13 12:25:01 2010
@@ -77,6 +77,8 @@
                 if (log.isDebugEnabled()) {
                     log.debug("ProxyService Deployment from file : " + fileName + " : Completed");
                 }
+                log.info("ProxyService named '" + proxy.getName()
+                        + "' has been deployed from file : " + fileName);
                 return proxy.getName();
             } else {
                 log.error("ProxyService Deployment Failed. The artifact described in the file "

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/SequenceDeployer.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/SequenceDeployer.java?rev=909803&r1=909802&r2=909803&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/SequenceDeployer.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/deployers/SequenceDeployer.java Sat Feb 13 12:25:01 2010
@@ -23,6 +23,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.synapse.Mediator;
+import org.apache.synapse.SynapseConstants;
 import org.apache.synapse.config.xml.MediatorFactoryFinder;
 import org.apache.synapse.mediators.base.SequenceMediator;
 
@@ -59,6 +60,8 @@
                 if (log.isDebugEnabled()) {
                     log.debug("Sequence Deployment from file : " + fileName + " : Completed");
                 }
+                log.info("Sequence named '" + seq.getName()
+                        + "' has been deployed from file : " + fileName);
                 return seq.getName();
             } else {
                 log.error("Sequence Deployment Failed. The artifact described in the file "
@@ -83,6 +86,11 @@
             SequenceMediator seq
                     = getSynapseConfiguration().getDefinedSequences().get(artifactName);
             if (seq != null) {
+                if (SynapseConstants.MAIN_SEQUENCE_KEY.equals(seq.getName())
+                        || SynapseConstants.FAULT_SEQUENCE_KEY.equals(seq.getName())) {
+                    log.error("Cannot Undeploy the " + seq.getName() + " sequence");
+                    return;
+                }
                 getSynapseConfiguration().removeSequence(artifactName);
                 if (log.isDebugEnabled()) {
                     log.debug("Destroying the sequence named : " + artifactName);

Modified: synapse/trunk/java/repository/conf/axis2.xml
URL: http://svn.apache.org/viewvc/synapse/trunk/java/repository/conf/axis2.xml?rev=909803&r1=909802&r2=909803&view=diff
==============================================================================
--- synapse/trunk/java/repository/conf/axis2.xml (original)
+++ synapse/trunk/java/repository/conf/axis2.xml Sat Feb 13 12:25:01 2010
@@ -21,7 +21,10 @@
     <!-- ================================================= -->
     <!-- Parameters -->
     <!-- ================================================= -->
-    <parameter name="hotdeployment">false</parameter>
+
+    <!-- WARNING: Hot deployment is turned on by default, but it is highly recommended to set this to false
+            on production environments, unless you really want to use hot deployment in production -->
+    <parameter name="hotdeployment">true</parameter>
     <parameter name="hotupdate">false</parameter>
     <parameter name="enableMTOM">false</parameter>
     <parameter name="enableSwA">false</parameter>
@@ -77,6 +80,14 @@
          ***** Uncomment the following line to enable (hot) deployment of Synapse extensions (mediators and startups) ***** -->
     <!--<deployer extension="xar" directory="extensions" class="org.apache.synapse.core.axis2.ExtensionDeployer"/>-->
 
+    <!-- WARNING: Synapse Artifact Deployers, it is highly recommended to comment out these deployers in production
+                unless you really want to use hot deployment/update -->
+    <deployer extension="xml" directory="conf/synapse-config/sequences" class="org.apache.synapse.deployers.SequenceDeployer"/>
+    <deployer extension="xml" directory="conf/synapse-config/endpoints" class="org.apache.synapse.deployers.EndpointDeployer"/>
+    <deployer extension="xml" directory="conf/synapse-config/local-entries" class="org.apache.synapse.deployers.LocalEntryDeployer"/>
+    <deployer extension="xml" directory="conf/synapse-config/proxy-services" class="org.apache.synapse.deployers.ProxyServiceDeployer"/>
+    <deployer extension="xml" directory="conf/synapse-config/event-sources" class="org.apache.synapse.deployers.EventSourceDeployer"/>
+
     <!-- Following parameter will set the host name for the epr-->
     <!--<parameter name="hostname" locked="true">myhost.com</parameter>-->