/* * JBoss, Home of Professional Open Source * Copyright 2006, 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.deployers.structure.spi.helpers; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.jboss.dependency.spi.DependencyInfo; import org.jboss.dependency.spi.DependencyItem; import org.jboss.deployers.client.spi.main.MainDeployer; import org.jboss.deployers.spi.DeploymentException; import org.jboss.deployers.spi.attachments.MutableAttachments; import org.jboss.deployers.spi.attachments.helpers.AbstractMutableAttachments; import org.jboss.deployers.structure.spi.ClassLoaderFactory; import org.jboss.deployers.structure.spi.DeploymentContext; import org.jboss.deployers.structure.spi.DeploymentResourceLoader; import org.jboss.deployers.structure.spi.DeploymentUnit; import org.jboss.deployers.structure.spi.DeploymentUnitVisitor; import org.jboss.metadata.spi.MetaData; import org.jboss.metadata.spi.MutableMetaData; import org.jboss.metadata.spi.scope.ScopeKey; /** * AbstractDeploymentUnit.<p> * * This is just a wrapper to the deployment context that * restricts people from "poking" behind the scenes. * * @author <a href="adrian@jboss.com">Adrian Brock</a> * @author Scott.Stark@jboss.org * @version $Revision: 1.1 $ */ public class AbstractDeploymentUnit extends AbstractMutableAttachments implements DeploymentUnit { /** The serialVersionUID */ private static final long serialVersionUID = 1513962148798298768L; /** The deployment context */ private DeploymentContext deploymentContext; /** * For serialization */ public AbstractDeploymentUnit() { } /** * Create a new AbstractDeploymentUnit. * * @param deploymentContext the deployment context * @throws IllegalArgumentException for a null deployment context */ public AbstractDeploymentUnit(DeploymentContext deploymentContext) { if (deploymentContext == null) throw new IllegalArgumentException("Null deployment context"); this.deploymentContext = deploymentContext; } public String getName() { return deploymentContext.getName(); } public Set<Object> getControllerContextNames() { return deploymentContext.getControllerContextNames(); } public void addControllerContextName(Object name) { deploymentContext.addControllerContextName(name); } public void removeControllerContextName(Object name) { deploymentContext.removeControllerContextName(name); } public String getSimpleName() { return deploymentContext.getSimpleName(); } public String getRelativePath() { return deploymentContext.getRelativePath(); } public ScopeKey getScope() { return deploymentContext.getScope(); } public void setScope(ScopeKey key) { deploymentContext.setScope(key); } public ScopeKey getMutableScope() { return deploymentContext.getMutableScope(); } public void setMutableScope(ScopeKey key) { deploymentContext.setMutableScope(key); } public MetaData getMetaData() { return deploymentContext.getMetaData(); } public MutableMetaData getMutableMetaData() { return deploymentContext.getMutableMetaData(); } public ClassLoader getClassLoader() { ClassLoader cl = deploymentContext.getClassLoader(); if (cl == null) throw new IllegalStateException("ClassLoader has not been set"); deploymentContext.deployed(); return cl; } public boolean createClassLoader(ClassLoaderFactory factory) throws DeploymentException { return deploymentContext.createClassLoader(factory); } public void removeClassLoader(ClassLoaderFactory factory) { deploymentContext.removeClassLoader(factory); } public boolean isTopLevel() { return deploymentContext.isTopLevel(); } public DeploymentUnit getTopLevel() { DeploymentContext context = deploymentContext.getTopLevel(); return context.getDeploymentUnit(); } public DeploymentUnit getParent() { DeploymentContext parent = deploymentContext.getParent(); if (parent == null) return null; return parent.getDeploymentUnit(); } public List<DeploymentUnit> getChildren() { List<DeploymentContext> children = deploymentContext.getChildren(); if (children == null || children.isEmpty()) return Collections.emptyList(); List<DeploymentUnit> result = new ArrayList<DeploymentUnit>(children.size()); for (DeploymentContext child : children) { DeploymentUnit unit = child.getDeploymentUnit(); result.add(unit); } return result; } public List<DeploymentUnit> getComponents() { List<DeploymentContext> components = deploymentContext.getComponents(); if (components == null || components.isEmpty()) return Collections.emptyList(); List<DeploymentUnit> result = new ArrayList<DeploymentUnit>(components.size()); for (DeploymentContext component : components) { DeploymentUnit unit = component.getDeploymentUnit(); result.add(unit); } return result; } /** * Create a component deployment context * * @param name the name * @param parent the parent * @return the deployment context */ protected DeploymentContext createComponentDeploymentContext(String name, DeploymentContext parent) { return new ComponentDeploymentContext(name, parent); } /** * Create a component deployment unit * * @param component the component contextr * @return the deployment unit */ protected DeploymentUnit createComponentDeploymentUnit(DeploymentContext component) { return new AbstractDeploymentUnit(component); } public boolean isComponent() { return deploymentContext.isComponent(); } public DeploymentUnit addComponent(String name) { DeploymentContext component = createComponentDeploymentContext(name, deploymentContext); DeploymentUnit unit = createComponentDeploymentUnit(component); component.setDeploymentUnit(unit); deploymentContext.addComponent(component); return unit; } /** * Get component deployment context. * * @param name the name * @return component component context or null if no match */ protected DeploymentContext getComponentContext(String name) { List<DeploymentContext> components = deploymentContext.getComponents(); if (components == null || components.isEmpty()) return null; for (DeploymentContext component : components) { if (name.equals(component.getName())) return component; } return null; } public DeploymentUnit getComponent(String name) { if (name == null) throw new IllegalArgumentException("Null name"); DeploymentContext component = getComponentContext(name); return component != null ? component.getDeploymentUnit() : null; } public boolean removeComponent(String name) { if (name == null) throw new IllegalArgumentException("Null name"); DeploymentContext component = getComponentContext(name); return component != null && deploymentContext.removeComponent(component); } public <T> Set<? extends T> getAllMetaData(Class<T> type) { if (type == null) throw new IllegalArgumentException("Null type"); Set<T> result = new HashSet<T>(); Map<String, Object> attachments = getAttachments(); for (Object object : attachments.values()) { if (type.isInstance(object)) { T t = type.cast(object); result.add(t); } } if (result.isEmpty() == false) deploymentContext.deployed(); return result; } public MutableAttachments getTransientManagedObjects() { return getDeploymentContext().getTransientManagedObjects(); } public Object addAttachment(String name, Object attachment) { DeploymentContext deploymentContext = getDeploymentContext(); deploymentContext.deployed(); return deploymentContext.getTransientAttachments().addAttachment(name, attachment); } public void clear() { DeploymentContext deploymentContext = getDeploymentContext(); deploymentContext.getTransientAttachments().clear(); deploymentContext.getTransientManagedObjects().clear(); } public void clearChangeCount() { DeploymentContext deploymentContext = getDeploymentContext(); deploymentContext.getTransientAttachments().clearChangeCount(); deploymentContext.getTransientManagedObjects().clearChangeCount(); } public int getChangeCount() { DeploymentContext deploymentContext = getDeploymentContext(); return deploymentContext.getTransientAttachments().getChangeCount() + deploymentContext.getTransientManagedObjects().getChangeCount(); } public Object removeAttachment(String name) { return getDeploymentContext().getTransientAttachments().removeAttachment(name); } public Object getAttachment(String name) { DeploymentContext deploymentContext = getDeploymentContext(); DeploymentContext parent = deploymentContext.getParent(); if (deploymentContext.isComponent() == false) parent = null; Object result = deploymentContext.getPredeterminedManagedObjects().getAttachment(name); if (result != null) { deploymentContext.deployed(); return result; } if (parent != null) { result = parent.getPredeterminedManagedObjects().getAttachment(name); if (result != null) { deploymentContext.deployed(); return result; } } result = deploymentContext.getTransientManagedObjects().getAttachment(name); if (result != null) { deploymentContext.deployed(); return result; } if (parent != null) { result = parent.getTransientManagedObjects().getAttachment(name); if (result != null) { deploymentContext.deployed(); return result; } } result = deploymentContext.getTransientAttachments().getAttachment(name); if (result != null) { deploymentContext.deployed(); return result; } if (parent != null) { result = parent.getTransientAttachments().getAttachment(name); if (result != null) { deploymentContext.deployed(); return result; } } return null; } public Map<String, Object> getAttachments() { DeploymentContext deploymentContext = getDeploymentContext(); DeploymentContext parent = deploymentContext.getParent(); if (deploymentContext.isComponent() == false) parent = null; HashMap<String, Object> result = new HashMap<String, Object>(); if (parent != null) result.putAll(parent.getTransientAttachments().getAttachments()); result.putAll(deploymentContext.getTransientAttachments().getAttachments()); if (parent != null) result.putAll(parent.getTransientManagedObjects().getAttachments()); result.putAll(deploymentContext.getTransientManagedObjects().getAttachments()); if (parent != null) result.putAll(parent.getPredeterminedManagedObjects().getAttachments()); result.putAll(deploymentContext.getPredeterminedManagedObjects().getAttachments()); if (result.isEmpty() == false) deploymentContext.deployed(); return Collections.unmodifiableMap(result); } public boolean hasAttachments() { DeploymentContext deploymentContext = getDeploymentContext(); if (deploymentContext.getTransientAttachments().hasAttachments()) return true; else if (deploymentContext.getTransientManagedObjects().hasAttachments()) return true; else if (deploymentContext.getPredeterminedManagedObjects().hasAttachments()) return true; if (deploymentContext.isComponent()) return deploymentContext.getParent().getDeploymentUnit().hasAttachments(); return false; } public boolean isAttachmentPresent(String name) { return getAttachment(name) != null; } public ClassLoader getResourceClassLoader() { return getDeploymentContext().getResourceClassLoader(); } public DeploymentResourceLoader getResourceLoader() { return getDeploymentContext().getResourceLoader(); } public void addIDependOn(DependencyItem dependency) { getDependencyInfo().addIDependOn(dependency); } public void visit(DeploymentUnitVisitor visitor) throws DeploymentException { UnitVisitorToContextVisitor contextVisitor = new UnitVisitorToContextVisitor(visitor); getDeploymentContext().visit(contextVisitor); } public DependencyInfo getDependencyInfo() { return getDeploymentContext().getDependencyInfo(); } public void removeIDependOn(DependencyItem dependency) { getDependencyInfo().removeIDependOn(dependency); } public MainDeployer getMainDeployer() { return getTopLevel().getAttachment(MainDeployer.class); } /** * Get the deployment context * * @return the deployment context */ protected DeploymentContext getDeploymentContext() { return deploymentContext; } public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { super.readExternal(in); deploymentContext = (DeploymentContext) in.readObject(); } /** * @serialData deploymentContext * @param out the output * @throws IOException for any error */ public void writeExternal(ObjectOutput out) throws IOException { super.writeExternal(out); out.writeObject(deploymentContext); } public String toString() { return String.valueOf(deploymentContext); } }