private ModuleIdentifier createAdditionalModule(final ResourceRoot resourceRoot, final DeploymentUnit topLevelDeployment, final VirtualFile topLevelRoot, final Map<VirtualFile, AdditionalModuleSpecification> additionalModules, final VirtualFile classPathFile, final ArrayDeque<RootEntry> resourceRoots) throws DeploymentUnitProcessingException { final ResourceRoot root = createResourceRoot(classPathFile, topLevelDeployment, topLevelRoot); final String pathName = root.getRoot().getPathNameRelativeTo(topLevelRoot); ModuleIdentifier identifier = ModuleIdentifier.create(ServiceModuleLoader.MODULE_PREFIX + topLevelDeployment.getName() + "." + pathName); AdditionalModuleSpecification module = new AdditionalModuleSpecification(identifier, root); topLevelDeployment.addToAttachmentList(Attachments.ADDITIONAL_MODULES, module); additionalModules.put(classPathFile, module); resourceRoot.addToAttachmentList(Attachments.CLASS_PATH_RESOURCE_ROOTS, root); //add this to the list of roots to be processed, so transitive class path entries will be respected resourceRoots.add(new RootEntry(module, root)); return identifier; }
public void deploy(final DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException { final DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit(); final ModuleSpecification moduleSpecification = deploymentUnit.getAttachment(Attachments.MODULE_SPECIFICATION); final ModuleLoader moduleLoader = deploymentUnit.getAttachment(Attachments.SERVICE_MODULE_LOADER); final AttachmentList<ModuleIdentifier> entries = deploymentUnit.getAttachment(Attachments.CLASS_PATH_ENTRIES); if (entries != null) { for (ModuleIdentifier entry : entries) { //class path items are always exported to make transitive dependencies work moduleSpecification.addLocalDependency(new ModuleDependency(moduleLoader, entry, false, true, true, false)); } } final List<AdditionalModuleSpecification> additionalModules = deploymentUnit.getAttachment(Attachments.ADDITIONAL_MODULES); if (additionalModules != null) { for (AdditionalModuleSpecification additionalModule : additionalModules) { final AttachmentList<ModuleIdentifier> dependencies = additionalModule.getAttachment(Attachments.CLASS_PATH_ENTRIES); if (dependencies == null || dependencies.isEmpty()) { continue; } // additional modules export any class-path entries // this means that a module that references the additional module // gets access to the transitive closure of its call-path entries for (ModuleIdentifier entry : dependencies) { additionalModule.addLocalDependency(new ModuleDependency(moduleLoader, entry, false, true, true, false)); } // add a dependency on the top ear itself for good measure additionalModule.addLocalDependency(new ModuleDependency(moduleLoader, deploymentUnit.getAttachment(Attachments.MODULE_IDENTIFIER), false, false, true, false)); } } }
/** * Gives any additional modules the same dependencies and permissions as the primary module. * <p/> * This makes sure they can access all API classes etc. * * @param moduleSpecification The primary module spec * @param module The additional module */ private void addAllDependenciesAndPermissions(final ModuleSpecification moduleSpecification, final AdditionalModuleSpecification module) { module.addSystemDependencies(moduleSpecification.getSystemDependencies()); module.addLocalDependencies(moduleSpecification.getLocalDependencies()); for(ModuleDependency dep : moduleSpecification.getUserDependencies()) { if(!dep.getIdentifier().equals(module.getModuleIdentifier())) { module.addUserDependency(dep); } } for(PermissionFactory factory : moduleSpecification.getPermissionFactories()) { module.addPermissionFactory(factory); } }
Set<ModuleIdentifier> additionalModules = new HashSet<>(); for(AdditionalModuleSpecification i : deploymentUnit.getParent().getAttachmentList(Attachments.ADDITIONAL_MODULES)) { additionalModules.add(i.getModuleIdentifier()); final AdditionalModuleSpecification additional = new AdditionalModuleSpecification(additionalModule.getModuleIdentifier(), additionalModuleResourceRoots); additional.addAliases(additionalModule.getAliases()); additional.addSystemDependencies(additionalModule.getModuleDependencies()); deploymentUnit.addToAttachmentList(Attachments.ADDITIONAL_MODULES, additional); for (final ResourceRoot root : additionalModuleResourceRoots) {
Map<ModuleIdentifier, AdditionalModuleSpecification> additionalModuleSpecificationMap = new HashMap<>(); for(AdditionalModuleSpecification i : top.getAttachmentList(Attachments.ADDITIONAL_MODULES)) { additionalModuleSpecificationMap.put(i.getModuleIdentifier(), i); AdditionalModuleSpecification additional = additionalModuleSpecificationMap.get(moduleIdentifier); if(additional != null) { for(ResourceRoot resource : additional.getResourceRoots()) { ResourceRootIndexer.indexResourceRoot(resource); Index indexAttachment = resource.getAttachment(Attachments.ANNOTATION_INDEX);
final AdditionalModuleSpecification additional = new AdditionalModuleSpecification(additionalModule.getModuleIdentifier(), additionalModuleResourceRoots); additional.addAliases(additionalModule.getAliases()); additional.addSystemDependencies(additionalModule.getModuleDependencies()); deploymentUnit.addToAttachmentList(Attachments.ADDITIONAL_MODULES, additional); for (final ResourceRoot root : additionalModuleResourceRoots) {
for (ResourceRoot additionalModuleResourceRoot : module.getResourceRoots()) { additionalModules.put(additionalModuleResourceRoot.getRoot(), module);
private void handlingExistingClassPathEntry(final DeploymentUnit deploymentUnit, final ArrayDeque<RootEntry> resourceRoots, final DeploymentUnit topLevelDeployment, final VirtualFile topLevelRoot, final Map<VirtualFile, ResourceRoot> subDeployments, final Map<VirtualFile, AdditionalModuleSpecification> additionalModules, final Set<VirtualFile> existingAccessibleRoots, final ResourceRoot resourceRoot, final Attachable target, final VirtualFile classPathFile) throws DeploymentUnitProcessingException { if (existingAccessibleRoots.contains(classPathFile)) { ServerLogger.DEPLOYMENT_LOGGER.debugf("Class-Path entry %s in %s ignored, as target is already accessible", classPathFile, resourceRoot.getRoot()); } else if (additionalModules.containsKey(classPathFile)) { final AdditionalModuleSpecification moduleSpecification = additionalModules.get(classPathFile); //as class path entries are exported, transitive dependencies will also be available target.addToAttachmentList(Attachments.CLASS_PATH_ENTRIES, moduleSpecification.getModuleIdentifier()); } else if (subDeployments.containsKey(classPathFile)) { //now we need to calculate the sub deployment module identifier //unfortunately the sub deployment has not been setup yet, so we cannot just //get it from the sub deployment directly final ResourceRoot otherRoot = subDeployments.get(classPathFile); target.addToAttachmentList(Attachments.CLASS_PATH_ENTRIES, ModuleIdentifierProcessor.createModuleIdentifier(otherRoot.getRootName(), otherRoot, topLevelDeployment, topLevelRoot, false)); } else { createAdditionalModule(deploymentUnit, resourceRoot, topLevelDeployment, topLevelRoot, additionalModules, classPathFile, resourceRoots); } }
module.addLocalDependency(new ModuleDependency(moduleLoader, moduleIdentifier, false, false, true, false));
/** * Gives any additional modules the same system dependencies as the primary module. * <p/> * This makes sure they can access all API classes etc. * * @param moduleSpecification The primary module spec * @param module The additional module */ private void addSystemDependencies(final ModuleSpecification moduleSpecification, final AdditionalModuleSpecification module) { module.addSystemDependencies(moduleSpecification.getSystemDependencies()); }
Set<ModuleIdentifier> additionalModules = new HashSet<>(); for(AdditionalModuleSpecification i : deploymentUnit.getParent().getAttachmentList(Attachments.ADDITIONAL_MODULES)) { additionalModules.add(i.getModuleIdentifier()); final AdditionalModuleSpecification additional = new AdditionalModuleSpecification(additionalModule.getModuleIdentifier(), additionalModuleResourceRoots); additional.addAliases(additionalModule.getAliases()); additional.addSystemDependencies(additionalModule.getModuleDependencies()); deploymentUnit.addToAttachmentList(Attachments.ADDITIONAL_MODULES, additional); for (final ResourceRoot root : additionalModuleResourceRoots) {
Map<ModuleIdentifier, AdditionalModuleSpecification> additionalModuleSpecificationMap = new HashMap<>(); for(AdditionalModuleSpecification i : top.getAttachmentList(Attachments.ADDITIONAL_MODULES)) { additionalModuleSpecificationMap.put(i.getModuleIdentifier(), i); AdditionalModuleSpecification additional = additionalModuleSpecificationMap.get(moduleIdentifier); if(additional != null) { for(ResourceRoot resource : additional.getResourceRoots()) { ResourceRootIndexer.indexResourceRoot(resource); Index indexAttachment = resource.getAttachment(Attachments.ANNOTATION_INDEX);
final AdditionalModuleSpecification additional = new AdditionalModuleSpecification(additionalModule.getModuleIdentifier(), additionalModuleResourceRoots); additional.addAliases(additionalModule.getAliases()); additional.addSystemDependencies(additionalModule.getModuleDependencies()); deploymentUnit.addToAttachmentList(Attachments.ADDITIONAL_MODULES, additional); for (final ResourceRoot root : additionalModuleResourceRoots) {
for (ResourceRoot additionalModuleResourceRoot : module.getResourceRoots()) { additionalModules.put(additionalModuleResourceRoot.getRoot(), module);
private void handlingExistingClassPathEntry(final ArrayDeque<RootEntry> resourceRoots, final DeploymentUnit topLevelDeployment, final VirtualFile topLevelRoot, final Map<VirtualFile, ResourceRoot> subDeployments, final Map<VirtualFile, AdditionalModuleSpecification> additionalModules, final Set<VirtualFile> existingAccessibleRoots, final ResourceRoot resourceRoot, final Attachable target, final VirtualFile classPathFile) throws DeploymentUnitProcessingException { if (existingAccessibleRoots.contains(classPathFile)) { ServerLogger.DEPLOYMENT_LOGGER.debugf("Class-Path entry %s in %s ignored, as target is already accessible", classPathFile, resourceRoot.getRoot()); } else if (additionalModules.containsKey(classPathFile)) { final AdditionalModuleSpecification moduleSpecification = additionalModules.get(classPathFile); //as class path entries are exported, transitive dependencies will also be available target.addToAttachmentList(Attachments.CLASS_PATH_ENTRIES, moduleSpecification.getModuleIdentifier()); } else if (subDeployments.containsKey(classPathFile)) { //now we need to calculate the sub deployment module identifier //unfortunately the sub deployment has not been setup yet, so we cannot just //get it from the sub deployment directly final ResourceRoot otherRoot = subDeployments.get(classPathFile); target.addToAttachmentList(Attachments.CLASS_PATH_ENTRIES, ModuleIdentifierProcessor.createModuleIdentifier(otherRoot.getRootName(), otherRoot, topLevelDeployment, topLevelRoot, false)); } else { ModuleIdentifier identifier = createAdditionalModule(resourceRoot, topLevelDeployment, topLevelRoot, additionalModules, classPathFile, resourceRoots); target.addToAttachmentList(Attachments.CLASS_PATH_ENTRIES, identifier); } }
module.addLocalDependency(new ModuleDependency(moduleLoader, moduleIdentifier, false, false, true, false));
/** * Gives any additional modules the same dependencies and permissions as the primary module. * <p/> * This makes sure they can access all API classes etc. * * @param moduleSpecification The primary module spec * @param module The additional module */ private void addAllDependenciesAndPermissions(final ModuleSpecification moduleSpecification, final AdditionalModuleSpecification module) { module.addSystemDependencies(moduleSpecification.getSystemDependencies()); module.addLocalDependencies(moduleSpecification.getLocalDependencies()); for(ModuleDependency dep : moduleSpecification.getUserDependencies()) { if(!dep.getIdentifier().equals(module.getModuleIdentifier())) { module.addUserDependency(dep); } } for(PermissionFactory factory : moduleSpecification.getPermissionFactories()) { module.addPermissionFactory(factory); } }
for (final AdditionalModuleSpecification module : additionalModules) { addAllDependenciesAndPermissions(moduleSpec, module); List<ResourceRoot> roots = module.getResourceRoots(); ServiceName serviceName = createModuleService(phaseContext, deploymentUnit, roots, parentResourceRoots, module, module.getModuleIdentifier()); phaseContext.addToAttachmentList(Attachments.NEXT_PHASE_DEPS, serviceName);
public void deploy(final DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException { final DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit(); final ModuleSpecification moduleSpecification = deploymentUnit.getAttachment(Attachments.MODULE_SPECIFICATION); final ModuleLoader moduleLoader = deploymentUnit.getAttachment(Attachments.SERVICE_MODULE_LOADER); final AttachmentList<ModuleIdentifier> entries = deploymentUnit.getAttachment(Attachments.CLASS_PATH_ENTRIES); if (entries != null) { for (ModuleIdentifier entry : entries) { //class path items are always exported to make transitive dependencies work moduleSpecification.addLocalDependency(new ModuleDependency(moduleLoader, entry, false, true, true, false)); } } final List<AdditionalModuleSpecification> additionalModules = deploymentUnit.getAttachment(Attachments.ADDITIONAL_MODULES); if (additionalModules != null) { for (AdditionalModuleSpecification additionalModule : additionalModules) { final AttachmentList<ModuleIdentifier> dependencies = additionalModule.getAttachment(Attachments.CLASS_PATH_ENTRIES); if (dependencies == null || dependencies.isEmpty()) { continue; } // additional modules export any class-path entries // this means that a module that references the additional module // gets access to the transitive closure of its call-path entries for (ModuleIdentifier entry : dependencies) { additionalModule.addLocalDependency(new ModuleDependency(moduleLoader, entry, false, true, true, false)); } // add a dependency on the top ear itself for good measure additionalModule.addLocalDependency(new ModuleDependency(moduleLoader, deploymentUnit.getAttachment(Attachments.MODULE_IDENTIFIER), false, false, true, false)); } } }
for (ResourceRoot additionalModuleResourceRoot : module.getResourceRoots()) { additionalModules.put(additionalModuleResourceRoot.getRoot(), module);