container/components/components/src/main/java/org/mobicents/slee/container/component/deployment/DeployableUnitBuilderImpl.java
public DeployableUnitImpl build(String url, File deploymentRoot,
			ComponentRepository componentRepository)
			throws DeploymentException, AlreadyDeployedException,
			MalformedURLException {

		if (logger.isDebugEnabled()) {
			logger.debug("Building DU from " + url);
		}

		DeployableUnitID deployableUnitID = new DeployableUnitID(url);

		if (deploymentRoot == null) {
			throw new NullPointerException("null deploymentRoot");
		}

		URL sourceUrl = new URL(url);

		// support remote deployment
		if(sourceUrl.getProtocol().equals("http") || sourceUrl.getProtocol().equals("https")) {
		  try {
		    // Fetch the remote file to a temporary location
		    File downloadedFile = downloadRemoteDU(sourceUrl, deploymentRoot);

		    // Update the pointers from URL and String
		    sourceUrl = downloadedFile.toURI().toURL();
		    url = sourceUrl.toString();
		  }
		  catch (Exception e) {
		    throw new DeploymentException("Failed to retrieve remote DU file : " + sourceUrl.getFile(), e);
		  }
		}

		// create jar file
		JarFile deployableUnitJar = null;
		try {
			deployableUnitJar = new JarFile(sourceUrl.getFile());
		} catch (IOException e) {
			throw new DeploymentException(
					"Failed to open DU file as JAR file: "
							+ sourceUrl.getFile(), e);
		}

		// get and parse du descriptor
		JarEntry duXmlEntry = deployableUnitJar
				.getJarEntry("META-INF/deployable-unit.xml");
		if (duXmlEntry == null) {
			throw new DeploymentException(
					"META-INF/deployable-unit.xml was not found in "
							+ deployableUnitJar.getName());
		}
		DeployableUnitDescriptorFactoryImpl descriptorFactory = componentManagement.getComponentDescriptorFactory().getDeployableUnitDescriptorFactory();
		DeployableUnitDescriptorImpl deployableUnitDescriptor = null;
		try {
			deployableUnitDescriptor = descriptorFactory
					.parse(deployableUnitJar.getInputStream(duXmlEntry));
		} catch (IOException e) {
			try {
				deployableUnitJar.close();
			} catch (IOException e1) {
				logger.error(e.getMessage(), e);
			}
			throw new DeploymentException(
					"Failed to get DU descriptor DU inputstream from JAR file "
							+ sourceUrl.getFile(), e);
		}

		// create the du dir
		File deploymentDir = createTempDUDeploymentDir(deploymentRoot,
				deployableUnitID);

		// build du object
		DeployableUnitImpl deployableUnit = null;

		try {

			deployableUnit = new DeployableUnitImpl(deployableUnitID,
					deployableUnitDescriptor, componentRepository,
					deploymentDir);

			// build each du jar component
			for (String jarFileName : deployableUnitDescriptor.getJarEntries()) {
				for (SleeComponent sleeComponent : duComponentBuilder
						.buildComponents(jarFileName, deployableUnitJar,
								deployableUnit.getDeploymentDir())) {
					sleeComponent.setDeployableUnit(deployableUnit);
					if (componentRepository.isInstalled(sleeComponent
							.getComponentID())) {
						throw new AlreadyDeployedException("Component "
								+ sleeComponent.getComponentID()
								+ " already deployed");
					}
					sleeComponent.setDeploymentUnitSource(jarFileName);
				}
			}

			// build each du service component
			for (String serviceDescriptorFileName : deployableUnitDescriptor
					.getServiceEntries()) {
				for (ServiceComponentImpl serviceComponent : duServiceComponentBuilder
						.buildComponents(serviceDescriptorFileName,
								deployableUnitJar)) {
					serviceComponent.setDeployableUnit(deployableUnit);
					if (componentRepository.isInstalled(serviceComponent
							.getComponentID())) {
						throw new AlreadyDeployedException("Component "
								+ serviceComponent.getComponentID()
								+ " already deployed");
					}
					// set the direct reference to the sbb component
					serviceComponent.setRootSbbComponent(deployableUnit
							.getDeployableUnitRepository().getComponentByID(
									serviceComponent.getDescriptor()
											.getRootSbbID()));
					serviceComponent
							.setDeploymentUnitSource(serviceDescriptorFileName);
				}
			}

			// get a set with all components of the DU
			Set<SleeComponent> duComponentsSet = deployableUnit
					.getDeployableUnitComponents();

			// now that all components are built we need to
			for (SleeComponent sleeComponent : duComponentsSet) {
				// check if all
				// dependencies are available
				checkDependencies(sleeComponent, deployableUnit);
				// build its class loader
				createClassLoader((AbstractSleeComponent) sleeComponent);
			}

			// load the provided classes for the component
			for (SleeComponent sleeComponent : duComponentsSet) {
				loadAndSetNonGeneratedComponentClasses((AbstractSleeComponent) sleeComponent);
			}
			
			//boolean secEnabled = SleeContainer.isSecurityEnabled();
			// validate each component
			for (SleeComponent sleeComponent : duComponentsSet) {
				ClassLoader componentClassLoader = sleeComponent
				.getClassLoader();
				ClassLoader oldClassLoader = Thread.currentThread()
				.getContextClassLoader();
				try {
					if (componentClassLoader != null) {
						Thread.currentThread().setContextClassLoader(
								componentClassLoader);
					}
					if (logger.isDebugEnabled()) {
						logger.debug("Validating " + sleeComponent);
					}
					if (!sleeComponent.validate()) {
						throw new DeploymentException(
								sleeComponent.toString()
								+ " validation failed, check logs for errors found");
					}
					//Make permissions object, this instruments codebase etc, and store POJOs in component.
					//if(secEnabled)
					//{
						sleeComponent.processSecurityPermissions();
					//}
				} catch (Throwable e) {
					throw new DeploymentException("failed to validate "
							+ sleeComponent, e);
				} finally {
					if (componentClassLoader != null) {
						Thread.currentThread().setContextClassLoader(
								oldClassLoader);
					}
				}
			}

			try {
				deployableUnitJar.close();
			} catch (IOException e) {
				logger.error("failed to close deployable jar from " + url, e);
			}

			return deployableUnit;
		} catch (Throwable e) {
			if (deployableUnit == null) {
				if (logger.isDebugEnabled()) {
					logger.debug("Deleting deployable unit temp dir "
							+ deploymentDir);
				}
				deploymentDir.delete();
			}
			if (e instanceof DeploymentException) {
				throw (DeploymentException) e;
			} else if (e instanceof AlreadyDeployedException) {
				throw (AlreadyDeployedException) e;
			} else {
				throw new DeploymentException(
						"failed to build deployable unit", e);
			}
		}
	}
