[jboss-cvs] JBossAS SVN: r62558 - trunk/server/src/main/org/jboss/deployment/security.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Apr 25 11:10:11 EDT 2007


Author: anil.saldhana at jboss.com
Date: 2007-04-25 11:10:11 -0400 (Wed, 25 Apr 2007)
New Revision: 62558

Added:
   trunk/server/src/main/org/jboss/deployment/security/PolicyConfigurationFacade.java
   trunk/server/src/main/org/jboss/deployment/security/PolicyConfigurationFacadeMBean.java
Modified:
   trunk/server/src/main/org/jboss/deployment/security/JaccPolicy.java
   trunk/server/src/main/org/jboss/deployment/security/JaccPolicyMBean.java
   trunk/server/src/main/org/jboss/deployment/security/JaccPolicyUtil.java
   trunk/server/src/main/org/jboss/deployment/security/SecurityDeployer.java
Log:
JBAS-4348: Jacc related work moved to security deployer

Modified: trunk/server/src/main/org/jboss/deployment/security/JaccPolicy.java
===================================================================
--- trunk/server/src/main/org/jboss/deployment/security/JaccPolicy.java	2007-04-25 15:08:18 UTC (rev 62557)
+++ trunk/server/src/main/org/jboss/deployment/security/JaccPolicy.java	2007-04-25 15:10:11 UTC (rev 62558)
@@ -21,21 +21,12 @@
   */
 package org.jboss.deployment.security;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List; 
-
 import javax.security.jacc.PolicyConfiguration;
 import javax.security.jacc.PolicyConfigurationFactory;
 import javax.security.jacc.PolicyContextException;
 
-import org.jboss.deployers.spi.deployer.DeploymentUnit;
-import org.jboss.ejb.EJBPermissionMapping;
 import org.jboss.logging.Logger;
-import org.jboss.metadata.BeanMetaData;
 import org.jboss.metadata.MetaData;
-import org.jboss.metadata.WebMetaData;
-import org.jboss.web.WebPermissionMapping;
 
 //$Id$
 
@@ -51,30 +42,32 @@
    private boolean trace = log.isTraceEnabled();
    
    private PolicyConfiguration parentPC = null;
-   private String contextID = null;
+   private String contextID = null;  
+    
+   private MetaData metaData; 
    
-   /** List of contextIds for all sub deployments that are jacc capable **/
-   private List<String> subDeployments = new ArrayList<String>();
+   private Boolean standaloneDeployment = Boolean.FALSE;
+    
    
-   public static String BASE_OBJECT_NAME = "jboss:service=jacc,id=";
-   
-   /** Original list of jacc sub deployments **/
-   private int jaccDeploymentsCount = 0; 
-   
    /**
     * Ctr
     * @param id Jacc Context Id for the top level deployment
     * @throws IllegalArgumentException if id passed is null
     */
-   public JaccPolicy(String id, DeploymentUnit unit, Collection<String> ignoreSuffix)
+   public JaccPolicy(String id)
    {
       if(id == null)
          throw new IllegalArgumentException("Jacc Context Id passed is null");
-      this.contextID = id; 
-      subDeployments.addAll(JaccPolicyUtil.getJaccDeployments(unit, ignoreSuffix));
-      jaccDeploymentsCount = subDeployments.size();
+      this.contextID = id;  
    }
    
+   public JaccPolicy(String id, MetaData metaData, Boolean standaloneDeployment)
+   {
+      this(id);
+      this.metaData = metaData; 
+      this.standaloneDeployment = standaloneDeployment;
+   }
+   
    /**
     * @see JaccPolicyMBean#create()
     */
@@ -89,24 +82,42 @@
       {
          throw new RuntimeException("Cannot initialize policy configuration:",e);
       } 
+      if(this.standaloneDeployment == Boolean.TRUE)
+      {
+         try
+         {
+            JaccPolicyUtil.createPermissions(parentPC, metaData);
+         }
+         catch (PolicyContextException e)
+         {
+
+            throw new RuntimeException("Cannot create permissions:",e);
+         }
+      }
    }
    
    /**
     * @see JaccPolicyMBean#destroy()
     */
    public void destroy()
