[jboss-cvs] JBossAS SVN: r107944 - in trunk: ejb3/src/main/java/org/jboss/ejb3/deployers and 1 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Sep 2 04:08:11 EDT 2010


Author: jaikiran
Date: 2010-09-02 04:08:10 -0400 (Thu, 02 Sep 2010)
New Revision: 107944

Added:
   trunk/ejb3/src/main/java/org/jboss/ejb3/deployers/EJB3MetadataOnDemandDeploymentDeployer.java
Modified:
   trunk/build/build.xml
   trunk/ejb3/src/resources/META-INF/ejb3-as-deployers-jboss-beans.xml
Log:
JBAS-8380 Deploy timerservice-mk2.jar only when there's a EJB3 deployment

Modified: trunk/build/build.xml
===================================================================
--- trunk/build/build.xml	2010-09-02 01:29:32 UTC (rev 107943)
+++ trunk/build/build.xml	2010-09-02 08:08:10 UTC (rev 107944)
@@ -728,8 +728,10 @@
       
     </copy>
 
-      <mkdir dir="${install.server}/all/deploy/jboss-ejb3-timerservice-mk2.jar"/>
-      <unjar dest="${install.server}/all/deploy/jboss-ejb3-timerservice-mk2.jar">
+      
+      <mkdir dir="${install.common.deploy}/jboss-ejb3-timerservice-mk2.jar"/>
+      <!-- Extract to JBOSS_HOME/common/deploy/jboss-ejb3-timerservice-mk2.jar -->
+      <unjar dest="${install.common.deploy}/jboss-ejb3-timerservice-mk2.jar">
           <fileset refid="org.jboss.ejb3.timerservice:jboss-ejb3-timerservice-mk2:jar"/>
       </unjar>
 

