/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.container.api;
import static java.util.Collections.unmodifiableSet;
import static org.mule.runtime.api.util.Preconditions.checkArgument;
import org.mule.runtime.core.util.StringUtils;
import org.mule.runtime.module.artifact.classloader.ExportedService;
import java.util.List;
import java.util.Set;
/**
* Defines a module on the Mule container
*/
public class MuleModule {
protected static final String INVALID_PRIVILEGED_API_DEFINITION_ERROR =
"Invalid privileged API: both privileged packages and artifacts must be defined";
private final String name;
private final Set<String> exportedPackages;
private final Set<String> exportedPaths;
private final Set<String> privilegedExportedPackages;
private final Set<String> privilegedArtifacts;
private final List<ExportedService> exportedServices;
/**
* Creates a new module
*
* @param name module name. Not empty.
* @param exportedPackages java packages exported by this module. Not null.
* @param exportedPaths java resources exported by this module. Not null;
* @param privilegedExportedPackages java packages exported by this module to privileged artifacts only. Not null.
* @param privilegedArtifacts name of the artifacts with privileged access to the API. Non null.
* @param exportedServices contains the definition of service implementations that must be accessible to artifacts via SPI. Non null.
*/
public MuleModule(String name, Set<String> exportedPackages, Set<String> exportedPaths, Set<String> privilegedExportedPackages,
Set<String> privilegedArtifacts, List<ExportedService> exportedServices) {
checkArgument(!StringUtils.isEmpty(name), "name cannot be empty");
checkArgument(exportedPackages != null, "exportedPackages cannot be null");
checkArgument(exportedPaths != null, "exportedPaths cannot be null");
checkArgument(!containsMetaInfServicesResource(exportedPaths), "exportedPaths cannot contain paths on META-INF/services");
checkArgument(privilegedExportedPackages != null, "privilegedExportedPackages cannot be null");
checkArgument(privilegedArtifacts != null, "privilegedArtifacts cannot be null");
checkArgument((privilegedArtifacts.isEmpty() && privilegedExportedPackages.isEmpty())
|| (!privilegedArtifacts.isEmpty() && !privilegedExportedPackages.isEmpty()), INVALID_PRIVILEGED_API_DEFINITION_ERROR);
checkArgument(exportedServices != null, "exportedServices cannot be null");
this.name = name;
this.exportedPackages = unmodifiableSet(exportedPackages);
this.exportedPaths = unmodifiableSet(exportedPaths);
this.privilegedExportedPackages = privilegedExportedPackages;
this.privilegedArtifacts = privilegedArtifacts;
this.exportedServices = exportedServices;
}
private boolean containsMetaInfServicesResource(Set<String> exportedPaths) {
return exportedPaths.stream().filter(s -> s.startsWith("META-INF/services")).findAny().isPresent();
}
public String getName() {
return name;
}
public Set<String> getExportedPackages() {
return exportedPackages;
}
public Set<String> getExportedPaths() {
return exportedPaths;
}
public Set<String> getPrivilegedExportedPackages() {
return privilegedExportedPackages;
}
public Set<String> getPrivilegedArtifacts() {
return privilegedArtifacts;
}
public List<ExportedService> getExportedServices() {
return exportedServices;
}
}