-   { 
+   {  
+      parentPC= null; 
    }
 
    /**
     * @see JaccPolicyMBean#start()
     */
    public void start()
-   { 
-      /**
-       * We cannot start the policy configuration until all the subdeployments
-       * have linked
-       */
+   {  
+      //All the sub deployments have started
+      try
+      {
+         parentPC.commit();
+      }
+      catch (PolicyContextException e)
+      {
+         log.error("Cannot commit Parent Policy Configuration:",e);
+      }
    }
 
    /**
@@ -114,76 +125,24 @@
     */
    public void stop()
    {  
-   }
-   
-   /**
-    * @see JaccPolicyMBean#createPermissions(MetaData, String, PolicyConfiguration)
-    */
-   public PolicyConfiguration createPermissions(MetaData metadata, String jaccID,
-         PolicyConfiguration pc)
-   throws PolicyContextException
-   { 
-      if(metadata instanceof WebMetaData)
+      try
       {
-         WebMetaData wmd = (WebMetaData)metadata; 
-         if(pc == null)
-            pc = createPolicyConfiguration(jaccID, true);
-         WebPermissionMapping.createPermissions(wmd, pc); 
+         this.parentPC.delete();
       }
-      else
-         if(metadata instanceof BeanMetaData)
-         {
-            BeanMetaData bmd = (BeanMetaData)metadata; 
-            if(pc == null)
-               pc = createPolicyConfiguration(jaccID, true); 
-            EJBPermissionMapping.createPermissions(bmd, pc); 
-         } 
-         else
-            throw new IllegalStateException("Unknown metadata");
-      return pc;
-   }
-    
+      catch (PolicyContextException e)
+      {
+         throw new RuntimeException(e);
+      }
+   } 
    
+   
    /**
     * @see JaccPolicyMBean#link(PolicyConfiguration)
     */
    public void link(PolicyConfiguration pc) throws PolicyContextException
-   { 
-      if(jaccDeploymentsCount == 0)
-         return; //There is just one deployment and the component deployment will commit
-      
+   {  
       if(trace)
          log.trace("Linking " + pc + " to parent pc=" +  parentPC);
-      parentPC.linkConfiguration(pc);
-      this.subDeployments.remove(pc.getContextID());
-      if(this.subDeployments.size() == 0)
-      {
-         parentPC.commit(); //Ready to be inService 
-      }
-   }
-   
-   /**
-    * Create a Policy Configuration from the factory
-    * @param jaccid Jacc Context ID
-    * @param removeAllPerms Whether the policy configuration that is obtained
-    * needs to be a fresh one (such that old permissions are removed)
-    * @return policy configuration
-    * @throws RuntimeException initialization of PC fails
-    */
-   private PolicyConfiguration createPolicyConfiguration(String jaccid, boolean removeAllPerms)
-   { 
-      if(jaccid == null)
-         throw new IllegalArgumentException("Jacc id is null");
-      PolicyConfiguration pc = null;
-      try
-      {
-         PolicyConfigurationFactory pcf = PolicyConfigurationFactory.getPolicyConfigurationFactory();
-         pc = pcf.getPolicyConfiguration(jaccid, removeAllPerms);
-      }
-      catch(Exception e)
-      {
-         throw new RuntimeException("Cannot initialize policy configuration:",e);
-      } 
-      return pc;
-   }
+      parentPC.linkConfiguration(pc); 
+   } 
 }

Modified: trunk/server/src/main/org/jboss/deployment/security/JaccPolicyMBean.java
===================================================================
--- trunk/server/src/main/org/jboss/deployment/security/JaccPolicyMBean.java	2007-04-25 15:08:18 UTC (rev 62557)
+++ trunk/server/src/main/org/jboss/deployment/security/JaccPolicyMBean.java	2007-04-25 15:10:11 UTC (rev 62558)
@@ -24,8 +24,6 @@
 import javax.security.jacc.PolicyConfiguration;
 import javax.security.jacc.PolicyContextException;
 
