package org.atomnuke.container.packaging.loader.impl; import java.io.File; import org.atomnuke.container.packaging.loader.PackageLoader; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.atomnuke.container.packaging.bindings.BindingEnvironmentFactory; import org.atomnuke.container.packaging.bindings.PackageLoadingException; import org.atomnuke.container.packaging.PackageContext; import org.atomnuke.container.packaging.PackageContextImpl; import org.atomnuke.container.packaging.bindings.PackageBindingsImpl; import org.atomnuke.container.packaging.bindings.environment.BindingEnvironment; import org.atomnuke.container.packaging.resource.Resource; import org.atomnuke.container.packaging.resource.ResourceManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * @author zinic */ public class BindingAwarePackageLoader implements PackageLoader { private static final Logger LOG = LoggerFactory.getLogger(BindingAwarePackageLoader.class); private final Map<String, PackageContext> loadedPackages; private final BindingEnvironmentFactory bindingEnvFactory; public BindingAwarePackageLoader(BindingEnvironmentFactory bindingEnvFactory) { this.bindingEnvFactory = bindingEnvFactory; loadedPackages = new HashMap<String, PackageContext>(); } @Override public synchronized void load(String name, ResourceManager deployedPackage) throws PackageLoadingException { final List<BindingEnvironment> bindingEnvironments = bindingEnvFactory.newEnviornment(deployedPackage); final PackageContext newPackageContext = new PackageContextImpl(new PackageBindingsImpl(bindingEnvironments), name); // Read through all of the resources for (Resource resource : deployedPackage.resources()) { final BindingEnvironment env = getBindingEnvironment(bindingEnvironments, resource); if (env != null) { try { env.load(resource); } catch (PackageLoadingException ble) { if (!LOG.isDebugEnabled()) { LOG.error("Failed to load package resource: " + name + File.separator + resource.relativePath() + ". Reason: " + ble.getMessage()); } else { LOG.error("Failed to load package resource: " + name + File.separator + resource.relativePath() + ". Reason: " + ble.getMessage(), ble); } } } } // Register the new package loadedPackages.put(name, newPackageContext); } private static BindingEnvironment getBindingEnvironment(List<BindingEnvironment> bindingEnvironments, Resource resource) { for (BindingEnvironment env : bindingEnvironments) { for (String extension : env.language().fileExtensions()) { if (resource.relativePath().endsWith(extension)) { return env; } } } return null; } @Override public Collection<PackageContext> packageContexts() { return loadedPackages.values(); } }