Added: trunk/ejb3/src/main/java/org/jboss/ejb3/deployers/EJB3MetadataOnDemandDeploymentDeployer.java
===================================================================
--- trunk/ejb3/src/main/java/org/jboss/ejb3/deployers/EJB3MetadataOnDemandDeploymentDeployer.java	                        (rev 0)
+++ trunk/ejb3/src/main/java/org/jboss/ejb3/deployers/EJB3MetadataOnDemandDeploymentDeployer.java	2010-09-02 08:08:10 UTC (rev 107944)
@@ -0,0 +1,503 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ejb3.deployers;
+
+import java.net.URI;
+import java.util.Collection;
+import java.util.Collections;
+
+import org.jboss.deployers.spi.DeploymentException;
+import org.jboss.deployers.spi.deployer.DeploymentStages;
+import org.jboss.deployers.spi.deployer.helpers.AbstractDeployer;
+import org.jboss.deployers.structure.spi.DeploymentUnit;
+import org.jboss.ejb3.common.deployers.spi.AttachmentNames;
+import org.jboss.logging.Logger;
+import org.jboss.metadata.ejb.jboss.JBossMetaData;
+import org.jboss.profileservice.profile.metadata.helpers.ProfileMetaDataFactory;
+import org.jboss.profileservice.spi.NoSuchProfileException;
+import org.jboss.profileservice.spi.Profile;
+import org.jboss.profileservice.spi.ProfileKey;
+import org.jboss.profileservice.spi.ProfileService;
+import org.jboss.profileservice.spi.metadata.ProfileMetaData;
+
+/**
+ * Activates a profile on-demand. The presence of a EJB3.x deployment unit in the server
+ * triggers the activation. 
+ * 
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+// Majority of this implementation is inspired (copied ;) ) from org.jboss.web.tomcat.service.ondemand.OnDemandContextProfileManager
+// Forum thread reference: http://community.jboss.org/thread/155800
+// JIRA: https://jira.jboss.org/browse/JBAS-8380
+public class EJB3MetadataOnDemandDeploymentDeployer extends AbstractDeployer
+{
+   /** Logger */
+   private static final Logger log = Logger.getLogger(EJB3MetadataOnDemandDeploymentDeployer.class);
+ 
+   /** The default profile name to be used if no explicit profile name is provided for the on-demand profile */
+   private static final String DEFAULT_EJB3_ONDEMAND_PROFILE_NAME = "EJB3_OnDemand_Profile";
+ 
+   /** The profile service */
+   private ProfileService profileService;
+ 
+   /** The root of the profile */
+   private URI deploymentRoot;
+ 
+   /** The deployment names. */
+   private Collection<String> deploymentNames;
+ 
+   /** Whether this deployer has activated its profile */
+   private boolean activated;
+ 
+   /** The profile service key domain */
+   private String profileDomain;
+ 
+   /** The profile service key server */
+   private String profileServer;
+ 
+   /** The profile service key name */
+   private String profileName;
+ 
+   /** The profile service key */
+   private ProfileKey profileKey;
+ 
+   /** By default, we active the profile on-demand */
+   private boolean activateOnDemand = true;
+ 
+   /**
+    * Instantiate the deployer and setup the {@link DeploymentStages} when
+    * this deployer is expected to run and set the appropriate input for this deployer
+    */
+   public EJB3MetadataOnDemandDeploymentDeployer()
+   {
+      this.setStage(DeploymentStages.POST_CLASSLOADER);
+      this.setInput(JBossMetaData.class);
+      // ordering
+      this.addInput(AttachmentNames.PROCESSED_METADATA);
+   }
+ 
+   /**
+    * Get the deployment root
+    * 
+    * @return the deployment root
+    */
+   public URI getDeploymentRoot()
+   {
+      return deploymentRoot;
+   }
+ 
+   /**
+    * Set the deployment root.
+    * 
+    * @param deploymentRoot the deployment root
+    */
+   public void setDeploymentRoot(URI deploymentRoot)
+   {
+      this.deploymentRoot = deploymentRoot;
+   }
+ 
+   /**
+    * Get the deployment names.
+    * 
+    * @return the deployment names
+    */
+   public Collection<String> getDeploymentNames()
+   {
+      return deploymentNames;
+   }
+ 
+   /**
+    * Set the deployment names
+    * 
+    * @param deploymentNames the deployment names
+    */
+   public void setDeploymentNames(Collection<String> deploymentNames)
+   {
+      this.deploymentNames = deploymentNames;
+   }
+ 
+   /**
+    * Set a single deployment
+    * 
+    * @param name the deployment name
+    */
+   public void setSingleDeployment(String name)
+   {
+      this.deploymentNames = Collections.singleton(name);
+   }
+ 
+   /**
+    * Gets the value that should be used for the 
+    * {@link ProfileKey#getDomain() domain} portion of
+    * the on-demand @{link Profile}'s {@link #getProfileKey() ProfileKey}.
+    * 
+    * @return the domain, or null if not set
+    */
+   public String getProfileDomain()
+   {
+      return profileDomain;
+   }
+ 
+   /**
+    * Sets the value that should be used for the 
+    * {@link ProfileKey#getDomain() domain} portion of
+    * the singleton @{link Profile}'s {@link #getProfileKey() ProfileKey}.
+    * 
+    * @param profileDomain the domain, or null    
+    */
+   public void setProfileDomain(String profileDomain)
+   {
+      this.profileDomain = profileDomain;
+   }
+ 
+   /**
+    * Gets the value that should be used for the 
+    * {@link ProfileKey#getServer() server} portion of
+    * the on-demand @{link Profile}'s {@link #getProfileKey() ProfileKey}.
+    * 
+    * @return the server, or null if not set
+    */
+   public String getProfileServer()
+   {
+      return profileServer;
+   }
+ 
+   /**
+    * Sets the value that should be used for the 
+    * {@link ProfileKey#getServer() server} portion of
+    * the on-demand @{link Profile}'s {@link #getProfileKey() ProfileKey}.
+    * 
+    * @param profileServer the server, or null    
+    */
+   public void setProfileServer(String profileServer)
+   {
+      this.profileServer = profileServer;
+   }
+ 
+   /**
+    * Gets the value that should be used for the 
+    * {@link ProfileKey#getName() name} portion of
+    * the on-demand @{link Profile}'s {@link #getProfileKey() ProfileKey}.
+    * 
+    * @return Returns the profile name if it is set. Else returns {@link #DEFAULT_EJB3_ONDEMAND_PROFILE_NAME}
+    */
+   public String getProfileName()
+   {
+      if (profileName == null)
+      {
+         this.profileName = DEFAULT_EJB3_ONDEMAND_PROFILE_NAME;
+      }
+      return profileName;
+   }
+ 
+   /**
+    * Sets the value that should be used for the 
+    * {@link ProfileKey#getName() name} portion of
+    * the singleton @{link Profile}'s {@link #getProfileKey() ProfileKey}.
+    * 
+    * @param profileName the name, or null    
+    */
+   public void setProfileName(String profileName)
+   {
+      this.profileName = profileName;
+   }
+ 
+   /**
+    * Gets whether this deployer has activated its profile.
+    * 
+    * @return true if {@link #activateProfile()} has successfully
+    *         completed and {@link #releaseProfile()} has not been called;
+    *         false otherwise.
+    */
+   public boolean isActivated()
+   {
+      return activated;
+   }
+ 
+   /**
+    * Sets the ProfileService reference.
+    * 
+    * @param profileService the profileService. Cannot be null     
+    * @throws IllegalArgumentException if profileService is null    
+    */
+   public void setProfileService(ProfileService profileService)
+   {
+      if (profileService == null)
+      {
+         throw new IllegalArgumentException("profileService is null");
+      }
+ 
+      this.profileService = profileService;
+   }
+   
+   /**
+    * Gets whether the profile should be activated on during the {@link #start()}
+    * phase of this bean's deployment rather than on first EJB3.x deployment.
+    * This property allows a simple configuration to turn off the "on-demand"
+    * behavior for environments (e.g. production servers) where a more
+    * deterministic startup is appropriate.
+    * 
+    * @return false if the profile should be activated as part of
+    *         startup of this bean; true if activation should
+    *         be deferred until an EJB3.x deployment is available in the server. 
+    *         Default is true            
+    *
+    */
+   public boolean isActivateOnDemand()
+   {
+      return activateOnDemand;
+   }
+ 
+   /**
+    * Sets whether the profile should be activated on during the {@link #start()}
+    * phase of this bean's deployment rather than on first EJB3.x deployment. 
+    * This property allows a simple configuration to turn off the "on-demand"
+    * behavior for environments (e.g. production servers) where a more
+    * deterministic startup is appropriate.
+    * 
+    * @param activateOnDemand false if the profile should be 
+    *                          activated as part of startup of this bean; 
+    *                          true if activation should be 
+    *                          deferred until an EJB3.x deployment is available in the server.
+    * 
+    */
+   public void setActivateOnDemand(boolean activateOnDemand)
+   {
+      this.activateOnDemand = activateOnDemand;
+   } 
+ 
+   /**
+    * Builds a profile from the  {@link #getDeploymentRoot()} and {@link #getDeploymentNames() list} 
+    * and registers it under the configured {@link #getProfileKey()}.
+    */
+   public void start() throws Exception
+   {
+      if (profileService == null)
+      {
+         throw new IllegalStateException("Must configure ProfileService");
+      }
+ 
+      if (deploymentRoot == null)
+      {
+         throw new IllegalStateException("Must configure deployment root");
+      }
+ 
+      if (deploymentNames == null || deploymentNames.isEmpty())
+      {
+         throw new IllegalStateException("Must configure deployment name(s)");
+      }
+ 
+      // TODO add dependencies on bootstrap profiles 
+      String[] rootSubProfiles = new String[0];
+      // Create a hotdeployment profile
+      // FIXME JBAS-7720 restore hot deploy capability (and make it configurable too)
+      ProfileMetaData profileMetaData = ProfileMetaDataFactory.createFilteredProfileMetaData(getProfileName(),deploymentRoot, this.deploymentNames.toArray(new String[this.deploymentNames.size()]));
+      // register the profile metadata with the profile service
+      this.profileKey = this.profileService.registerProfile(profileMetaData);
+ 
+      // if on-demand is disabled, then just activate it now 
+      if (this.activateOnDemand == false)
+      {
+         // we don't validate as we expect the PS to do it at the end
+         // of startup; need to check if this is correct 
+         activateProfile(false);
+      }
+   }
+ 
+   /**
+    * Unregisters the profile registered in {@link #start()}.
+    */
+   public void stop() throws Exception
+   {
+      ProfileKey profKey = null;
+      try
+      {
+         profKey = getProfileKey();
+      }
+      catch (IllegalStateException e)
+      {
+         return;
+      }
+ 
+      if (profileService != null && profKey != null)
+      {
+         try
+         {
+            // Inactivate first if needed
+            if (profileService.getActiveProfileKeys().contains(profKey))
+            {
+               releaseProfile();
+            }
+ 
+            profileService.unregisterProfile(profKey);
+         }
+         catch (NoSuchProfileException e)
+         {
+            log.warn("Could not unregister unknown profile " + profKey);
+         }
+      }
+   }
+ 
+   /**
+    * Tells the ProfileService to 
+    * {@link ProfileService#activateProfile(ProfileKey) activate the on-demand profile}.
+    */
+   public void activateProfile() throws Exception
+   {
+      activateProfile(true);
+   }
+ 
+   /**
+    * Gets the key for the {@link Profile} that we activate and release.
+    * 
+    * @return the key. Will not return null     
+    * @throws IllegalStateException if {@link #getProfileName()} returns null     
+    * @see #getProfileDomain() 
+    * @see #getProfileServer() 
+    * @see #getProfileName()
+    */
+   public ProfileKey getProfileKey()
+   {
+      if (this.profileKey == null)
+      {
+         String profileName = getProfileName();
+         if (profileName == null)
+         {
+            throw new IllegalStateException("Must configure profileName or contextName before calling getProfileKey()");
+         }
+         // create the ProfileKey
+         this.profileKey = new ProfileKey(getProfileDomain(), getProfileServer(), profileName);
+      }
+      return this.profileKey;
+   }
+ 
+   /**
+    * First checks whether the on-demand profile is already activated. If yes, then this method
+    * returns immediately. If the profile hasn't yet been activated, the method then checks 
+    * whether the <code>unit</code> is a EJB3.x deployment. If not, the method returns immediately.
+    * <p>
+    *   For EJB3.x deployments, this method then activates the on-demand {@link Profile} containing the
+    *   on-demand deployments
+    * </p>
+    * 
+    * @param unit The {@link DeploymentUnit} currently being deployed
+    * @throws DeploymentException
+    */
+   @Override
+   public void deploy(DeploymentUnit unit) throws DeploymentException
+   {
+      if (this.isActivated())
+      {
+         return;
+      }
+      // get the metadata
+      JBossMetaData metadata = unit.getAttachment(JBossMetaData.class);
+ 
+      if (metadata.isEJB3x() == false)
+      {
+         return;
+      }
+      
+      // activate the on-demand profile
+      try
+      {
+         this.activateProfile(true);
+      }
+      catch (Exception e)
+      {
+         throw new DeploymentException("Could not activate on-demand profile: " + this.getProfileName()
+               + " while deploying unit: " + unit);
+      }
+   }
+ 
+   /**
+    * Activates the on-demand {@link Profile}
+    * 
+    * @param validate If true, then the {@link Profile} is validated after being activated
+    * @throws Exception
+    */
+   private synchronized void activateProfile(boolean validate) throws Exception
+   {
+      if (this.profileService == null)
+      {
+         throw new IllegalStateException("Must configure the ProfileService");
+      }
+      
+      ProfileKey profKey = getProfileKey();
+      
+      // only activate the profile if it's *not* already activated
+      if (this.profileService.getActiveProfileKeys().contains(profKey) == false)
+      {
+         if (log.isDebugEnabled())
+         {
+            log.debug("Activating on-demand profile: " + profKey);
+         }
+         // activate
+         this.profileService.activateProfile(profKey);
+         
+         if (validate)
+         {
+            if (log.isDebugEnabled())
+            {
+               log.debug("Validating on-demand profile: " + profKey);
+            }
+            
+            // Validate if the activation was successful
+            this.profileService.validateProfile(profKey);
+         }
+ 
+         this.activated = true;
+      }
+      else
+      {
+         if (log.isDebugEnabled())
+         {
+            log.debug("Profile " + profKey + " is already activated");
+         }
+         this.activated = true;
+      }
+ 
+   }
+ 
+   /**
+    * Tells the ProfileService to {@link ProfileService#releaseProfile(ProfileKey) release the profile}. 
+    * 
+    */
+   private synchronized void releaseProfile() throws Exception
+   {
+      if (this.activated)
+      {
+         try
+         {
+            this.profileService.deactivateProfile(getProfileKey());
+         }
+         catch (NoSuchProfileException e)
+         {
+            log.warn("Can't deactivate profile since no Profile is registered under key " + getProfileKey());
+         }
+ 
+         this.activated = false;
+      }
+   }
+ 
+}
\ No newline at end of file