-import org.jboss.metadata.MetaData;
-
 //$Id$
 
 /**
@@ -39,21 +37,9 @@
    public void create();
    public void destroy(); 
    public void start();
-   public void stop();
+   public void stop(); 
    
    /**
-    * Create the permissions from the metadata passed
-    * @param metadata WebMetaData,BeanMetaData etc
-    * @param jaccID Jacc Context ID
-    * @param pc Prebuilt policy configuration or pass null to create a fresh one
-    * @return Policy Configuration that is populated with the permissions
-    * @throws PolicyContextException
-    * @throws RuntimeException if the metadata is unknown
-    */
-   public PolicyConfiguration createPermissions(MetaData metadata, String jaccID,
-         PolicyConfiguration pc) throws PolicyContextException;
-   
-   /**
     * Link the policy Configuration with the top-level policy configuration
     * @param pc 
     * @throws PolicyContextException

Modified: trunk/server/src/main/org/jboss/deployment/security/JaccPolicyUtil.java
===================================================================
--- trunk/server/src/main/org/jboss/deployment/security/JaccPolicyUtil.java	2007-04-25 15:08:18 UTC (rev 62557)
+++ trunk/server/src/main/org/jboss/deployment/security/JaccPolicyUtil.java	2007-04-25 15:10:11 UTC (rev 62558)
@@ -23,13 +23,21 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
+import javax.security.jacc.PolicyConfiguration;
+import javax.security.jacc.PolicyContextException;
+
 import org.jboss.deployers.spi.deployer.DeploymentUnit;
 import org.jboss.deployers.spi.structure.DeploymentContext;
-import org.jboss.system.metadata.ServiceAttributeMetaData;
-import org.jboss.system.metadata.ServiceDependencyValueMetaData;
+import org.jboss.ejb.EJBPermissionMapping;
+import org.jboss.metadata.ApplicationMetaData;
+import org.jboss.metadata.BeanMetaData;
+import org.jboss.metadata.MetaData;
+import org.jboss.metadata.WebMetaData;
+import org.jboss.web.WebPermissionMapping;
 
 //$Id$
 
@@ -42,17 +50,6 @@
  */
 public class JaccPolicyUtil
 {   
-   /**
-    * Given the current deployment, get the object name of the jaccpolicy
-    * that is driving the top-level deployment
-    * @param unit
-    * @return
-    */
-   public static String getJaccPolicyServiceName(DeploymentUnit unit)
-   {
-      DeploymentUnit du = getTopLevelDeployment(unit);  
-      return JaccPolicy.BASE_OBJECT_NAME + du.getSimpleName();
-   }
    
    /**
     * Given a deployment unit, get all the deployments underneath
@@ -89,30 +86,10 @@
            list.add(childName);  
       }
       return list;
-   }
+   } 
    
-   /**
-    * Get the service attribute metadata that will add dependence on the JaccPolicy
-    * @param unit
-    * @return
-    */
-   public static void getServiceAttributeMetaData(DeploymentUnit unit,
-         List<ServiceAttributeMetaData> attrs)
-   {
-      if( unit.getAttachment("jboss.jaccpolicy") != null )
-      {
-         ServiceAttributeMetaData jaccAttr = new ServiceAttributeMetaData();
-         jaccAttr.setName("JaccPolicy");
-         ServiceDependencyValueMetaData jaccDepends = new ServiceDependencyValueMetaData();
-         jaccDepends.setDependency(getJaccPolicyServiceName(unit));
-         jaccDepends.setProxyType("attribute");
-         jaccAttr.setValue(jaccDepends);
-         attrs.add(jaccAttr);
-      }
-   }
-   
    //TODO:Replace with ejb3 deployment logic
-   private static boolean isEJBDeployment(DeploymentUnit du)
+   public static boolean isEJBDeployment(DeploymentUnit du)
    {
       boolean ejbxml = du.getMetaDataFile("ejb-jar.xml") != null;
       boolean jbossxml = du.getMetaDataFile("jboss.xml") != null;
@@ -120,20 +97,41 @@
    } 
    
    /**
-    * Given a deployment unit, return the top-level deployment unit
-    * @param unit
-    * @return
+    * Create the JACC Permissions and add to the policy configuration passed
+    * @param policyConfiguration
+    * @param metadata
+    * @throws PolicyContextException
     */
-   private static DeploymentUnit getTopLevelDeployment(DeploymentUnit unit)
+   public static void createPermissions(PolicyConfiguration policyConfiguration, MetaData metadata)
+   throws PolicyContextException
    {
-      DeploymentUnit tempDU = unit;
-      DeploymentUnit toplevel = tempDU.getParent();
-
-      if(toplevel != null)
+      if(metadata == null)
+         throw new IllegalArgumentException("Meta Data is null");
+      if(policyConfiguration == null)
+         throw new IllegalArgumentException("Policy Configuration is null");
+      
+      if(metadata instanceof WebMetaData)
       {
-         tempDU = toplevel;
-         toplevel = tempDU.getParent();
+         WebMetaData wmd = (WebMetaData)metadata;  
+         WebPermissionMapping.createPermissions(wmd, policyConfiguration); 
       }
-      return tempDU; 
-   } 
+      else
+         if(metadata instanceof BeanMetaData)
+         {
+            BeanMetaData bmd = (BeanMetaData)metadata;  
+            EJBPermissionMapping.createPermissions(bmd, policyConfiguration); 
+         } 
+         else
+            if(metadata instanceof ApplicationMetaData)
+            {
+               Iterator beans = ((ApplicationMetaData)metadata).getEnterpriseBeans();
+               while(beans.hasNext())
+               {
+                  BeanMetaData bmd = (BeanMetaData)beans.next();
+                  EJBPermissionMapping.createPermissions(bmd, policyConfiguration);
+               } 
+            }
+         else
+            throw new IllegalStateException("Unknown metadata"); 
+   }
 }

