/* * 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.deployers.vfs.spi.structure; import java.util.Set; import java.util.HashSet; import java.util.Collections; import org.jboss.deployers.spi.DeploymentException; import org.jboss.deployers.spi.structure.ContextInfo; import org.jboss.deployers.spi.structure.StructureMetaData; import org.jboss.virtual.VirtualFile; /** * StructureContext. * * @author <a href="adrian@jboss.com">Adrian Brock</a> * @author <a href="ales.justin@jboss.com">Ales Justin</a> * @version $Revision: 1.1 $ */ public class StructureContext { /** The root of the deployment */ private VirtualFile root; /** The parent virtual file */ private VirtualFile parent; /** The current candidate file */ private VirtualFile file; /** The structure metadata */ private StructureMetaData metaData; /** The structural deployers */ private VFSStructuralDeployers deployers; /** The parent structure context */ private StructureContext parentContext; /** The candidate annotation scanning */ private boolean candidateAnnotationScanning; /** The callbacks */ private Set<Object> callbacks; /** * Helper method to check parent is not null before retrieving parameters * * @param parentContext the parent context * @return the root * @throws IllegalArgumentException for a null parent */ private static VirtualFile getRoot(StructureContext parentContext) { if (parentContext == null) throw new IllegalArgumentException("Null parentContext"); return parentContext.getRoot(); } /** * Create a new structure context from a root * * @param root the root file * @param parent the parent file * @param file the current file * @param metaData the structure metadata to build * @param deployers the available structure deployers * @param parentContext the parentContext * @throws IllegalArgumentException for a null parameter (parents can be null) */ public StructureContext(VirtualFile root, VirtualFile parent, VirtualFile file, StructureMetaData metaData, VFSStructuralDeployers deployers, StructureContext parentContext) { if (root == null) throw new IllegalArgumentException("Null root"); if (file == null) throw new IllegalArgumentException("Null file"); if (metaData == null) throw new IllegalArgumentException("Null structure metadata"); if (deployers == null) throw new IllegalArgumentException("Null structural deployers"); this.root = root; this.parent = parent; this.file = file; this.metaData = metaData; this.deployers = deployers; this.parentContext = parentContext; } /** * Create a new structure context from a root * * @param root the root file * @param metaData the structure metadata to build * @param deployers the available structure deployers * @throws IllegalArgumentException for a null parameter */ public StructureContext(VirtualFile root, StructureMetaData metaData, VFSStructuralDeployers deployers) { this(root, null, root, metaData, deployers, null); } /** * Create a new child structure context * * @param file the candidate file * @param metaData the structure metadata to build * @param parentContext the parentContext * @throws IllegalArgumentException for a null parameter */ public StructureContext(VirtualFile file, StructureMetaData metaData, StructureContext parentContext) { this(getRoot(parentContext), parentContext.getFile(), file, metaData, parentContext.getDeployers(), parentContext); } /** * Get the file name * * @return the file name */ public String getName() { return file.getName(); } /** * Get the root. * * @return the root. */ public VirtualFile getRoot() { return root; } /** * Get the parent. * * @return the parent. */ public VirtualFile getParent() { return parent; } /** * Whether this is top level. * * @return true for top level. */ public boolean isTopLevel() { return parent == null; } /** * Get the file. * * @return the file. */ public VirtualFile getFile() { return file; } /** * Get the metaData. * * @return the metaData. */ public StructureMetaData getMetaData() { return metaData; } /** * Get the deployers. * * @return the deployers. */ public VFSStructuralDeployers getDeployers() { return deployers; } /** * Get the parentContext. * * @return the parentContext. */ public StructureContext getParentContext() { return parentContext; } /** * Get the candidate annotation scanning. * * @return the candidate annotation scanning */ public boolean isCandidateAnnotationScanning() { return candidateAnnotationScanning; } /** * Set the candidate annotation scanning. * * @param candidateAnnotationScanning the candidate annotation scanning */ public void setCandidateAnnotationScanning(boolean candidateAnnotationScanning) { this.candidateAnnotationScanning = candidateAnnotationScanning; } /*** * Get the matching callbacks. * * @param <T> exact callback type * @param callbackType the exact callback type * @return the callbacks */ public <T> Set<T> getCallbacks(Class<T> callbackType) { if (callbackType == null) throw new IllegalArgumentException("Null callback type"); if (callbacks == null || callbacks.isEmpty()) return Collections.emptySet(); Set<T> set = new HashSet<T>(); for (Object callback : callbacks) { if (callbackType.isInstance(callback)) set.add(callbackType.cast(callback)); } return set; } /** * Add the callback. * * @param callback the callback */ public void addCallback(Object callback) { if (callbacks == null) callbacks = new HashSet<Object>(); callbacks.add(callback); } /** * Set the callbacks. * * @param callbacks the callbacks */ public void setCallbacks(Set<Object> callbacks) { this.callbacks = callbacks; } /** * Determine the child structure * * @param child the child * @return true when recognised * @throws DeploymentException for any error */ public boolean determineChildStructure(VirtualFile child) throws DeploymentException { if (child == null) throw new IllegalArgumentException("Null child"); return getDeployers().determineStructure(child, this); } /** * Add a child context * * @param child the child */ public void addChild(ContextInfo child) { if (child == null) throw new IllegalArgumentException("Null child"); getMetaData().addContext(child); } /** * Remove a child context * * @param child the child */ public void removeChild(ContextInfo child) { if (child == null) throw new IllegalArgumentException("Null child"); getMetaData().removeContext(child); } }