Modified: trunk/ejb3/src/resources/META-INF/ejb3-as-deployers-jboss-beans.xml
===================================================================
--- trunk/ejb3/src/resources/META-INF/ejb3-as-deployers-jboss-beans.xml	2010-09-02 01:29:32 UTC (rev 107943)
+++ trunk/ejb3/src/resources/META-INF/ejb3-as-deployers-jboss-beans.xml	2010-09-02 08:08:10 UTC (rev 107944)
@@ -269,5 +269,36 @@
             <parameter class="java.lang.String">jms-ra.rar</parameter>
         </constructor>
     </bean>
+    
+    <!-- The EJB3MetadataOnDemandDeploymentDeployer activates on-demand profile containing the specified deployments
+        
+     -->
+    <bean name="EJB3MetadataOnDemandDeploymentDeployer" class="org.jboss.ejb3.deployers.EJB3MetadataOnDemandDeploymentDeployer">
+      
+      <property name="profileService"><inject bean="jboss.profileservice:service=ProfileService"/></property>
+ 
+      <!-- Build a profile from the contents of this single URI -->
+      <property name="deploymentRoot">${jboss.common.base.url}deploy</property>
+      
+      <!--  We just have a single on-demand deployment - the jboss-ejb3-timerservice-mk2.jar
+        Note: If there are multiple deployments which need to be deployed on-demand, then 
+        set the "deploymentNames" collection property *instead of* "singleDeployment"
+        property
+       -->
+      <property name="singleDeployment">jboss-ejb3-timerservice-mk2.jar</property>
+      
+      <!-- 
+        Whether activation of the profile (i.e. deployment of the URI contents)
+        should be deferred until the first EJB3.x deployment (true) or done as part of
+        the start of this bean (false).
+        
+        WARNING: This configuration option may be altered in a subsequent AS 6.0
+        milestone release.
+        
+        FIXME: https://jira.jboss.org/jira/browse/JBAS-7714        
+        -->
+      <property name="activateOnDemand">${jboss.as.deployment.ondemand:true}</property>
 
+   </bean>
+
 </deployment>



More information about the jboss-cvs-commits mailing list