Added: trunk/server/src/main/org/jboss/deployment/security/PolicyConfigurationFacade.java
===================================================================
--- trunk/server/src/main/org/jboss/deployment/security/PolicyConfigurationFacade.java	                        (rev 0)
+++ trunk/server/src/main/org/jboss/deployment/security/PolicyConfigurationFacade.java	2007-04-25 15:10:11 UTC (rev 62558)
@@ -0,0 +1,129 @@
+/*
+  * JBoss, Home of Professional Open Source
+  * Copyright 2007, JBoss Inc., and individual contributors as indicated
+  * by the @authors tag. See the copyright.txt 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.deployment.security;
+
+import java.security.Policy;
+
+import javax.security.jacc.PolicyConfiguration;
+import javax.security.jacc.PolicyConfigurationFactory;
+import javax.security.jacc.PolicyContextException;
+
+import org.jboss.logging.Logger;
+import org.jboss.metadata.MetaData;
+
+//$Id$
+
+/**
+ *  A facade for the JACC Policy Configuration
+ *  @author Anil.Saldhana at redhat.com
+ *  @since  Apr 23, 2007 
+ *  @version $Revision$
+ */
+public class PolicyConfigurationFacade implements PolicyConfigurationFacadeMBean
+{ 
+   private static Logger log = Logger.getLogger(PolicyConfigurationFacade.class);
+   
+   private String jaccContextId;
+   private PolicyConfiguration policyConfiguration;
+   private JaccPolicyMBean jaccPolicyMBean;
+   private MetaData metaData;
+ 
+   
+   public PolicyConfigurationFacade(String id, MetaData md)
+   {
+      if(id == null)
+         throw new IllegalArgumentException("Context ID is null");
+      if(md == null)
+         throw new IllegalArgumentException("Meta Data is null");
+      this.jaccContextId = id; 
+      this.metaData = md;
+   }
+   
+   public void create()
+   { 
+      try
+      {
+         log.error("PolicyConfigurationFacade create");
+         PolicyConfigurationFactory pcf = PolicyConfigurationFactory.getPolicyConfigurationFactory();
+         policyConfiguration = pcf.getPolicyConfiguration(this.jaccContextId, true);
+
+         JaccPolicyUtil.createPermissions(policyConfiguration, metaData);
+      }
+      catch (ClassNotFoundException e)
+      {
+         new RuntimeException(e);
+      }
+      catch (PolicyContextException e)
+      {
+         new RuntimeException(e);
+      }
+         
+   }
+
+   public void destroy()
+   { 
+      this.policyConfiguration = null;
+   }
+
+   public void start()
+   {
+      try
+      {
+         log.error("PolicyConfigurationFacade start:metadata="+metaData);
+
+         if(jaccPolicyMBean != null)
+         { 
+            jaccPolicyMBean.link(policyConfiguration);
+         }
+         policyConfiguration.commit();
+         // Allow the policy to incorporate the policy configs
+         Policy.getPolicy().refresh();
+      }  
+      catch (PolicyContextException e)
+      {
+         new RuntimeException(e);
+      }
+   }
+
+   public void stop()
+   {
+      log.error("PolicyConfigurationFacade stop");
+      try
+      {
+         this.policyConfiguration.delete();
+      }
+      catch (PolicyContextException e)
+      {
+         new RuntimeException(e);
+      } 
+   } 
+   
+   public JaccPolicyMBean getJaccPolicyMBean()
+   {
+      return this.jaccPolicyMBean;
+   }
+
+   public void setJaccPolicyMBean(JaccPolicyMBean jaccPolicy)
+   {
+      this.jaccPolicyMBean = jaccPolicy;
+   } 
+}

