in src/main/java/org/apache/sling/maven/slingstart/PreparePackageMojo.java [345:398]
private File createSubsystemBaseFile(Feature feature, AtomicInteger startLevelHolder) throws MojoExecutionException {
File subsystemFile = new File(getTmpDir(), feature.getName() + ".subsystem-base");
if (subsystemFile.exists()) {
// This subsystem has already been created
// TODO is there a better way to avoid calling this multiple times?
return null;
}
startLevelHolder.set(-1);
// The runmodes information has to be the first item in the archive so that we always have it available when the
// archive is being processed. For this reason a Jar file is used here as it's guaranteed to store the manifest
// first.
Manifest runModesManifest = getRunModesManifest(feature);
getLog().info("Creating subsystem base file: " + subsystemFile.getName());
boolean created = subsystemFile.getParentFile().mkdirs();
if ( !created ) {
throw new MojoExecutionException("Failed creating " + subsystemFile.getParentFile().getAbsolutePath());
}
try (JarOutputStream os = new JarOutputStream(new FileOutputStream(subsystemFile), runModesManifest)) {
Map<String, Integer> bsnStartOrderMap = new HashMap<>();
for (RunMode rm : feature.getRunModes()) {
for (ArtifactGroup ag : rm.getArtifactGroups()) {
int startOrder = ag.getStartLevel(); // For subsystems the start level on the artifact group is used as start order.
for (org.apache.sling.provisioning.model.Artifact a : ag) {
Artifact artifact = ModelUtils.getArtifact(this.project, this.mavenSession, this.artifactHandlerManager, this.resolver,
a.getGroupId(), a.getArtifactId(), a.getVersion(), a.getType(), a.getClassifier());
File artifactFile = artifact.getFile();
String entryName = getEntryName(artifactFile, startOrder);
ZipEntry ze = new ZipEntry(entryName);
try {
os.putNextEntry(ze);
Files.copy(artifactFile.toPath(), os);
} finally {
os.closeEntry();
}
}
}
}
int sl = createSubsystemManifest(feature, bsnStartOrderMap, os);
if (sl != -1)
startLevelHolder.set(sl);
addReadme(os);
} catch (IOException ioe) {
throw new MojoExecutionException("Problem creating subsystem .esa file " + subsystemFile, ioe);
}
return subsystemFile;
}