public DeployableUnitImpl build(String url, File deploymentRoot,
			ComponentRepository componentRepository)
			throws DeploymentException, AlreadyDeployedException,
			MalformedURLException {

		if (logger.isDebugEnabled()) {
			logger.debug("Building DU from " + url);
		}

		DeployableUnitID deployableUnitID = new DeployableUnitID(url);

		if (deploymentRoot == null) {
			throw new NullPointerException("null deploymentRoot");
		}

		URL sourceUrl = new URL(url);

		// support remote deployment
		if(sourceUrl.getProtocol().equals("http") || sourceUrl.getProtocol().equals("https")) {
		  try {
		    // Fetch the remote file to a temporary location
		    File downloadedFile = downloadRemoteDU(sourceUrl, deploymentRoot);

		    // Update the pointers from URL and String
		    sourceUrl = downloadedFile.toURI().toURL();
		    url = sourceUrl.toString();
		  }
		  catch (Exception e) {
		    throw new DeploymentException("Failed to retrieve remote DU file : " + sourceUrl.getFile(), e);
		  }
		}

		// create jar file
		JarFile deployableUnitJar = null;
		try {
			deployableUnitJar = new JarFile(sourceUrl.getFile());
		} catch (IOException e) {
			throw new DeploymentException(
					"Failed to open DU file as JAR file: "
							+ sourceUrl.getFile(), e);
		}

		// get and parse du descriptor
		JarEntry duXmlEntry = deployableUnitJar
				.getJarEntry("META-INF/deployable-unit.xml");
		if (duXmlEntry == null) {
			throw new DeploymentException(
					"META-INF/deployable-unit.xml was not found in "
							+ deployableUnitJar.getName());
		}
		DeployableUnitDescriptorFactoryImpl descriptorFactory = componentManagement.getComponentDescriptorFactory().getDeployableUnitDescriptorFactory();
		DeployableUnitDescriptorImpl deployableUnitDescriptor = null;
		try {
			deployableUnitDescriptor = descriptorFactory
					.parse(deployableUnitJar.getInputStream(duXmlEntry));
		} catch (IOException e) {
			try {
				deployableUnitJar.close();
			} catch (IOException e1) {
				logger.error(e.getMessage(), e);
			}
			throw new DeploymentException(
					"Failed to get DU descriptor DU inputstream from JAR file "
							+ sourceUrl.getFile(), e);
		}

		// create the du dir
		File deploymentDir = createTempDUDeploymentDir(deploymentRoot,
				deployableUnitID);

		// build du object
		DeployableUnitImpl deployableUnit = null;

		try {

			deployableUnit = new DeployableUnitImpl(deployableUnitID,
					deployableUnitDescriptor, componentRepository,
					deploymentDir);

			// build each du jar component
			for (String jarFileName : deployableUnitDescriptor.getJarEntries()) {
				for (SleeComponent sleeComponent : duComponentBuilder
						.buildComponents(jarFileName, deployableUnitJar,
								deployableUnit.getDeploymentDir())) {
					sleeComponent.setDeployableUnit(deployableUnit);
					if (componentRepository.isInstalled(sleeComponent
							.getComponentID())) {
						throw new AlreadyDeployedException("Component "
								+ sleeComponent.getComponentID()
								+ " already deployed");
					}
					sleeComponent.setDeploymentUnitSource(jarFileName);
				}
			}

			// build each du service component
			for (String serviceDescriptorFileName : deployableUnitDescriptor
					.getServiceEntries()) {
				for (ServiceComponentImpl serviceComponent : duServiceComponentBuilder
						.buildComponents(serviceDescriptorFileName,
								deployableUnitJar)) {
					serviceComponent.setDeployableUnit(deployableUnit);
					if (componentRepository.isInstalled(serviceComponent
							.getComponentID())) {
						throw new AlreadyDeployedException("Component "
								+ serviceComponent.getComponentID()
								+ " already deployed");
					}
					// set the direct reference to the sbb component
					serviceComponent.setRootSbbComponent(deployableUnit
							.getDeployableUnitRepository().getComponentByID(
									serviceComponent.getDescriptor()
											.getRootSbbID()));
					serviceComponent
							.setDeploymentUnitSource(serviceDescriptorFileName);
				}
			}

			// get a set with all components of the DU
			Set<SleeComponent> duComponentsSet = deployableUnit
					.getDeployableUnitComponents();

			// now that all components are built we need to
			for (SleeComponent sleeComponent : duComponentsSet) {
				// check if all
				// dependencies are available
				checkDependencies(sleeComponent, deployableUnit);
				// build its class loader
				createClassLoader((AbstractSleeComponent) sleeComponent);
			}

			// load the provided classes for the component
			for (SleeComponent sleeComponent : duComponentsSet) {
				loadAndSetNonGeneratedComponentClasses((AbstractSleeComponent) sleeComponent);
			}
			
			//boolean secEnabled = SleeContainer.isSecurityEnabled();
			// validate each component
			for (SleeComponent sleeComponent : duComponentsSet) {
				ClassLoader componentClassLoader = sleeComponent
				.getClassLoader();
				ClassLoader oldClassLoader = Thread.currentThread()
				.getContextClassLoader();
				try {
					if (componentClassLoader != null) {
						Thread.currentThread().setContextClassLoader(
								componentClassLoader);
					}
					if (logger.isDebugEnabled()) {
						logger.debug("Validating " + sleeComponent);
					}
					if (!sleeComponent.validate()) {
						throw new DeploymentException(
								sleeComponent.toString()
								+ " validation failed, check logs for errors found");
					}
					//Make permissions object, this instruments codebase etc, and store POJOs in component.
					//if(secEnabled)
					//{
						sleeComponent.processSecurityPermissions();
					//}
				} catch (Throwable e) {
					throw new DeploymentException("failed to validate "
							+ sleeComponent, e);
				} finally {
					if (componentClassLoader != null) {
						Thread.currentThread().setContextClassLoader(
								oldClassLoader);
					}
				}
			}

			try {
				deployableUnitJar.close();
			} catch (IOException e) {
				logger.error("failed to close deployable jar from " + url, e);
			}

			return deployableUnit;
		} catch (Throwable e) {
			if (deployableUnit == null) {
				if (logger.isDebugEnabled()) {
					logger.debug("Deleting deployable unit temp dir "
							+ deploymentDir);
				}
				deploymentDir.delete();
			}
			if (e instanceof DeploymentException) {
				throw (DeploymentException) e;
			} else if (e instanceof AlreadyDeployedException) {
				throw (AlreadyDeployedException) e;
			} else {
				throw new DeploymentException(
						"failed to build deployable unit", e);
			}
		}
	}
