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;
+    }
 }