This is an automated email from the ASF dual-hosted git repository. cziegeler pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-installer-factory-feature.git
commit 35fee328c31d0243fe14c6e4dca44a34c525667d Author: Carsten Ziegeler <[email protected]> AuthorDate: Thu Apr 23 17:11:07 2020 +0200 Add feature region support --- bnd.bnd | 2 + pom.xml | 30 +++--- .../model/impl/FeatureModelInstallerPlugin.java | 12 +-- .../factory/model/impl/InstallContext.java | 14 +-- .../model/impl/InstallFeatureModelTask.java | 119 ++++++++++----------- 5 files changed, 74 insertions(+), 103 deletions(-) diff --git a/bnd.bnd b/bnd.bnd new file mode 100644 index 0000000..d2c832f --- /dev/null +++ b/bnd.bnd @@ -0,0 +1,2 @@ +-includeresource: @org.apache.sling.feature.extension.apiregions-[0-9.]*.jar!/org/apache/sling/feature/extension/apiregions/launcher/LauncherProperties.* +Conditional-Package: org.apache.sling.feature.extension.apiregions.api diff --git a/pom.xml b/pom.xml index fe8398e..76a1193 100644 --- a/pom.xml +++ b/pom.xml @@ -79,6 +79,12 @@ <artifactId>osgi.core</artifactId> </dependency> <dependency> + <groupId>org.apache.geronimo.specs</groupId> + <artifactId>geronimo-json_1.1_spec</artifactId> + <version>1.2</version> + <scope>provided</scope> + </dependency> + <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> @@ -94,24 +100,6 @@ </dependency> <dependency> <groupId>org.apache.sling</groupId> - <artifactId>org.apache.sling.jcr.api</artifactId> - <version>2.4.0</version> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.apache.sling</groupId> - <artifactId>org.apache.sling.jcr.repoinit</artifactId> - <version>1.1.0</version> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.apache.sling</groupId> - <artifactId>org.apache.sling.repoinit.parser</artifactId> - <version>1.1.0</version> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.feature</artifactId> <version>1.1.8</version> <scope>provided</scope> @@ -122,6 +110,12 @@ <version>1.3.0</version> <scope>provided</scope> </dependency> + <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.feature.extension.apiregions</artifactId> + <version>1.1.4</version> + <scope>provided</scope> + </dependency> <!-- Testing --> <dependency> <groupId>junit</groupId> diff --git a/src/main/java/org/apache/sling/installer/factory/model/impl/FeatureModelInstallerPlugin.java b/src/main/java/org/apache/sling/installer/factory/model/impl/FeatureModelInstallerPlugin.java index fb34de2..3c1b870 100644 --- a/src/main/java/org/apache/sling/installer/factory/model/impl/FeatureModelInstallerPlugin.java +++ b/src/main/java/org/apache/sling/installer/factory/model/impl/FeatureModelInstallerPlugin.java @@ -94,15 +94,6 @@ public class FeatureModelInstallerPlugin implements InstallTaskFactory, Resource /** Logger. */ private final Logger logger = LoggerFactory.getLogger(this.getClass()); -// @Reference -// private SlingRepository repository; - -// @Reference -// private JcrRepoInitOpsProcessor repoInitProcessor; - -// @Reference -// private RepoInitParser repoInitParser; - private final BundleContext bundleContext; private final ArtifactManager artifactManager; @@ -234,8 +225,7 @@ public class FeatureModelInstallerPlugin implements InstallTaskFactory, Resource if (rsrc.getState() == ResourceState.UNINSTALL ) { return new UninstallFeatureModelTask(group, bundleContext); } - final InstallContext ctx = new InstallContext(//this.repository, this.repoInitProcessor, this.repoInitParser, - this.artifactManager, this.storageDirectory); + final InstallContext ctx = new InstallContext(this.artifactManager, this.storageDirectory); return new InstallFeatureModelTask(group, ctx, this.bundleContext); } diff --git a/src/main/java/org/apache/sling/installer/factory/model/impl/InstallContext.java b/src/main/java/org/apache/sling/installer/factory/model/impl/InstallContext.java index 9f7f42f..8408f91 100644 --- a/src/main/java/org/apache/sling/installer/factory/model/impl/InstallContext.java +++ b/src/main/java/org/apache/sling/installer/factory/model/impl/InstallContext.java @@ -24,23 +24,11 @@ import org.apache.sling.feature.io.artifacts.ArtifactManager; public class InstallContext { -// public final SlingRepository repository; - -// public final JcrRepoInitOpsProcessor repoInitProcessor; - -// public final RepoInitParser repoInitParser; - public final ArtifactManager artifactManager; public final File storageDirectory; - public InstallContext(//final SlingRepository repository, -// final JcrRepoInitOpsProcessor repoInitProcessor, -// final RepoInitParser repoInitParser, - final ArtifactManager artifactManager, final File storageDirectory) { -// this.repository = repository; -// this.repoInitProcessor = repoInitProcessor; -// this.repoInitParser = repoInitParser; + public InstallContext(final ArtifactManager artifactManager, final File storageDirectory) { this.artifactManager = artifactManager; this.storageDirectory = storageDirectory; } diff --git a/src/main/java/org/apache/sling/installer/factory/model/impl/InstallFeatureModelTask.java b/src/main/java/org/apache/sling/installer/factory/model/impl/InstallFeatureModelTask.java index efce876..f60c0cb 100644 --- a/src/main/java/org/apache/sling/installer/factory/model/impl/InstallFeatureModelTask.java +++ b/src/main/java/org/apache/sling/installer/factory/model/impl/InstallFeatureModelTask.java @@ -38,6 +38,8 @@ import org.apache.sling.feature.Configuration; import org.apache.sling.feature.Extension; import org.apache.sling.feature.ExtensionType; import org.apache.sling.feature.Feature; +import org.apache.sling.feature.extension.apiregions.api.ApiRegions; +import org.apache.sling.feature.extension.apiregions.launcher.LauncherProperties; import org.apache.sling.feature.io.archive.ArchiveReader; import org.apache.sling.feature.io.artifacts.ArtifactHandler; import org.apache.sling.feature.io.json.FeatureJSONReader; @@ -54,6 +56,14 @@ import org.osgi.framework.BundleContext; */ public class InstallFeatureModelTask extends AbstractFeatureModelTask { + private static final String PROP_idbsnver = "mapping.bundleid.bsnver"; + private static final String PROP_bundleFeatures = "mapping.bundleid.features"; + private static final String PROP_featureRegions = "mapping.featureid.regions"; + private static final String PROP_regionPackage = "mapping.region.packages"; + + private static final String REGION_FACTORY_PID = "org.apache.sling.feature.apiregions.factory~"; + private static final String REPOINIT_FACTORY_PID = "org.apache.sling.jcr.repoinit.RepositoryInitializer~"; + private final InstallContext installContext; public InstallFeatureModelTask(final TaskResourceGroup group, @@ -62,7 +72,6 @@ public class InstallFeatureModelTask extends AbstractFeatureModelTask { this.installContext = installContext; } - @SuppressWarnings("deprecation") @Override public void execute(final InstallationContext ctx) { try { @@ -74,49 +83,17 @@ public class InstallFeatureModelTask extends AbstractFeatureModelTask { this.getResourceGroup().setFinishState(ResourceState.IGNORED); } else { boolean success = false; - final Result result = this.transform(featureJson, resource); + final List<InstallableResource> result = this.transform(featureJson, resource); if (result == null) { ctx.log("Unable to install feature model resource {} : unable to create resources", resource); this.getResourceGroup().setFinishState(ResourceState.IGNORED); } else { - // repo init first -/* if (result.repoinit != null) { - List<Operation> ops = null; - try (final Reader r = new StringReader(result.repoinit)) { - ops = this.installContext.repoInitParser.parse(r); - } catch (final IOException | RepoInitParsingException e) { - logger.error("Unable to parse repoinit text.", e); - ctx.log("Unable to install feature model resource {} : unable parse repoinit text.", - resource); - this.getResourceGroup().setFinishState(ResourceState.IGNORED); - return; - } - - // login admin is required for repo init - Session session = null; - try { - session = this.installContext.repository.loginAdministrative(null); - this.installContext.repoInitProcessor.apply(session, ops); - session.save(); - } catch (final RepositoryException re) { - logger.error("Unable to process repoinit text.", re); - ctx.log("Unable to install feature model resource {} : unable to process repoinit text.", - resource); - this.getResourceGroup().setFinishState(ResourceState.IGNORED); - return; - - } finally { - if (session != null) { - session.logout(); - } - } - }*/ - if (!result.resources.isEmpty()) { + if (!result.isEmpty()) { final OsgiInstaller installer = this.getService(OsgiInstaller.class); if (installer != null) { installer.registerResources( getScheme(resource), - result.resources.toArray(new InstallableResource[result.resources.size()])); + result.toArray(new InstallableResource[result.size()])); } else { ctx.log("Unable to install feature model resource {} : unable to get OSGi installer", resource); @@ -136,16 +113,11 @@ public class InstallFeatureModelTask extends AbstractFeatureModelTask { } } - public static final class Result { - public final List<InstallableResource> resources = new ArrayList<>(); -// public String repoinit; - } - private File getArtifactFile(final File baseDir, final ArtifactId id) { return new File(baseDir, id.toMvnId().replace('/', File.separatorChar)); } - private Result transform(final String featureJson, + private List<InstallableResource> transform(final String featureJson, final TaskResource rsrc) { Feature feature = null; try (final Reader reader = new StringReader(featureJson)) { @@ -157,8 +129,26 @@ public class InstallFeatureModelTask extends AbstractFeatureModelTask { return null; } + final List<InstallableResource> result = new ArrayList<>(); + // configurations + for (final Configuration cfg : feature.getConfigurations()) { + result.add(new InstallableResource("/".concat(cfg.getPid()).concat(".config"), null, + cfg.getConfigurationProperties(), null, InstallableResource.TYPE_CONFIG, null)); + } + + // repoinit + final Extension repoInit = feature.getExtensions().getByName(Extension.EXTENSION_NAME_REPOINIT); + if (repoInit != null && repoInit.getType() == ExtensionType.TEXT) { + final String configPid = REPOINIT_FACTORY_PID.concat(feature.getId().toMvnName().replace('-', '_')); + final Dictionary<String, Object> props = new Hashtable<>(); + props.put("scripts", repoInit.getText()); + + result.add(new InstallableResource("/".concat(configPid).concat(".config"), null, + props, null, InstallableResource.TYPE_CONFIG, null)); + } + + // extract artifacts if (this.installContext.storageDirectory != null) { - // extract artifacts final byte[] buffer = new byte[1024*1024*256]; try ( final InputStream is = rsrc.getInputStream() ) { @@ -184,13 +174,35 @@ public class InstallFeatureModelTask extends AbstractFeatureModelTask { } } + // api regions + final Extension regionExt = feature.getExtensions().getByName(ApiRegions.EXTENSION_NAME); + if ( regionExt != null ) { + try { + final ApiRegions regions = ApiRegions.parse(regionExt.getJSONStructure().asJsonArray()); + + final String configPid = REGION_FACTORY_PID.concat(feature.getId().toMvnName().replace('-', '_')); + final Dictionary<String, Object> props = new Hashtable<>(); + props.put(PROP_idbsnver, LauncherProperties.getBundleIDtoBSNandVersionMap(feature, this.installContext.artifactManager)); + props.put(PROP_bundleFeatures, LauncherProperties.getBundleIDtoFeaturesMap(feature)); + props.put(PROP_featureRegions, LauncherProperties.getFeatureIDtoRegionsMap(regions)); + props.put(PROP_regionPackage, LauncherProperties.getRegionNametoPackagesMap(regions)); - final Result result = new Result(); + result.add(new InstallableResource("/".concat(configPid).concat(".config"), null, + props, null, InstallableResource.TYPE_CONFIG, null)); + } catch (final IOException ioe) { + logger.warn("Unable to parse region information " + feature.getId().toMvnId(), ioe); + return null; + } + } + + // bundles for (final Artifact bundle : feature.getBundles()) { if (!addArtifact(bundle, result)) { return null; } } + + // content packages final Extension ext = feature.getExtensions().getByName(Extension.EXTENSION_NAME_CONTENT_PACKAGES); if (ext != null && ext.getType() == ExtensionType.ARTIFACTS) { for (final Artifact artifact : ext.getArtifacts()) { @@ -198,26 +210,11 @@ public class InstallFeatureModelTask extends AbstractFeatureModelTask { } } - for (final Configuration cfg : feature.getConfigurations()) { - result.resources.add(new InstallableResource("/".concat(cfg.getPid()).concat(".config"), null, - cfg.getConfigurationProperties(), null, InstallableResource.TYPE_CONFIG, null)); - } - - final Extension repoInit = feature.getExtensions().getByName(Extension.EXTENSION_NAME_REPOINIT); - if (repoInit != null && repoInit.getType() == ExtensionType.TEXT) { -// result.repoinit = repoInit.getText(); - final String configPid = "org.apache.sling.jcr.repoinit.RepositoryInitializer~".concat(feature.getId().toMvnName().replace('-', '_')); - final Dictionary<String, Object> props = new Hashtable<>(); - props.put("scripts", repoInit.getText()); - - result.resources.add(new InstallableResource("/".concat(configPid).concat(".config"), null, - props, null, InstallableResource.TYPE_CONFIG, null)); - } return result; } private boolean addArtifact(final Artifact artifact, - final Result result) { + final List<InstallableResource> result) { File artifactFile = (this.installContext.storageDirectory == null ? null : getArtifactFile(this.installContext.storageDirectory, artifact.getId())); ArtifactHandler handler; @@ -250,7 +247,7 @@ public class InstallFeatureModelTask extends AbstractFeatureModelTask { } dict.put(InstallableResource.RESOURCE_URI_HINT, handler.getLocalURL().toString()); - result.resources.add(new InstallableResource("/".concat(artifact.getId().toMvnName()), is, dict, digest, + result.add(new InstallableResource("/".concat(artifact.getId().toMvnName()), is, dict, digest, InstallableResource.TYPE_FILE, null)); } catch (final IOException ioe) { logger.warn("Unable to read artifact " + handler.getLocalURL(), ioe);