Added: trunk/server/src/main/org/jboss/deployment/security/PolicyConfigurationFacadeMBean.java
===================================================================
--- trunk/server/src/main/org/jboss/deployment/security/PolicyConfigurationFacadeMBean.java	                        (rev 0)
+++ trunk/server/src/main/org/jboss/deployment/security/PolicyConfigurationFacadeMBean.java	2007-04-25 15:10:11 UTC (rev 62558)
@@ -0,0 +1,41 @@
+/*
+  * JBoss, Home of Professional Open Source
+  * Copyright 2007, JBoss Inc., and individual contributors as indicated
+  * by the @authors tag. See the copyright.txt 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.deployment.security;
+ 
+//$Id$
+
+/**
+ *  MBean interface for the Policy Configuration facade service bean
+ *  @author Anil.Saldhana at redhat.com
+ *  @since  Apr 23, 2007 
+ *  @version $Revision$
+ */
+public interface PolicyConfigurationFacadeMBean
+{
+   public void create();
+   public void destroy(); 
+   public void start();
+   public void stop();
+   
+   public JaccPolicyMBean getJaccPolicyMBean();
+   public void setJaccPolicyMBean(JaccPolicyMBean jaccPolicy); 
+}

Modified: trunk/server/src/main/org/jboss/deployment/security/SecurityDeployer.java
===================================================================
--- trunk/server/src/main/org/jboss/deployment/security/SecurityDeployer.java	2007-04-25 15:08:18 UTC (rev 62557)
+++ trunk/server/src/main/org/jboss/deployment/security/SecurityDeployer.java	2007-04-25 15:10:11 UTC (rev 62558)
@@ -22,16 +22,26 @@
 package org.jboss.deployment.security;
   
 import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
+import java.util.HashSet; 
+import java.util.List;
+import java.util.Set;
 
-import javax.management.ObjectName;
+import javax.management.ObjectName; 
 
-import org.jboss.deployers.plugins.deployer.AbstractSimpleDeployer;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.deployers.plugins.deployer.AbstractSimpleDeployer; 
 import org.jboss.deployers.spi.DeploymentException;
-import org.jboss.deployers.spi.deployer.DeploymentUnit;
+import org.jboss.deployers.spi.deployer.DeploymentUnit; 
+import org.jboss.deployers.spi.structure.DeploymentContext;
+import org.jboss.metadata.ApplicationMetaData;
+import org.jboss.metadata.BeanMetaData;
+import org.jboss.metadata.MetaData; 
+import org.jboss.metadata.WebMetaData;
+import org.jboss.system.metadata.ServiceAttributeMetaData;
 import org.jboss.system.metadata.ServiceConstructorMetaData;
+import org.jboss.system.metadata.ServiceDependencyMetaData; 
 import org.jboss.system.metadata.ServiceDeployment;
+import org.jboss.system.metadata.ServiceInjectionValueMetaData;
 import org.jboss.system.metadata.ServiceMetaData;
 
 //$Id$
