1 10 11 15 package org.nanocontainer.deployer; 16 17 import java.io.InputStreamReader ; 18 import java.io.Reader ; 19 20 import org.apache.commons.vfs.FileObject; 21 import org.apache.commons.vfs.FileSelectInfo; 22 import org.apache.commons.vfs.FileSelector; 23 import org.apache.commons.vfs.FileSystemException; 24 import org.apache.commons.vfs.FileSystemManager; 25 import org.apache.commons.vfs.impl.VFSClassLoader; 26 import org.apache.commons.vfs.VFS; 27 import org.nanocontainer.integrationkit.ContainerBuilder; 28 import org.nanocontainer.script.ScriptedContainerBuilderFactory; 29 import org.picocontainer.defaults.ObjectReference; 30 import org.picocontainer.defaults.SimpleReference; 31 import org.nanocontainer.script.UnsupportedScriptTypeException; 32 import org.nanocontainer.script.ScriptBuilderResolver; 33 34 87 public class NanoContainerDeployer implements Deployer { 88 89 92 private final FileSystemManager fileSystemManager; 93 94 98 private final String fileBasename; 99 100 101 104 private ScriptBuilderResolver resolver; 105 106 107 111 public NanoContainerDeployer() throws FileSystemException { 112 this(VFS.getManager(), new ScriptBuilderResolver()); 113 } 114 115 119 public NanoContainerDeployer(final FileSystemManager fileSystemManager) { 120 this(fileSystemManager,"nanocontainer"); 121 } 122 123 124 129 public NanoContainerDeployer(final FileSystemManager fileSystemManager, ScriptBuilderResolver builderResolver) { 130 this(fileSystemManager); 131 resolver = builderResolver; 132 } 133 134 142 public NanoContainerDeployer(final FileSystemManager fileSystemManager, String baseFileName) { 143 this.fileSystemManager = fileSystemManager; 144 fileBasename = baseFileName; 145 resolver = new ScriptBuilderResolver(); 146 } 147 148 149 159 public ObjectReference deploy(FileObject applicationFolder, ClassLoader parentClassLoader, ObjectReference parentContainerRef) throws FileSystemException, ClassNotFoundException { 160 return deploy(applicationFolder, parentClassLoader, parentContainerRef, null); 161 } 162 163 public ObjectReference deploy(FileObject applicationFolder, ClassLoader parentClassLoader, ObjectReference parentContainerRef, Object assemblyScope) throws FileSystemException, ClassNotFoundException { 164 ClassLoader applicationClassLoader = new VFSClassLoader(applicationFolder, fileSystemManager, parentClassLoader); 165 166 FileObject deploymentScript = getDeploymentScript(applicationFolder); 167 168 ObjectReference result = new SimpleReference(); 169 170 String extension = "." + deploymentScript.getName().getExtension(); 171 Reader scriptReader = new InputStreamReader (deploymentScript.getContent().getInputStream()); 172 String builderClassName = null; 173 try { 174 builderClassName = resolver.getBuilderClassName(extension); 175 } catch (UnsupportedScriptTypeException ex) { 176 throw new FileSystemException("Could not find a suitable builder for: " + deploymentScript.getName() 177 + ". Known extensions are: [groovy|bsh|js|py|xml]", ex); 178 } 179 180 181 ScriptedContainerBuilderFactory scriptedContainerBuilderFactory = new ScriptedContainerBuilderFactory(scriptReader, builderClassName, applicationClassLoader); 182 ContainerBuilder builder = scriptedContainerBuilderFactory.getContainerBuilder(); 183 builder.buildContainer(result, parentContainerRef, assemblyScope, true); 184 185 return result; 186 187 } 188 189 190 191 192 199 protected FileObject getDeploymentScript(FileObject applicationFolder) throws FileSystemException { 200 final FileObject metaInf = applicationFolder.getChild("META-INF"); 201 if(metaInf == null) { 202 throw new FileSystemException("Missing META-INF folder in " + applicationFolder.getName().getPath()); 203 } 204 final FileObject[] nanocontainerScripts = metaInf.findFiles(new FileSelector(){ 205 206 public boolean includeFile(FileSelectInfo fileSelectInfo) throws Exception { 207 return fileSelectInfo.getFile().getName().getBaseName().startsWith(getFileBasename()); 208 } 209 210 public boolean traverseDescendents(FileSelectInfo fileSelectInfo) throws Exception { 211 if (fileSelectInfo.getDepth() > 1) { 216 return false; 217 } else { 218 return true; 219 } 220 } 221 }); 222 223 if(nanocontainerScripts == null || nanocontainerScripts.length < 1) { 224 throw new FileSystemException("No deployment script ("+ getFileBasename() +".[groovy|bsh|js|py|xml]) in " + applicationFolder.getName().getPath() + "/META-INF"); 225 } 226 227 if (nanocontainerScripts.length == 1) { 228 return nanocontainerScripts[0]; 229 } else { 230 throw new FileSystemException("Found more than one candidate config script in : " + applicationFolder.getName().getPath() + "/META-INF." 231 + "Please only have one " + getFileBasename() + ".[groovy|bsh|js|py|xml] this directory."); 232 } 233 234 } 235 236 237 241 public String getFileBasename() { 242 return fileBasename; 243 } 244 } 245 | Popular Tags |