public DeployableUnitImpl build ( String url , File deploymentRoot , ComponentRepository componentRepository ) throws DeploymentException , AlreadyDeployedException , MalformedURLException { if ( logger . isDebugEnabled ( ) ) { logger . debug ( "Building DU from " + url ) ; } DeployableUnitID deployableUnitID = new DeployableUnitID ( url ) ; if ( deploymentRoot == null ) { throw new NullPointerException ( "null deploymentRoot" ) ; } URL sourceUrl = new URL ( url ) ; // support remote deployment
 if ( sourceUrl . getProtocol ( ) . equals ( "http" ) || sourceUrl . getProtocol ( ) . equals ( "https" ) ) { try { // Fetch the remote file to a temporary location
 File downloadedFile = downloadRemoteDU ( sourceUrl , deploymentRoot ) ; // Update the pointers from URL and String
 sourceUrl = downloadedFile . toURI ( ) . toURL ( ) ; url = sourceUrl . toString ( ) ; } catch ( Exception e ) { throw new DeploymentException ( "Failed to retrieve remote DU file : " + sourceUrl . getFile ( ) , e ) ; } } // create jar file
 JarFile deployableUnitJar = null ; try { deployableUnitJar = new JarFile ( sourceUrl . getFile ( ) ) ; } catch ( IOException e ) { throw new DeploymentException ( "Failed to open DU file as JAR file: " + sourceUrl . getFile ( ) , e ) ; } // get and parse du descriptor
 JarEntry duXmlEntry = deployableUnitJar . getJarEntry ( "META-INF/deployable-unit.xml" ) ; if ( duXmlEntry == null ) { throw new DeploymentException ( "META-INF/deployable-unit.xml was not found in " + deployableUnitJar . getName ( ) ) ; } DeployableUnitDescriptorFactoryImpl descriptorFactory = componentManagement . getComponentDescriptorFactory ( ) . getDeployableUnitDescriptorFactory ( ) ; DeployableUnitDescriptorImpl deployableUnitDescriptor = null ; try { deployableUnitDescriptor = descriptorFactory . parse ( deployableUnitJar . getInputStream ( duXmlEntry ) ) ; } catch ( IOException e ) { try { deployableUnitJar . close ( ) ; } catch ( IOException e1 ) { logger . error ( e . getMessage ( ) , e ) ; } throw new DeploymentException ( "Failed to get DU descriptor DU inputstream from JAR file " + sourceUrl . getFile ( ) , e ) ; } // create the du dir
 File deploymentDir = createTempDUDeploymentDir ( deploymentRoot , deployableUnitID ) ; // build du object
 DeployableUnitImpl deployableUnit = null ; try { deployableUnit = new DeployableUnitImpl ( deployableUnitID , deployableUnitDescriptor , componentRepository , deploymentDir ) ; // build each du jar component
 for ( String jarFileName : deployableUnitDescriptor . getJarEntries ( ) ) { for ( SleeComponent sleeComponent : duComponentBuilder . buildComponents ( jarFileName , deployableUnitJar , deployableUnit . getDeploymentDir ( ) ) ) { sleeComponent . setDeployableUnit ( deployableUnit ) ; if ( componentRepository . isInstalled ( sleeComponent . getComponentID ( ) ) ) { throw new AlreadyDeployedException ( "Component " + sleeComponent . getComponentID ( ) + " already deployed" ) ; } sleeComponent . setDeploymentUnitSource ( jarFileName ) ; } } // build each du service component
 for ( String serviceDescriptorFileName : deployableUnitDescriptor . getServiceEntries ( ) ) { for ( ServiceComponentImpl serviceComponent : duServiceComponentBuilder . buildComponents ( serviceDescriptorFileName , deployableUnitJar ) ) { serviceComponent . setDeployableUnit ( deployableUnit ) ; if ( componentRepository . isInstalled ( serviceComponent . getComponentID ( ) ) ) { throw new AlreadyDeployedException ( "Component " + serviceComponent . getComponentID ( ) + " already deployed" ) ; } // set the direct reference to the sbb component
 serviceComponent . setRootSbbComponent ( deployableUnit . getDeployableUnitRepository ( ) . getComponentByID ( serviceComponent . getDescriptor ( ) . getRootSbbID ( ) ) ) ; serviceComponent . setDeploymentUnitSource ( serviceDescriptorFileName ) ; } } // get a set with all components of the DU
 Set < SleeComponent > duComponentsSet = deployableUnit . getDeployableUnitComponents ( ) ; // now that all components are built we need to
 for ( SleeComponent sleeComponent : duComponentsSet ) { // check if all
 // dependencies are available
 checkDependencies ( sleeComponent , deployableUnit ) ; // build its class loader
 createClassLoader ( ( AbstractSleeComponent ) sleeComponent ) ; } // load the provided classes for the component
 for ( SleeComponent sleeComponent : duComponentsSet ) { loadAndSetNonGeneratedComponentClasses ( ( AbstractSleeComponent ) sleeComponent ) ; } //boolean secEnabled = SleeContainer.isSecurityEnabled();
 // validate each component
 for ( SleeComponent sleeComponent : duComponentsSet ) { ClassLoader componentClassLoader = sleeComponent . getClassLoader ( ) ; ClassLoader oldClassLoader = Thread . currentThread ( ) . getContextClassLoader ( ) ; try { if ( componentClassLoader != null ) { Thread . currentThread ( ) . setContextClassLoader ( componentClassLoader ) ; } if ( logger . isDebugEnabled ( ) ) { logger . debug ( "Validating " + sleeComponent ) ; } if ( ! sleeComponent . validate ( ) ) { throw new DeploymentException ( sleeComponent . toString ( ) + " validation failed, check logs for errors found" ) ; } //Make permissions object, this instruments codebase etc, and store POJOs in component.
 //if(secEnabled)
 //{
 sleeComponent . processSecurityPermissions ( ) ; //}
 } catch ( Throwable e ) { throw new DeploymentException ( "failed to validate " + sleeComponent , e ) ; } finally { if ( componentClassLoader != null ) { Thread . currentThread ( ) . setContextClassLoader ( oldClassLoader ) ; } } } try { deployableUnitJar . close ( ) ; } catch ( IOException e ) { logger . error ( "failed to close deployable jar from " + url , e ) ; } return deployableUnit ; } catch ( Throwable e ) { if ( deployableUnit == null ) { if ( logger . isDebugEnabled ( ) ) { logger . debug ( "Deleting deployable unit temp dir " + deploymentDir ) ; } deploymentDir . delete ( ) ; } if ( e instanceof DeploymentException ) { throw ( DeploymentException ) e ; } else if ( e instanceof AlreadyDeployedException ) { throw ( AlreadyDeployedException ) e ; } else { throw new DeploymentException ( "failed to build deployable unit" , e ) ; } } }
Installs a JAIN SLEE DU.

@param sourceUrl
the original URL of the deployable unit jar
@param deploymentRoot
the root dir where this du will be installed
@param componentRepository
the repository to retrieve components
@return
@throws DeploymentException
Installs a JAIN SLEE DU .