@@ -47,6 +57,8 @@
 {   
    private HashSet<String> ignoreSuffixes = null;
    
+   String BASE_OBJECT_NAME = "jboss:service=jacc,id=";
+   
    public SecurityDeployer()
    { 
       this.setRelativeOrder(COMPONENT_DEPLOYER - 1);
@@ -55,17 +67,18 @@
    public void setIgnoreSuffixes(HashSet<String> suffixSet)
    {
       this.ignoreSuffixes = suffixSet;
-   }
-
+   }  
+   
    @Override
-   public void deploy(DeploymentUnit unit ) throws DeploymentException
+   public void deploy(DeploymentUnit unit) throws DeploymentException
    { 
-      //Consider only the top level deployments for processing
+      
       if(unit.getParent() != null)
-        return; 
+         return;  //deal with top level deployments only
       
       //Ignore some of the extensions
-      String contextId = unit.getSimpleName();
+      String contextId = unit.getSimpleName(); 
+      
       for(String suffix : ignoreSuffixes)
       {
          String dotSuffix = "." + suffix;
@@ -75,36 +88,169 @@
             return;
          }
       }
+      
+      //Need to get an estimate of all the deployments underneath that are jacc capable
+      List<String> jaccDeployments = JaccPolicyUtil.getJaccDeployments(unit, ignoreSuffixes);
+      
+      if(jaccDeployments.size() == 0)
+      {
+         boolean ejbJar = (contextId.endsWith("jar") && JaccPolicyUtil.isEJBDeployment(unit));
+         if((contextId.endsWith("war")) || ejbJar) 
+         { 
+            createTopLevelServiceBeanWithMetaData(contextId,unit);
+            return;
+         }
+         return; //No need to process if there are no jacc deployments
+      }
+      
+      //Create a top level Jacc Policy Bean
+      if(getMetaData(unit) != null)
+         this.createTopLevelServiceBeanWithMetaData(contextId, unit);
+      else
+         this.createTopLevelServiceBean(contextId, unit);
+      
+      //Now for each of the deployments underneath, create a policy configuration facade
+      for(String str:jaccDeployments)
+      {
+         //get the deployment unit for str
+         DeploymentUnit childDU = getChildDeployment(unit,str);
+         
+         MetaData metadata = getMetaData(childDU);
+         if(metadata == null)
+         {
+            log.debug("meta data is null for child deployment:" + childDU.getSimpleName() 
+                  + "; No Jacc policy created.");
+            continue;
+         }
+         
+         ServiceMetaData subjaccPolicy = new ServiceMetaData();
+         subjaccPolicy.setCode(PolicyConfigurationFacade.class.getName());
+         try
+         {
+            subjaccPolicy.setObjectName(new ObjectName(BASE_OBJECT_NAME  + str  ));
+         }
+         catch (Exception e)
+         {  
+            throw new RuntimeException(e);
+         }
+         //Provide a constructor for the service bean 
+         ServiceConstructorMetaData constructor = new ServiceConstructorMetaData();
+         constructor.setSignature(new String[] { String.class.getName(), MetaData.class.getName()});
+         constructor.setParameters(new Object[] {str, getMetaData(childDU)});
+         subjaccPolicy.setConstructor(constructor);
+         
+         ArrayList<ServiceMetaData> services = new ArrayList<ServiceMetaData>();
+         services.add(subjaccPolicy); 
+         childDU.addAttachment("jboss.jacc", subjaccPolicy, ServiceMetaData.class ); 
+         
+         //Add a dependence into the top level jacc policy bean
+         ServiceMetaData parentJacc = (ServiceMetaData)childDU.getParent().getAttachment("jboss.jacc");
+         if(parentJacc == null)
+            throw new IllegalStateException("Parent JACC Policy is null");
+         
+         List<ServiceDependencyMetaData> dependencies = new ArrayList<ServiceDependencyMetaData>();
+         ServiceDependencyMetaData sdmd = new ServiceDependencyMetaData();
+         sdmd.setIDependOnObjectName(subjaccPolicy.getObjectName());
+         dependencies.add(sdmd);
+         parentJacc.setDependencies(dependencies); 
+         
+         //Inject the top level jacc policy bean 
+         List<ServiceAttributeMetaData> attributes = new ArrayList<ServiceAttributeMetaData>();
+         ServiceAttributeMetaData attribute = new ServiceAttributeMetaData();
+         attribute.setName("JaccPolicyMBean");
+         String parentObjectName = parentJacc.getObjectName().getCanonicalName();
+         ServiceInjectionValueMetaData sivmd = new ServiceInjectionValueMetaData(parentObjectName);
+         sivmd.setDependentState(ControllerState.CONFIGURED);
+         attribute.setValue(sivmd);
+         attributes.add(attribute);
+         attributes.addAll(subjaccPolicy.getAttributes());
+         subjaccPolicy.setAttributes(attributes); 
+      } 
+   }
+   
 
