You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2015/06/02 17:14:26 UTC
svn commit: r1683125 - in
/sling/whiteboard/bdelacretaz/crankstart2/crankstart-bootstrap: pom.xml
src/main/java/ src/main/java/org/
src/main/java/org/apache/sling/crankstart/bootstrap/Activator.java
src/main/org/
Author: bdelacretaz
Date: Tue Jun 2 15:14:25 2015
New Revision: 1683125
URL: http://svn.apache.org/r1683125
Log:
Work in progress - Maven resolver not working yet
Added:
sling/whiteboard/bdelacretaz/crankstart2/crankstart-bootstrap/src/main/java/
sling/whiteboard/bdelacretaz/crankstart2/crankstart-bootstrap/src/main/java/org/
- copied from r1683104, sling/whiteboard/bdelacretaz/crankstart2/crankstart-bootstrap/src/main/org/
Removed:
sling/whiteboard/bdelacretaz/crankstart2/crankstart-bootstrap/src/main/org/
Modified:
sling/whiteboard/bdelacretaz/crankstart2/crankstart-bootstrap/pom.xml
sling/whiteboard/bdelacretaz/crankstart2/crankstart-bootstrap/src/main/java/org/apache/sling/crankstart/bootstrap/Activator.java
Modified: sling/whiteboard/bdelacretaz/crankstart2/crankstart-bootstrap/pom.xml
URL: http://svn.apache.org/viewvc/sling/whiteboard/bdelacretaz/crankstart2/crankstart-bootstrap/pom.xml?rev=1683125&r1=1683124&r2=1683125&view=diff
==============================================================================
--- sling/whiteboard/bdelacretaz/crankstart2/crankstart-bootstrap/pom.xml (original)
+++ sling/whiteboard/bdelacretaz/crankstart2/crankstart-bootstrap/pom.xml Tue Jun 2 15:14:25 2015
@@ -51,6 +51,28 @@
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-Activator>org.apache.sling.crankstart.bootstrap.Activator</Bundle-Activator>
+ <Embed-Transitive>true</Embed-Transitive>
+ <Embed-Dependency>
+ org.apache.sling.provisioning.model,
+ jcabi*,
+ maven*,
+ commons-io,
+ commons-lang,
+ commons-lang3
+ </Embed-Dependency>
+ <Import-Package>
+ !com.amazonaws.*,
+ !edu.emory.*,
+ !javax.validation.*,
+ !javax.xml.transform.*,
+ !org.apache.log4j.*,
+ *
+ </Import-Package>
+ </instructions>
+ </configuration>
</plugin>
</plugins>
</build>
@@ -59,10 +81,12 @@
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.core</artifactId>
+ <version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.compendium</artifactId>
+ <version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
@@ -74,5 +98,17 @@
<version>1.1.0</version>
<scope>provided</scope>
</dependency>
+ <dependency>
+ <groupId>com.jcabi</groupId>
+ <artifactId>jcabi-aether</artifactId>
+ <version>0.10.1</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-project</artifactId>
+ <version>2.2.1</version>
+ <scope>provided</scope>
+ </dependency>
</dependencies>
</project>
Modified: sling/whiteboard/bdelacretaz/crankstart2/crankstart-bootstrap/src/main/java/org/apache/sling/crankstart/bootstrap/Activator.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/bdelacretaz/crankstart2/crankstart-bootstrap/src/main/java/org/apache/sling/crankstart/bootstrap/Activator.java?rev=1683125&r1=1683104&r2=1683125&view=diff
==============================================================================
--- sling/whiteboard/bdelacretaz/crankstart2/crankstart-bootstrap/src/main/java/org/apache/sling/crankstart/bootstrap/Activator.java (original)
+++ sling/whiteboard/bdelacretaz/crankstart2/crankstart-bootstrap/src/main/java/org/apache/sling/crankstart/bootstrap/Activator.java Tue Jun 2 15:14:25 2015
@@ -1,4 +1,165 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
package org.apache.sling.crankstart.bootstrap;
-public class Activator {
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.sling.provisioning.model.Artifact;
+import org.apache.sling.provisioning.model.ArtifactGroup;
+import org.apache.sling.provisioning.model.Feature;
+import org.apache.sling.provisioning.model.Model;
+import org.apache.sling.provisioning.model.ModelUtility;
+import org.apache.sling.provisioning.model.RunMode;
+import org.apache.sling.provisioning.model.io.ModelReader;
+import org.eclipse.aether.util.artifact.JavaScopes;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.sonatype.aether.repository.RemoteRepository;
+import org.sonatype.aether.resolution.DependencyResolutionException;
+import org.sonatype.aether.util.artifact.DefaultArtifact;
+
+import com.jcabi.aether.Aether;
+
+public class Activator implements BundleActivator {
+
+ public static final String PM_FOLDER_NAME = "provisioning.model.folder";
+ public static final String MODEL_FILE_EXT = ".txt";
+
+ // Maven repo setup
+ // TODO configurable repos etc
+ private final File local = new File(System.getProperty("user.home"), ".m2/repository");
+ private final Collection<RemoteRepository> remotes = Arrays.asList(
+ new RemoteRepository(
+ "maven-central",
+ "default",
+ "http://repo1.maven.org/maven2/"
+ )
+ );
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ final String pmFolder = context.getProperty(PM_FOLDER_NAME);
+ if(pmFolder == null || pmFolder.length() == 0) {
+ throw new Exception("Missing context property:" + PM_FOLDER_NAME);
+ }
+ final File f = new File(pmFolder);
+ if(!f.isDirectory()) {
+ throw new IOException("Provisioning model folder not found:" + f.getAbsolutePath());
+ }
+ installFromModel(context, f);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ }
+
+ private void log(String msg) {
+ // TODO dynamically grab a log service?
+ System.err.println(getClass().getSimpleName() + ":" + msg);
+ }
+
+ private void installFromModel(BundleContext context, File modelFolder) throws IOException, BundleException, DependencyResolutionException {
+ Model m = null;
+
+ // Read and parse the model
+ for(String filename : modelFolder.list()) {
+ final File modelFile = new File(modelFolder, filename);
+ if(!modelFile.getName().endsWith(MODEL_FILE_EXT)) {
+ log("Model file name does not end with " + MODEL_FILE_EXT + ", ignored:" + modelFile.getName());
+ continue;
+ }
+ final Reader r = new FileReader(modelFile);
+ try {
+ final Model current = ModelReader.read(r, modelFile.getAbsolutePath());
+ if(m == null) {
+ log("Initial model: " + modelFile.getName());
+ m = current;
+ } else {
+ log("Merging additional model: " + modelFile.getName());
+ ModelUtility.merge(m, current);
+ }
+ } finally {
+ r.close();
+ }
+ }
+
+
+ // Install model bundles
+ // TODO handle other artifacts: configs, nested models etc
+ final Aether aether = new Aether(remotes, local);
+ final List<Bundle> installed = new ArrayList<Bundle>();
+ m = ModelUtility.getEffectiveModel(m, null);
+ for(Feature f : m.getFeatures()) {
+ log("Processing provisioning model feature: " + f.getName());
+ for(RunMode rm : f.getRunModes()) {
+ for(ArtifactGroup g : rm.getArtifactGroups()) {
+ final int startLevel = g.getStartLevel();
+ for(Artifact a : g) {
+ final String url = a.getGroupId() + "/" + a.getArtifactId() + "/" + a.getVersion();
+ installed.add(installBundle(context, aether, url, startLevel));
+ }
+ }
+ }
+ }
+
+ log("Starting " + installed.size() + " installed bundles");
+ for(Bundle b : installed) {
+ b.start();
+ }
+ }
+
+ private Bundle installBundle(BundleContext ctx, Aether aether, String mavenCoords, int startLevel) throws IOException, BundleException, DependencyResolutionException {
+ final DefaultArtifact a = new DefaultArtifact(mavenCoords);
+ final List<org.sonatype.aether.artifact.Artifact> list = aether.resolve(a, JavaScopes.RUNTIME);
+ if(list.isEmpty()) {
+ log("Cannot resolve artifact:" + mavenCoords);
+ }
+ final InputStream bundleStream = new BufferedInputStream(new FileInputStream(list.get(0).getFile()));
+ Bundle b = null;
+ try {
+ b = ctx.installBundle(mavenCoords, bundleStream);
+ if(startLevel > 0) {
+ /* TODO
+ final BundleStartLevel bsl = (BundleStartLevel)b.adapt(BundleStartLevel.class);
+ if(bsl == null) {
+ log("Bundle does not adapt to BundleStartLevel, cannot set start level: " + urlString);
+ }
+ bsl.setStartLevel(startLevel);
+ */
+ }
+
+ log("bundle installed at start level " + startLevel + ": " + mavenCoords);
+ } finally {
+ bundleStream.close();
+ }
+ return b;
+ }
}