+   @Override
+   public void undeploy(DeploymentUnit unit )
+   {
+      unit.removeAttachment("jboss.jaccpolicy", ServiceDeployment.class); 
+      List<String> jaccDeployments = JaccPolicyUtil.getJaccDeployments(unit, ignoreSuffixes);
+      for(String deployment: jaccDeployments)
+      {
+         DeploymentUnit childDU = this.getChildDeployment(unit, deployment);
+         if(childDU != null)
+            childDU.removeAttachment("jboss.jaccpolicy", ServiceDeployment.class); 
+      }
+   } 
+    
+   
+   //Private Methods
+   
+   private DeploymentUnit getChildDeployment(DeploymentUnit parent, String id)
+   {
+      DeploymentContext dc = parent.getDeploymentContext();
+      Set<DeploymentContext> childSet = dc.getChildren();
+      for(DeploymentContext childDC: childSet)
+      {
+         DeploymentUnit du = childDC.getDeploymentUnit();
+         if(id.equals(du.getSimpleName()))
+            return du; 
+      }
+      
+      return null;
+   }
+   
+   private void createTopLevelServiceBeanWithMetaData(String contextId, DeploymentUnit unit)
+   { 
+      //Provide a constructor for the service bean 
+      ServiceConstructorMetaData constructor = new ServiceConstructorMetaData();
+      constructor.setSignature(new String[] { String.class.getName(), 
+            MetaData.class.getName(),Boolean.class.getName()});
+      constructor.setParameters(new Object[] {contextId,getMetaData(unit), Boolean.TRUE});
+      createJaccPolicyBean(constructor, unit);
+   }
+   
+   private void createTopLevelServiceBean(String contextId, DeploymentUnit unit)
+   { 
+      //Provide a constructor for the service bean 
+      ServiceConstructorMetaData constructor = new ServiceConstructorMetaData();
+      constructor.setSignature(new String[] { String.class.getName()});
+      constructor.setParameters(new Object[] {contextId}); 
+      
+      createJaccPolicyBean(constructor, unit); 
+   }
+   
+   private void createJaccPolicyBean(ServiceConstructorMetaData constructor, DeploymentUnit unit)
+   {
       //Create a Service Bean for the JACC Policy 
       ServiceMetaData jaccPolicy = new ServiceMetaData();
       jaccPolicy.setCode(JaccPolicy.class.getName());  
       try
       {
-         jaccPolicy.setObjectName(new ObjectName(JaccPolicy.BASE_OBJECT_NAME + contextId));
+         jaccPolicy.setObjectName(new ObjectName(BASE_OBJECT_NAME + unit.getSimpleName()));
       }
       catch (Exception e)
       { 
-      }  
-      
-      //Provide a constructor for the service bean 
-      ServiceConstructorMetaData constructor = new ServiceConstructorMetaData();
-      constructor.setSignature(new String[] { String.class.getName(),
-            DeploymentUnit.class.getName(), Collection.class.getName()});
-      constructor.setParameters(new Object[] {contextId, unit, ignoreSuffixes});
+         throw new RuntimeException(e);
+      }
+      //Provide a constructor for the service bean  
       jaccPolicy.setConstructor(constructor);
       ArrayList<ServiceMetaData> services = new ArrayList<ServiceMetaData>();
       services.add(jaccPolicy);
       
-      //Now add this service bean to the unit
-      ServiceDeployment sd = new ServiceDeployment();
-      sd.setServices(services);
-      unit.addAttachment("jboss.jaccpolicy", sd, ServiceDeployment.class);  
+      unit.addAttachment("jboss.jacc", jaccPolicy, ServiceMetaData.class); 
    }
-
-   @Override
-   public void undeploy(DeploymentUnit unit )
+   
+   private MetaData getMetaData(DeploymentUnit du)
    {
-      unit.removeAttachment("jboss.jaccpolicy", ServiceDeployment.class); 
+      MetaData md = null;
+      //Look for WebMetaData
+      md = (MetaData) du.getAttachment(WebMetaData.class.getName());
+      //Look for ApplicationMetaData
+      if(md == null)
+         md = (MetaData) du.getAttachment(ApplicationMetaData.class.getName());
+      //Look for BeanMetaData??
+      if(md == null)
+         md = (MetaData)du.getAttachment(BeanMetaData.class.getName());
+      return md;
    }
 }




More information about the jboss-cvs-commits mailing list