ace-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From br...@apache.org
Subject svn commit: r1504472 [3/3] - in /ace/trunk: build/ cnf/localrepo/ cnf/localrepo/biz.aQute.bnd/ cnf/localrepo/biz.aQute.repository/ cnf/localrepo/org.osgi.impl.bundle.repoindex.lib/ org.apache.ace.client.repository/ org.apache.ace.deployment.rp.autoconf...
Date Thu, 18 Jul 2013 13:54:47 GMT
Added: ace/trunk/cnf/localrepo/org.osgi.impl.bundle.repoindex.lib/org.osgi.impl.bundle.repoindex.lib-0.0.4.jar
URL: http://svn.apache.org/viewvc/ace/trunk/cnf/localrepo/org.osgi.impl.bundle.repoindex.lib/org.osgi.impl.bundle.repoindex.lib-0.0.4.jar?rev=1504472&view=auto
==============================================================================
Binary file - no diff available.

Propchange: ace/trunk/cnf/localrepo/org.osgi.impl.bundle.repoindex.lib/org.osgi.impl.bundle.repoindex.lib-0.0.4.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: ace/trunk/org.apache.ace.client.repository/bnd.bnd
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.client.repository/bnd.bnd?rev=1504472&r1=1504471&r2=1504472&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.client.repository/bnd.bnd (original)
+++ ace/trunk/org.apache.ace.client.repository/bnd.bnd Thu Jul 18 13:54:46 2013
@@ -17,4 +17,4 @@
 	org.apache.ace.test;version=latest,\
 	org.apache.ace.repository.ext;version=latest,\
 	org.apache.ace.log.server.store.api;version=latest
--sub: *.bnd
\ No newline at end of file
+-sub: *.bnd

Modified: ace/trunk/org.apache.ace.deployment.rp.autoconf/bnd.bnd
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.deployment.rp.autoconf/bnd.bnd?rev=1504472&r1=1504471&r2=1504472&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.deployment.rp.autoconf/bnd.bnd (original)
+++ ace/trunk/org.apache.ace.deployment.rp.autoconf/bnd.bnd Thu Jul 18 13:54:46 2013
@@ -5,7 +5,7 @@ Bundle-Description: Apache ACE AutoConf 
 Bundle-DocURL: http://ace.apache.org/ 
 Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
 Bundle-Name: Apache ACE AutoConf Resource Processor
-Bundle-Vendor Apache Software Foundation 
+	Bundle-Vendor Apache Software Foundation 
 Bundle-Version: 1.0.0
 Deployment-ProvidesResourceProcessor: org.osgi.deployment.rp.autoconf
 DeploymentPackage-Customizer: true 

Added: ace/trunk/org.apache.ace.gogo/.classpath
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.gogo/.classpath?rev=1504472&view=auto
==============================================================================
--- ace/trunk/org.apache.ace.gogo/.classpath (added)
+++ ace/trunk/org.apache.ace.gogo/.classpath Thu Jul 18 13:54:46 2013
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="bin" path="src"/>
+	<classpathentry kind="src" output="bin_test" path="test"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="aQute.bnd.classpath.container"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

Added: ace/trunk/org.apache.ace.gogo/.gitignore
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.gogo/.gitignore?rev=1504472&view=auto
==============================================================================
--- ace/trunk/org.apache.ace.gogo/.gitignore (added)
+++ ace/trunk/org.apache.ace.gogo/.gitignore Thu Jul 18 13:54:46 2013
@@ -0,0 +1,3 @@
+/bin/
+/bin_test/
+/generated/

Added: ace/trunk/org.apache.ace.gogo/.project
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.gogo/.project?rev=1504472&view=auto
==============================================================================
--- ace/trunk/org.apache.ace.gogo/.project (added)
+++ ace/trunk/org.apache.ace.gogo/.project Thu Jul 18 13:54:46 2013
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.apache.ace.gogo</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>bndtools.core.bndbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>bndtools.core.bndnature</nature>
+	</natures>
+</projectDescription>

Added: ace/trunk/org.apache.ace.gogo/.settings/org.eclipse.jdt.core.prefs
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.gogo/.settings/org.eclipse.jdt.core.prefs?rev=1504472&view=auto
==============================================================================
--- ace/trunk/org.apache.ace.gogo/.settings/org.eclipse.jdt.core.prefs (added)
+++ ace/trunk/org.apache.ace.gogo/.settings/org.eclipse.jdt.core.prefs Thu Jul 18 13:54:46 2013
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6

Added: ace/trunk/org.apache.ace.gogo/bnd.bnd
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.gogo/bnd.bnd?rev=1504472&view=auto
==============================================================================
--- ace/trunk/org.apache.ace.gogo/bnd.bnd (added)
+++ ace/trunk/org.apache.ace.gogo/bnd.bnd Thu Jul 18 13:54:46 2013
@@ -0,0 +1,77 @@
+-buildpath: osgi.core,\
+	biz.aQute.repository;version=2.1.0,\
+	biz.aQute.bnd;version=2.1.0,\
+	org.osgi.impl.bundle.repoindex.lib,\
+	org.apache.felix.dependencymanager,\
+	org.apache.felix.gogo.runtime
+
+Bundle-Name: Apache ACE OBR Gogo commands
+Bundle-Description: Provides Gogo commands for working with repositories	
+Bundle-Version: 1.0.0
+Bundle-Activator: org.apache.ace.gogo.Activator
+Private-Package: org.apache.ace.gogo.misc,\
+	org.apache.ace.gogo,\
+	org.apache.ace.gogo.math,\
+	org.apache.ace.gogo.misc,\
+	org.apache.ace.gogo.repo,\
+	org.apache.ace.obr.gogo.deployment,\
+	aQute.lib.json;-split-package:=merge-last,\
+	aQute.libg.filelock;-split-package:=merge-last,\
+	aQute.bnd.annotation.component;-split-package:=merge-last,\
+	aQute.bnd.help;-split-package:=merge-last,\
+	aQute.bnd.maven.support;-split-package:=merge-last,\
+	aQute.bnd.osgi.eclipse;-split-package:=merge-last,\
+	aQute.bnd.service.action;-split-package:=merge-last,\
+	aQute.lib.deployer;-split-package:=merge-last,\
+	aQute.lib.settings;-split-package:=merge-last,\
+	aQute.lib.tag;-split-package:=merge-last,\
+	aQute.libg.sed;-split-package:=merge-last,\
+	aQute.libg.tuple;-split-package:=merge-last,\
+	aQute.bnd.annotation;-split-package:=merge-last,\
+	aQute.bnd.annotation.metatype;-split-package:=merge-last,\
+	aQute.bnd.build;-split-package:=merge-last,\
+	aQute.bnd.component;-split-package:=merge-last,\
+	aQute.bnd.deployer.http;-split-package:=merge-last,\
+	aQute.bnd.deployer.repository.api;-split-package:=merge-last,\
+	aQute.bnd.deployer.repository.providers;-split-package:=merge-last,\
+	aQute.bnd.filerepo;-split-package:=merge-last,\
+	aQute.bnd.header;-split-package:=merge-last,\
+	aQute.bnd.make;-split-package:=merge-last,\
+	aQute.bnd.make.component;-split-package:=merge-last,\
+	aQute.bnd.make.metatype;-split-package:=merge-last,\
+	aQute.bnd.maven;-split-package:=merge-last,\
+	aQute.bnd.service.url;-split-package:=merge-last,\
+	aQute.bnd.version;-split-package:=merge-last,\
+	aQute.lib.base64;-split-package:=merge-last,\
+	aQute.lib.collections;-split-package:=merge-last,\
+	aQute.lib.converter;-split-package:=merge-last,\
+	aQute.lib.filter;-split-package:=merge-last,\
+	aQute.lib.hex;-split-package:=merge-last,\
+	aQute.lib.io;-split-package:=merge-last,\
+	aQute.libg.command;-split-package:=merge-last,\
+	aQute.libg.cryptography;-split-package:=merge-last,\
+	aQute.libg.filters;-split-package:=merge-last,\
+	aQute.libg.generics;-split-package:=merge-last,\
+	aQute.libg.glob;-split-package:=merge-last,\
+	aQute.libg.gzip;-split-package:=merge-last,\
+	aQute.libg.qtokens;-split-package:=merge-last,\
+	aQute.libg.reporter;-split-package:=merge-last,\
+	aQute.service.reporter;-split-package:=merge-last,\
+	aQute.bnd.deployer.repository;-split-package:=merge-last,\
+	aQute.bnd.differ;-split-package:=merge-last,\
+	aQute.bnd.osgi;-split-package:=merge-last,\
+	aQute.bnd.osgi.resource;-split-package:=merge-last,\
+	aQute.bnd.service;-split-package:=merge-last,\
+	aQute.bnd.service.diff;-split-package:=merge-last,\
+	org.osgi.resource.*;-split-package:=merge-last,\
+	org.osgi.service.bindex.*;-split-package:=merge-last,\
+	org.osgi.service.component.*;-split-package:=merge-last,\
+	org.osgi.service.coordinator.*;-split-package:=merge-last,\
+	org.osgi.service.indexer.*;-split-package:=merge-last,\
+	org.osgi.service.obr.*;-split-package:=merge-last,\
+	org.osgi.service.repository.*;-split-package:=merge-last,\
+	org.osgi.impl.bundle.bindex.*;-split-package:=merge-last,\
+	org.osgi.impl.bundle.obr.*;-split-package:=merge-last,\
+	org.xmlpull.v1;-split-package:=first,\
+	org.kxml2.io;-split-package:=first
+	
\ No newline at end of file

Added: ace/trunk/org.apache.ace.gogo/build.xml
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.gogo/build.xml?rev=1504472&view=auto
==============================================================================
--- ace/trunk/org.apache.ace.gogo/build.xml (added)
+++ ace/trunk/org.apache.ace.gogo/build.xml Thu Jul 18 13:54:46 2013
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="project" default="build">
+
+	<!-- -->
+
+	<import file="../cnf/build.xml" />
+</project>

Added: ace/trunk/org.apache.ace.gogo/src/.gitignore
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.gogo/src/.gitignore?rev=1504472&view=auto
==============================================================================
    (empty)

Added: ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/Activator.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/Activator.java?rev=1504472&view=auto
==============================================================================
--- ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/Activator.java (added)
+++ ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/Activator.java Thu Jul 18 13:54:46 2013
@@ -0,0 +1,77 @@
+/*
+ * 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.ace.gogo;
+
+import java.util.Properties;
+
+import org.apache.ace.gogo.math.MathCommands;
+import org.apache.ace.gogo.misc.MiscCommands;
+import org.apache.ace.gogo.repo.RepoCommands;
+import org.apache.felix.dm.DependencyActivatorBase;
+import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.service.command.CommandProcessor;
+import org.osgi.framework.BundleContext;
+
+public class Activator extends DependencyActivatorBase {
+
+    @Override
+    public void init(BundleContext context, DependencyManager manager) throws Exception {
+
+        Properties repoProps = new Properties();
+        repoProps.put(CommandProcessor.COMMAND_SCOPE, RepoCommands.SCOPE);
+        repoProps.put(CommandProcessor.COMMAND_FUNCTION, RepoCommands.FUNCTIONS);
+        manager.add(createComponent()
+            .setInterface(Object.class.getName(), repoProps)
+            .setImplementation(RepoCommands.class)
+            );
+
+        Properties mathProps = new Properties();
+        mathProps.put(CommandProcessor.COMMAND_SCOPE, MathCommands.SCOPE);
+        mathProps.put(CommandProcessor.COMMAND_FUNCTION, MathCommands.FUNCTIONS);
+        manager.add(createComponent()
+            .setInterface(Object.class.getName(), mathProps)
+            .setImplementation(MathCommands.class)
+            );
+
+        Properties miscProps = new Properties();
+        miscProps.put(CommandProcessor.COMMAND_SCOPE, MiscCommands.SCOPE);
+        miscProps.put(CommandProcessor.COMMAND_FUNCTION, MiscCommands.FUNCTIONS);
+        manager.add(createComponent()
+            .setInterface(Object.class.getName(), miscProps)
+            .setImplementation(MiscCommands.class)
+            );
+
+        if (System.getProperty("ace.gogo.script") != null) {
+            String script = System.getProperty("ace.gogo.script");
+            long delay = 300;
+            if (System.getProperty("ace.gogo.script.delay") != null) {
+                delay = Long.parseLong(System.getProperty("ace.gogo.script.delay"));
+            }
+            manager.add(createComponent()
+                .setImplementation(new ScriptExecutor(script, delay))
+                .add(createServiceDependency()
+                    .setService(CommandProcessor.class)
+                    .setRequired(true)));
+        }
+    }
+
+    @Override
+    public void destroy(BundleContext arg0, DependencyManager arg1) throws Exception {
+    }
+}

Added: ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/ScriptExecutor.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/ScriptExecutor.java?rev=1504472&view=auto
==============================================================================
--- ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/ScriptExecutor.java (added)
+++ ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/ScriptExecutor.java Thu Jul 18 13:54:46 2013
@@ -0,0 +1,94 @@
+/*
+ * 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.ace.gogo;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.service.command.CommandProcessor;
+import org.apache.felix.service.command.CommandSession;
+
+public class ScriptExecutor {
+
+    private volatile DependencyManager m_dependencyManager;
+    private volatile Component m_component;
+    private volatile CommandProcessor m_processor;
+
+    private final String m_scriptPath;
+    private final long m_delay;
+
+    private Timer m_timer;
+
+    public ScriptExecutor(String scriptPath, long delay) {
+        m_scriptPath = scriptPath;
+        m_delay = delay;
+    }
+
+    public void start() throws Exception {
+        m_timer = new Timer();
+        m_timer.schedule(new ScriptTask(), m_delay);
+    }
+
+    public void complete() {
+        m_timer.cancel();
+        m_dependencyManager.remove(m_component);
+    }
+
+    class ScriptTask extends TimerTask {
+
+        @Override
+        public void run() {
+
+            CommandSession session = null;
+            BufferedReader reader = null;
+            String line;
+
+            try {
+                reader = new BufferedReader(new FileReader(new File(m_scriptPath)));
+                StringBuilder builder = new StringBuilder();
+                while ((line = reader.readLine()) != null)
+                    builder.append(line).append("\n");
+
+                session = m_processor.createSession(System.in, System.out, System.err);
+                session.execute(builder.toString());
+            }
+            catch (Exception e) {
+                e.printStackTrace();
+            }
+            finally {
+                if (session != null)
+                    session.close();
+                if (reader != null)
+                    try {
+                        reader.close();
+                    }
+                    catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                m_timer.cancel();
+            }
+        }
+    }
+}

Added: ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/math/MathCommands.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/math/MathCommands.java?rev=1504472&view=auto
==============================================================================
--- ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/math/MathCommands.java (added)
+++ ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/math/MathCommands.java Thu Jul 18 13:54:46 2013
@@ -0,0 +1,42 @@
+/*
+ * 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.ace.gogo.math;
+
+import org.apache.felix.service.command.Descriptor;
+
+public class MathCommands {
+
+    public final static String SCOPE = "math";
+    public final static String[] FUNCTIONS = new String[] { "lt", "gt", "eq" };
+
+    @Descriptor("test if first number is greater then second number")
+    public static boolean gt(long first, long second) {
+        return first > second;
+    }
+
+    @Descriptor("test if first number is greater then second number")
+    public static boolean lt(long first, long second) {
+        return first < second;
+    }
+
+    @Descriptor("test if first number is equal to second number")
+    public static boolean eq(long first, long second) {
+        return first == second;
+    }
+}

Added: ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/misc/MiscCommands.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/misc/MiscCommands.java?rev=1504472&view=auto
==============================================================================
--- ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/misc/MiscCommands.java (added)
+++ ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/misc/MiscCommands.java Thu Jul 18 13:54:46 2013
@@ -0,0 +1,51 @@
+/*
+ * 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.ace.gogo.misc;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+import org.apache.felix.service.command.Descriptor;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+
+public class MiscCommands {
+
+    public final static String SCOPE = "misc";
+    public final static String[] FUNCTIONS = new String[] { "shutdown" };
+
+    private volatile BundleContext m_context;
+
+    @Descriptor("schedules a framework shutdown")
+    public void shutdown(long delay) {
+        Timer timer = new Timer();
+        timer.schedule(new TimerTask() {
+
+            @Override
+            public void run() {
+                try {
+                    m_context.getBundle(0).stop();
+                }
+                catch (BundleException e) {
+                    e.printStackTrace();
+                }
+            }
+        }, delay);
+    }
+}

Added: ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/AceObrRepository.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/AceObrRepository.java?rev=1504472&view=auto
==============================================================================
--- ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/AceObrRepository.java (added)
+++ ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/AceObrRepository.java Thu Jul 18 13:54:46 2013
@@ -0,0 +1,150 @@
+/*
+ * 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.ace.gogo.repo;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Map;
+
+import aQute.bnd.deployer.repository.FixedIndexedRepo;
+
+/**
+ * BND repository implementation that supports write capabilities to an Apache ACE OBR.
+ * 
+ */
+public class AceObrRepository extends FixedIndexedRepo {
+
+    private URL m_endpoint;
+    private boolean m_verbose;
+
+    @Override
+    public synchronized void setProperties(Map<String, String> map) {
+        super.setProperties(map);
+
+        String location = getLocation();
+        try {
+            m_endpoint = new URL(location.substring(0, location.lastIndexOf("/") + 1));
+        }
+        catch (MalformedURLException e) {
+            throw new IllegalArgumentException("Failed to determin location endpoint", e);
+        }
+        m_verbose = map.get("verbose") == null ? false : Boolean.parseBoolean(map.get("verbose"));
+    }
+
+    @Override
+    public boolean canWrite() {
+        return true;
+    }
+
+    @Override
+    public synchronized PutResult put(InputStream stream, PutOptions options) throws Exception {
+
+        if (options == null)
+            options = DEFAULTOPTIONS;
+
+        if (options.type == null)
+            options.type = PutOptions.BUNDLE;
+
+        if (stream == null)
+            throw new IllegalArgumentException("No stream and/or options specified");
+
+        PutResult result = new PutResult();
+        result.artifact = upload(stream, "", options.type);
+
+        reset();
+        return result;
+    }
+
+    public URL getEndpoint() {
+        return m_endpoint;
+    }
+
+    public URI upload(InputStream stream, String filename, String mimetype) throws Exception {
+
+        OutputStream output = null;
+        String location = null;
+        try {
+
+            URL url = new URL(m_endpoint, "?filename=" + filename);
+            URLConnection connection = url.openConnection();
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+            connection.setUseCaches(false);
+
+            if (mimetype != null) {
+                connection.setRequestProperty("Content-Type", mimetype);
+            }
+            else {
+                // We need a mimetype or Jetty will throw a 500 Form too large
+
+                connection.setRequestProperty("Content-Type", "application/octet-stream");
+            }
+
+            if (connection instanceof HttpURLConnection) {
+                ((HttpURLConnection) connection).setChunkedStreamingMode(8192);
+            }
+
+            int size = 0;
+            output = connection.getOutputStream();
+            byte[] buffer = new byte[4 * 1024];
+            for (int count = stream.read(buffer); count != -1; count = stream.read(buffer)) {
+                output.write(buffer, 0, count);
+                size += count;
+                if (m_verbose)
+                    System.out.println("Uploaded bytes... " + size);
+            }
+            output.close();
+
+            if (connection instanceof HttpURLConnection) {
+                int responseCode = ((HttpURLConnection) connection).getResponseCode();
+                String responseMessage = ((HttpURLConnection) connection).getResponseMessage();
+                switch (responseCode) {
+                    case HttpURLConnection.HTTP_CREATED:
+                        location = connection.getHeaderField("Location");
+                        break;
+                    case HttpURLConnection.HTTP_CONFLICT:
+                        throw new IOException("Resource already exists: " + responseMessage);
+                    case HttpURLConnection.HTTP_INTERNAL_ERROR:
+                        throw new IOException("Internal server error: " + responseMessage);
+                    default:
+                        throw new IOException("Unexpected server response: " + responseMessage);
+                }
+            }
+        }
+        catch (IOException e) {
+            throw new IOException("Error importing resource: " + e.getMessage(), e);
+        }
+        finally {
+            if (output != null) {
+                try {
+                    output.close();
+                }
+                catch (Exception ex) {
+                }
+            }
+        }
+        return new URI(location);
+    }
+}

Added: ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/CommandRepo.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/CommandRepo.java?rev=1504472&view=auto
==============================================================================
--- ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/CommandRepo.java (added)
+++ ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/CommandRepo.java Thu Jul 18 13:54:46 2013
@@ -0,0 +1,57 @@
+/*
+ * 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.ace.gogo.repo;
+
+import static org.apache.ace.gogo.repo.RepositoryUtil.findResources;
+import static org.apache.ace.gogo.repo.RepositoryUtil.getRequirement;
+
+import java.util.List;
+
+import org.osgi.resource.Requirement;
+import org.osgi.resource.Resource;
+
+import aQute.bnd.deployer.repository.FixedIndexedRepo;
+
+public class CommandRepo {
+
+    private final AceObrRepository m_repository;
+
+    public CommandRepo(AceObrRepository repository) {
+        m_repository = repository;
+    }
+
+    public FixedIndexedRepo repo() {
+        return m_repository;
+    }
+
+    public void list() throws Exception {
+        for (Resource resource : findResources(m_repository)) {
+            System.out.println(resource.toString());
+        }
+    }
+
+    public List<CommandResource> find() throws Exception {
+        return find(null);
+    }
+
+    public List<CommandResource> find(String filter) throws Exception {
+        Requirement requirement = getRequirement(filter);
+        return CommandResource.wrap(this, findResources(m_repository, requirement));
+    }
+}

Added: ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/CommandResource.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/CommandResource.java?rev=1504472&view=auto
==============================================================================
--- ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/CommandResource.java (added)
+++ ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/CommandResource.java Thu Jul 18 13:54:46 2013
@@ -0,0 +1,81 @@
+/*
+ * 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.ace.gogo.repo;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.osgi.resource.Capability;
+import org.osgi.resource.Requirement;
+import org.osgi.resource.Resource;
+
+public class CommandResource {
+
+    public static List<CommandResource> wrap(CommandRepo repo, List<Resource> resources) {
+        List<CommandResource> commandResources = new LinkedList<CommandResource>();
+        for (Resource resource : resources) {
+            commandResources.add(new CommandResource(repo, resource));
+        }
+        return commandResources;
+    }
+
+    public static CommandResource wrap(CommandRepo repo, Resource resource) {
+        return new CommandResource(repo, resource);
+    }
+
+    private final CommandRepo m_repo;
+    private final Resource m_resource;
+
+    public CommandResource(CommandRepo repo, Resource resource) {
+        m_repo = repo;
+        m_resource = resource;
+    }
+
+    public CommandRepo getRepo() {
+        return m_repo;
+    }
+
+    public Resource getResource() {
+        return m_resource;
+    }
+
+    public String getIdentity() {
+        return RepositoryUtil.getIdentity(m_resource);
+    }
+
+    public String getVersion() {
+        return RepositoryUtil.getVersion(m_resource).toString();
+    }
+
+    public String getUrl() {
+        return RepositoryUtil.getUrl(m_resource);
+    }
+
+    public String getMimetype() {
+        return RepositoryUtil.getMimetype(m_resource);
+    }
+
+    public List<Capability> getCapabilities(String namespace) {
+        return m_resource.getCapabilities(namespace);
+    }
+
+    public List<Requirement> getRequirements(String namespace) {
+        return m_resource.getRequirements(namespace);
+    }
+}

Added: ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/ContinuousDeployer.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/ContinuousDeployer.java?rev=1504472&view=auto
==============================================================================
--- ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/ContinuousDeployer.java (added)
+++ ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/ContinuousDeployer.java Thu Jul 18 13:54:46 2013
@@ -0,0 +1,207 @@
+package org.apache.ace.gogo.repo;
+
+import static org.apache.ace.gogo.repo.DeployerUtil.filesDiffer;
+import static org.apache.ace.gogo.repo.DeployerUtil.getBundleWithNewVersion;
+import static org.apache.ace.gogo.repo.DeployerUtil.getNextSnapshotVersion;
+import static org.apache.ace.gogo.repo.DeployerUtil.isSameBaseVersion;
+import static org.apache.ace.gogo.repo.DeployerUtil.isSnapshotVersion;
+import static org.apache.ace.gogo.repo.DeployerUtil.jarsDiffer;
+import static org.apache.ace.gogo.repo.RepositoryUtil.copyResources;
+import static org.apache.ace.gogo.repo.RepositoryUtil.findResources;
+import static org.apache.ace.gogo.repo.RepositoryUtil.getFileName;
+import static org.apache.ace.gogo.repo.RepositoryUtil.getIdentity;
+import static org.apache.ace.gogo.repo.RepositoryUtil.getIdentityVersionRequirement;
+import static org.apache.ace.gogo.repo.RepositoryUtil.getMimetype;
+import static org.apache.ace.gogo.repo.RepositoryUtil.getString;
+import static org.apache.ace.gogo.repo.RepositoryUtil.getType;
+import static org.apache.ace.gogo.repo.RepositoryUtil.getVersion;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.List;
+
+import org.osgi.framework.Version;
+import org.osgi.resource.Resource;
+
+import aQute.bnd.deployer.repository.FixedIndexedRepo;
+import aQute.bnd.service.Strategy;
+
+public class ContinuousDeployer {
+
+    FixedIndexedRepo m_deploymentRepo;
+    FixedIndexedRepo m_developmentRepo;
+    FixedIndexedRepo m_releaseRepo;
+
+    public ContinuousDeployer(FixedIndexedRepo deploymentRepo, FixedIndexedRepo developmentRepo, FixedIndexedRepo releaseRepo) {
+        m_deploymentRepo = deploymentRepo;
+        m_developmentRepo = developmentRepo;
+        m_releaseRepo = releaseRepo;
+    }
+
+    /**
+     * Deploys all resources from the development repository into the deployment repository.
+     * 
+     * @return
+     * @throws Exception
+     */
+    public List<Resource> deployResources() throws Exception {
+        List<Resource> resources = findResources(m_developmentRepo, "*", "*");
+        for (Resource resource : resources) {
+            // FIXME this is the source resource
+            deployResource(resource);
+        }
+        return resources;
+    }
+
+    /**
+     * Deploys a resource to the deployment repository.
+     * 
+     * @param resource
+     *            The resource
+     * @throws Exception
+     *             On failure
+     */
+    private void deployResource(Resource resource) throws Exception {
+        List<Resource> releaseResources = findResources(m_releaseRepo, getIdentity(resource), getVersion(resource).toString());
+        boolean isReleased = releaseResources.size() > 0;
+        if (isReleased) {
+            deployReleasedResource(resource);
+        }
+        else {
+            deploySnapshotResource(resource);
+        }
+    }
+
+    /**
+     * Deploys a released resource from the release repository to the deployment repository if it has not been deployed
+     * yet.
+     * 
+     * @param resource
+     *            The resource
+     * @throws Exception
+     *             On failure
+     */
+    private void deployReleasedResource(Resource resource) throws Exception {
+        List<Resource> deployedResources = findResources(m_deploymentRepo, getIdentity(resource), getVersion(resource).toString());
+        boolean isDeployed = deployedResources.size() > 0;
+        if (!isDeployed) {
+            System.out.println("Uploading released resource:  " + getString(resource));
+            copyResources(m_releaseRepo, m_deploymentRepo, getIdentityVersionRequirement(resource));
+        }
+        else {
+            System.out.println("Released resource allready deployed:  " + getString(resource));
+        }
+    }
+
+    /**
+     * Deploys a snapshot resource to the deployment repository if it differs from the highest existing snapshot
+     * resource of the same base version in the deployment repository.
+     * 
+     * @param resource
+     *            The resource
+     * @throws Exception
+     *             On failure
+     */
+    private void deploySnapshotResource(Resource resource) throws Exception {
+
+        Version releasedBaseVersion = getReleasedBaseVersion(resource);
+        Resource snapshotResource = getHighestSnapshotResource(resource, releasedBaseVersion);
+        if (snapshotResource == null) {
+            System.out.println("Uploading initial snapshot:  " + getString(resource) + " -> " + getNextSnapshotVersion(releasedBaseVersion));
+            deploySnapshotResource(resource, getNextSnapshotVersion(releasedBaseVersion));
+        }
+        else {
+            System.out.println("Found existing snapshot:  " + getString(snapshotResource));
+
+            // FIXME workaround for BND#374
+            if (getIdentity(resource).equals("com.google.guava")) {
+                System.out.println("Skipping snapshot diff on Google Guava to work around https://github.com/bndtools/bnd/issues/374");
+                return;
+            }
+
+            File developmentResource = m_developmentRepo.get(getIdentity(resource), getVersion(resource).toString(), Strategy.EXACT, null);
+            File deployedResource = m_deploymentRepo.get(getIdentity(snapshotResource), getVersion(snapshotResource).toString(), Strategy.EXACT, null);
+
+            boolean snapshotModified = false;
+
+            if (getType(resource).equals("osgi.bundle")) {
+
+                // Get a copy of the dep resource with the same version as the dev resource so we can diff diff.
+                File comparableDeployedResource = getBundleWithNewVersion(deployedResource, getVersion(resource).toString());
+
+                // This may seem strange but the value in the dev resource manifest may be "0" which will not match
+                // "0.0.0" during diff.
+                File comparableDevelopmentResource = getBundleWithNewVersion(developmentResource, getVersion(resource).toString());
+                snapshotModified = jarsDiffer(comparableDeployedResource, comparableDevelopmentResource);
+            }
+            else {
+                snapshotModified = filesDiffer(developmentResource, deployedResource);
+            }
+
+            if (snapshotModified) {
+                System.out.println("Uploading new snapshot:  " + getString(resource) + " -> " + getNextSnapshotVersion(getVersion(snapshotResource)));
+                deploySnapshotResource(resource, getNextSnapshotVersion(getVersion(snapshotResource)));
+            }
+            else {
+                System.out.println("Ignoring new snapshot:  " + getString(resource));
+            }
+        }
+    }
+
+    private void deploySnapshotResource(Resource resource, Version snapshotVersion) throws Exception {
+
+        File file = m_developmentRepo.get(getIdentity(resource), getVersion(resource).toString(), Strategy.EXACT, null);
+        if (getType(resource).equals("osgi.bundle")) {
+            file = getBundleWithNewVersion(file, snapshotVersion.toString());
+        }
+
+        InputStream input = null;
+        try {
+            input = new FileInputStream(file);
+            if (m_deploymentRepo instanceof AceObrRepository) {
+                // ACE OBR can handle non-bundle resources if we pass a correct filename
+                AceObrRepository aceToRepo = (AceObrRepository) m_deploymentRepo;
+                aceToRepo.upload(input, getFileName(resource, snapshotVersion), getMimetype(resource));
+            }
+            else {
+                m_deploymentRepo.put(input, null);
+            }
+
+        }
+        finally {
+            if (input != null)
+                input.close();
+        }
+    }
+
+    private Resource getHighestSnapshotResource(Resource resource, Version base) throws Exception {
+
+        List<Resource> resources = findResources(m_deploymentRepo, getIdentity(resource));
+        Resource matchedResource = null;
+        for (Resource candidateResource : resources) {
+            Version candidateVersion = getVersion(candidateResource);
+            if (isSnapshotVersion(candidateVersion) && isSameBaseVersion(getVersion(candidateResource), base)
+                && (matchedResource == null || getVersion(matchedResource).compareTo(getVersion(candidateResource)) < 0)) {
+                matchedResource = candidateResource;
+            }
+        }
+
+        return matchedResource;
+    }
+
+    private Version getReleasedBaseVersion(Resource resource) throws Exception {
+        List<Resource> resources = findResources(m_releaseRepo, getIdentity(resource));
+        Version resourceVersion = getVersion(resource);
+        Version baseVersion = Version.emptyVersion;
+        for (Resource candidate : resources) {
+            Version candidateVersion = getVersion(candidate);
+            if (candidateVersion.compareTo(resourceVersion) < 0) {
+                if (candidateVersion.compareTo(baseVersion) > 0) {
+                    baseVersion = candidateVersion;
+                }
+            }
+        }
+        return baseVersion;
+    }
+}

Added: ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/DeployerUtil.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/DeployerUtil.java?rev=1504472&view=auto
==============================================================================
--- ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/DeployerUtil.java (added)
+++ ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/DeployerUtil.java Thu Jul 18 13:54:46 2013
@@ -0,0 +1,253 @@
+/*
+ * 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.ace.gogo.repo;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.StringReader;
+import java.nio.ByteBuffer;
+import java.security.DigestInputStream;
+import java.security.MessageDigest;
+import java.util.Arrays;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
+
+import org.osgi.framework.Version;
+
+import aQute.bnd.differ.DiffPluginImpl;
+import aQute.bnd.osgi.Jar;
+import aQute.bnd.service.diff.Delta;
+import aQute.bnd.service.diff.Diff;
+import aQute.bnd.service.diff.Differ;
+import aQute.bnd.service.diff.Tree;
+
+public final class DeployerUtil {
+
+    public static final String QUALIFIER_PREFIX = "CDS";
+
+    private static final Pattern QUALIFIER_PATTERN = Pattern.compile(QUALIFIER_PREFIX + "([\\d]{3})$|(.*)(_" + QUALIFIER_PREFIX + "([\\d]{3})?$)");
+
+    /**
+     * Given ad version, creates the 'next' snapshot version. If the version has no snapshot qualifier a new one will be
+     * added. If it does, it will be incremented.
+     * 
+     * @param version
+     *            The version
+     * @return The next snapshot Version
+     * @throws Exception
+     *             On Failure
+     */
+    public static Version getNextSnapshotVersion(Version version) throws Exception {
+
+        if (version.getQualifier() == null || version.getQualifier().equals("")) {
+            return new Version(version.getMajor(), version.getMinor(), version.getMicro(), getSnapshotQualifier("", 0));
+        }
+        Matcher qualifierMatcher = QUALIFIER_PATTERN.matcher(version.getQualifier());
+        if (!qualifierMatcher.matches()) {
+            return new Version(version.getMajor(), version.getMinor(), version.getMicro(), getSnapshotQualifier(version.getQualifier(), 0));
+        }
+
+        String qualifierMatch = qualifierMatcher.group(1);
+        if (qualifierMatch != null) {
+            int sequence = Integer.parseInt(qualifierMatch);
+            return new Version(version.getMajor(), version.getMinor(), version.getMicro(), getSnapshotQualifier("", ++sequence));
+        }
+
+        String qualifierPrefix = qualifierMatcher.group(2);
+        qualifierMatch = qualifierMatcher.group(4);
+        int sequence = Integer.parseInt(qualifierMatch);
+        return new Version(version.getMajor(), version.getMinor(), version.getMicro(), getSnapshotQualifier(qualifierPrefix, ++sequence));
+    }
+
+    /**
+     * Check if there is a diff between two jar files.
+     * 
+     * @param first
+     *            The first Jar
+     * @param second
+     *            The second Jar
+     * @return <code>true</code> if there is a difference, otherwise <code>false</code>
+     * @throws Exception
+     *             On failure
+     */
+    public static boolean jarsDiffer(File first, File second) throws Exception {
+        Differ di = new DiffPluginImpl();
+        Tree n = di.tree(new Jar(second));
+        Tree o = di.tree(new Jar(first));
+        Diff diff = n.diff(o);
+        for (Diff child : diff.getChildren()) {
+            for (Diff childc : child.getChildren()) {
+                if (childc.getDelta() == Delta.UNCHANGED || childc.getDelta() == Delta.IGNORED) {
+                    continue;
+                }
+                System.out.println(childc);
+//                if(childc.getChildren() != null)
+//                    for(Diff qq : childc.getChildren()){
+//                        System.out.println(" " + qq);
+//                    }
+                
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Check if there is a diff between two arbitrary files.
+     * 
+     * @param first
+     *            The first file
+     * @param second
+     *            The second file
+     * @return <code>true</code> if there is a difference, otherwise <code>false</code>
+     * @throws Exception
+     *             On failure
+     */
+    public static boolean filesDiffer(File first, File second) throws Exception {
+
+        if (first.length() != second.length()) {
+            return true;
+        }
+
+        DigestInputStream stream = null;
+        byte[] firstHash = null;
+        byte[] secondHash = null;
+
+        try {
+            stream = new DigestInputStream(new FileInputStream(first), MessageDigest.getInstance("MD5"));
+            while (stream.read() != -1) {
+            }
+            firstHash = stream.getMessageDigest().digest();
+        }
+        finally {
+            stream.close();
+        }
+
+        try {
+            stream = new DigestInputStream(new FileInputStream(second), MessageDigest.getInstance("MD5"));
+            while (stream.read() != -1) {
+            }
+            secondHash = stream.getMessageDigest().digest();
+        }
+        finally {
+            stream.close();
+        }
+        return !Arrays.equals(firstHash, secondHash);
+    }
+
+    /**
+     * Clones a bundle file while replacing the Bundle-Version in the manifest with the specified value.
+     * 
+     * @param sourceJar
+     *            The existing jar
+     * @param version
+     *            The new version
+     * @return The new Jar
+     * @throws IOException
+     *             On failure
+     */
+    public static File getBundleWithNewVersion(File sourceJar, String version) throws IOException {
+
+        File targetFile = File.createTempFile("bundle", ".jar");
+        byte[] buf = new byte[1024];
+        ZipInputStream zin = new ZipInputStream(new FileInputStream(sourceJar));
+        ZipOutputStream out = new ZipOutputStream(new FileOutputStream(targetFile));
+        ZipEntry entry = zin.getNextEntry();
+        while (entry != null) {
+            String name = entry.getName();
+            out.putNextEntry(new ZipEntry(name));
+
+            if (name.equals("META-INF/MANIFEST.MF")) {
+                // FIXME quick abort
+                ByteBuffer bb = ByteBuffer.allocate(100 * 1024);
+                int len;
+                while ((len = zin.read(buf)) > 0) {
+                    bb.put(buf, 0, len);
+                }
+
+                BufferedReader r = new BufferedReader(new StringReader(new String(bb.array(), 0, bb.position())));
+                String line;
+                while ((line = r.readLine()) != null) {
+                    if (line.startsWith("Bundle-Version:")) {
+                        out.write(("Bundle-Version: " + version + "\r\n").getBytes());
+                    }
+                    else {
+                        out.write((line + "\r\n").getBytes());
+                    }
+                }
+            }
+            else {
+                int len;
+                while ((len = zin.read(buf)) > 0) {
+                    out.write(buf, 0, len);
+                }
+            }
+            entry = zin.getNextEntry();
+        }
+        zin.close();
+        out.close();
+        return targetFile;
+    }
+
+    public static boolean isSameBaseVersion(Version left, Version right) {
+        return left.getMajor() == right.getMajor() && left.getMinor() == right.getMinor() && left.getMicro() == right.getMicro();
+    }
+
+    public static boolean isSnapshotVersion(Version version) {
+        if (version.getQualifier() == null || version.getQualifier().equals("")) {
+            return false;
+        }
+        Matcher qualifierMatcher = QUALIFIER_PATTERN.matcher(version.getQualifier());
+        return qualifierMatcher.matches();
+    }
+
+    private static String getSnapshotQualifier(String prefix, int i) {
+        if (!isEmpty(prefix)) {
+            prefix = prefix + "_";
+        }
+        else {
+            prefix = "";
+        }
+        if (i < 10) {
+            return prefix + QUALIFIER_PREFIX + "00" + i;
+        }
+        else if (i < 100) {
+            return prefix + QUALIFIER_PREFIX + "0" + i;
+        }
+        else if (i < 1000) {
+            return prefix + QUALIFIER_PREFIX + i;
+        }
+        else {
+            throw new IllegalArgumentException("Can not qualifiers above 999");
+        }
+    }
+
+    private static boolean isEmpty(String s) {
+        return s == null || s.equals("");
+    }
+
+    private DeployerUtil() {
+    }
+}

Added: ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/RepoCommands.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/RepoCommands.java?rev=1504472&view=auto
==============================================================================
--- ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/RepoCommands.java (added)
+++ ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/RepoCommands.java Thu Jul 18 13:54:46 2013
@@ -0,0 +1,146 @@
+/*
+ * 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.ace.gogo.repo;
+
+import static org.apache.ace.gogo.repo.RepositoryUtil.copyResources;
+import static org.apache.ace.gogo.repo.RepositoryUtil.createRepository;
+import static org.apache.ace.gogo.repo.RepositoryUtil.deleteResource;
+import static org.apache.ace.gogo.repo.RepositoryUtil.findResources;
+import static org.apache.ace.gogo.repo.RepositoryUtil.getRequirement;
+import static org.apache.ace.gogo.repo.RepositoryUtil.getUrl;
+import static org.apache.ace.gogo.repo.RepositoryUtil.indexDirectory;
+import static org.apache.ace.gogo.repo.RepositoryUtil.uploadResource;
+
+import java.net.URL;
+import java.util.List;
+
+import org.apache.felix.service.command.Descriptor;
+import org.osgi.resource.Requirement;
+import org.osgi.resource.Resource;
+
+import aQute.bnd.deployer.repository.FixedIndexedRepo;
+
+public class RepoCommands {
+
+    public final static String SCOPE = "repo";
+    public final static String[] FUNCTIONS = new String[] { "repo", "index", "ls", "cp", "rm", "cd", "d" };
+
+    @Descriptor("Defines a repository")
+    public static CommandRepo repo(@Descriptor("the type e { R5, OBR }") String type, @Descriptor("url of the repository index") String location) throws Exception {
+        return new CommandRepo(createRepository(type, location));
+    }
+
+    @Descriptor("Indexes a directory")
+    public static URL index(@Descriptor("path to the directory") String directory) throws Exception {
+        return indexDirectory(directory);
+    }
+
+    @Descriptor("lists resources in a repository")
+    public static void ls(CommandRepo fromRepo) throws Exception {
+        ls(fromRepo, null);
+    }
+
+    @Descriptor("lists resources in a repository")
+    public static void ls(CommandRepo repo, String filter) throws Exception {
+
+        FixedIndexedRepo sourceRepo = repo.repo();
+        sourceRepo.reset();
+
+        Requirement requirement = getRequirement(filter);
+        List<Resource> resources = findResources(sourceRepo, requirement);
+
+        for (Resource resource : resources) {
+            String location = getUrl(resources.get(0));
+            System.out.println(resource + " => " + location);
+        }
+    }
+
+    @Descriptor("copy resources from one repository to another")
+    public static void cp(CommandRepo fromRepo, CommandRepo toRepo) throws Exception {
+        cp(fromRepo, toRepo, null);
+    }
+
+    @Descriptor("copy resources from one repository to another")
+    public static void cp(CommandRepo fromRepo, CommandRepo toRepo, String filter) throws Exception {
+
+        FixedIndexedRepo sourceRepo = fromRepo.repo();
+        FixedIndexedRepo targetRepo = toRepo.repo();
+        sourceRepo.reset();
+        targetRepo.reset();
+
+        Requirement requirement = getRequirement(filter);
+        List<Resource> resources = findResources(sourceRepo, requirement);
+        copyResources(sourceRepo, targetRepo, resources);
+    }
+
+    @Descriptor("remove resources from a repository")
+    public static void rm(CommandRepo fromRepo) throws Exception {
+        rm(fromRepo, null);
+    }
+
+    @Descriptor("remove resources from a repository")
+    public static void rm(CommandRepo fromRepo, String filter) throws Exception {
+
+        FixedIndexedRepo repo = fromRepo.repo();
+        repo.reset();
+
+        Requirement requirement = getRequirement(filter);
+        List<Resource> resources = findResources(repo, requirement);
+
+        for (Resource resource : resources) {
+            String location = getUrl(resources.get(0));
+            System.out.println("rm " + resource + " => " + location);
+            deleteResource(resource);
+        }
+    }
+
+    @Descriptor("execute a continuous deployment cycle")
+    public static List<CommandResource> cd(CommandRepo releaseRepo, CommandRepo sourceRepo, CommandRepo targetRepo) throws Exception {
+
+        FixedIndexedRepo relRepo = releaseRepo.repo();
+        FixedIndexedRepo srcRepo = sourceRepo.repo();
+        FixedIndexedRepo tgtRepo = targetRepo.repo();
+        relRepo.reset();
+        srcRepo.reset();
+        tgtRepo.reset();
+
+        ContinuousDeployer cd = new ContinuousDeployer(tgtRepo, srcRepo, relRepo);
+        try {
+            List<Resource> deployedResources = cd.deployResources();
+            return CommandResource.wrap(targetRepo, deployedResources);
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    @Descriptor("deploy a resource to a repository")
+    public static void d(CommandRepo repo, String url) throws Exception {
+        d(repo, url, null);
+    }
+
+    @Descriptor("deploy a resource to a repository")
+    public static void d(CommandRepo repo, String url, String filename) throws Exception {
+        FixedIndexedRepo toRepo = repo.repo();
+        URL location = new URL(url);
+        uploadResource(toRepo, location, filename);
+        toRepo.reset();
+    }
+}

Added: ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/RepositoryUtil.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/RepositoryUtil.java?rev=1504472&view=auto
==============================================================================
--- ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/RepositoryUtil.java (added)
+++ ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/RepositoryUtil.java Thu Jul 18 13:54:46 2013
@@ -0,0 +1,377 @@
+/*
+ * 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.ace.gogo.repo;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Stack;
+
+import org.osgi.framework.Version;
+import org.osgi.resource.Capability;
+import org.osgi.resource.Requirement;
+import org.osgi.resource.Resource;
+import org.osgi.service.indexer.ResourceIndexer;
+import org.osgi.service.indexer.impl.RepoIndex;
+import org.osgi.service.repository.Repository;
+
+import aQute.bnd.deployer.repository.AbstractIndexedRepo;
+import aQute.bnd.osgi.resource.CapReqBuilder;
+import aQute.bnd.service.Strategy;
+
+public class RepositoryUtil {
+
+    public static AceObrRepository createRepository(String type, String location) throws Exception {
+        Map<String, String> properties = new HashMap<String, String>();
+        properties.put(AceObrRepository.PROP_REPO_TYPE, type);
+        properties.put(AceObrRepository.PROP_LOCATIONS, location);
+        AceObrRepository repository = new AceObrRepository();
+        repository.setProperties(properties);
+        return repository;
+    }
+
+    public static URL indexDirectory(String directory) throws Exception {
+
+        File rootDir = new File(directory);
+        if (!rootDir.exists() || !rootDir.isDirectory()) {
+            throw new IOException("Not a directory: " + directory);
+        }
+
+        File indexFile = new File(rootDir, "index.xml");
+        Set<File> files = new HashSet<File>();
+        Stack<File> dirs = new Stack<File>();
+        dirs.push(rootDir);
+        while (!dirs.isEmpty()) {
+            File dir = dirs.pop();
+            for (File file : dir.listFiles()) {
+                if (file.isDirectory()) {
+                    dirs.push(file);
+                }
+                else {
+                    files.add(file);
+                }
+            }
+        }
+
+        RepoIndex indexer = new RepoIndex();
+        Map<String, String> config = new HashMap<String, String>();
+        config.put(ResourceIndexer.REPOSITORY_NAME, "empty");
+        config.put(ResourceIndexer.PRETTY, "true");
+        config.put(ResourceIndexer.ROOT_URL, rootDir.getAbsoluteFile().toURI().toURL().toString());
+
+        FileOutputStream out = new FileOutputStream(indexFile);
+        try {
+            indexer.index(files, out, config);
+        }
+        finally {
+            out.close();
+        }
+        return indexFile.toURI().toURL();
+    }
+
+    // FIXME ACE only
+    public static boolean deleteResource(Resource resource) throws Exception {
+        HttpURLConnection connection = null;
+        try {
+            URL endpointUrl = new URL(getUrl(resource));
+            connection = (HttpURLConnection) endpointUrl.openConnection();
+            connection.setDoInput(true);
+            connection.setDoOutput(false);
+            connection.setInstanceFollowRedirects(false);
+            connection.setRequestMethod("DELETE");
+            connection.connect();
+            return connection.getResponseCode() == 200;
+        }
+        finally {
+            if (connection != null) {
+                connection.disconnect();
+            }
+        }
+    }
+
+    public static Requirement getRequirement(String filter) throws Exception {
+
+        if (filter == null || filter.equals("")) {
+            return null;
+        }
+
+        String namespace = "osgi.identity";
+        if (filter.indexOf("(") < 0) {
+            throw new Exception("Illegal filter");
+        }
+        if (filter.indexOf(":") > 0 && filter.indexOf(":") < filter.indexOf("(")) {
+            namespace = filter.substring(0, filter.indexOf(":"));
+            filter = filter.substring(filter.indexOf(":") + 1);
+        }
+        Requirement requirement = new CapReqBuilder(namespace)
+            .addDirective("filter", filter)
+            .buildSyntheticRequirement();
+        return requirement;
+    }
+
+    /**
+     * Construct a Resource filename with a specified version in the form that ACE OBR understands.
+     * 
+     * @param resource
+     *            The resource
+     * @param version
+     *            The version
+     * @return The name
+     */
+    public static String getFileName(Resource resource, Version version) {
+        String location = getUrl(resource);
+        String extension = location.substring(location.lastIndexOf(".") + 1);
+        return getIdentity(resource) + "-" + version + "." + extension;
+    }
+
+    /**
+     * Construct a Resource filename in the form that ACE OBR understands.
+     * 
+     * @param resource
+     *            The resource
+     * @return The name
+     */
+    public static String getFileName(Resource resource) {
+        return getFileName(resource, getVersion(resource));
+    }
+
+    public static String getString(Resource resource) {
+        return getIdentity(resource) + "/" + getVersion(resource) + "/" + getType(resource) + " - " + getUrl(resource);
+    }
+
+    public static String getIdentity(Resource resource) {
+        Map<String, Object> attrs = getNamespaceAttributes(resource, "osgi.identity");
+        if (attrs == null)
+            return null;
+        return (String) attrs.get("osgi.identity");
+
+    }
+
+    public static Requirement getIdentityVersionRequirement(Resource resource) {
+        Requirement requirement = new CapReqBuilder("osgi.identity")
+            .addDirective("filter", String.format("(&(osgi.identity=%s)(version=%s)(type=*))", getIdentity(resource), getVersion(resource)))
+            .buildSyntheticRequirement();
+        return requirement;
+    }
+
+    public static List<Resource> copyResources(AbstractIndexedRepo fromRepo, AbstractIndexedRepo toRepo, String bsn) throws Exception {
+        return copyResources(fromRepo, toRepo, bsn, "*");
+    }
+
+    public static List<Resource> copyResources(AbstractIndexedRepo fromRepo, AbstractIndexedRepo toRepo, String bsn, String version) throws Exception {
+        return copyResources(fromRepo, toRepo, bsn, version, "*");
+    }
+
+    public static List<Resource> copyResources(AbstractIndexedRepo fromRepo, AbstractIndexedRepo toRepo, String bsn, String version, String type) throws Exception {
+        Requirement requirement = new CapReqBuilder("osgi.identity")
+            .addDirective("filter", String.format("(&(osgi.identity=%s)(version=%s)(type=%s))", bsn, version, type))
+            .buildSyntheticRequirement();
+        return copyResources(fromRepo, toRepo, requirement);
+    }
+
+    public static List<Resource> copyResources(AbstractIndexedRepo fromRepo, AbstractIndexedRepo toRepo, Requirement requirement) throws Exception {
+        List<Resource> resources = findResources(fromRepo, requirement);
+        for (Resource resource : resources) {
+            File file = fromRepo.get(getIdentity(resource), getVersion(resource).toString(), Strategy.EXACT, null);
+
+            InputStream input = null;
+            try {
+                input = new FileInputStream(file);
+                if (toRepo instanceof AceObrRepository) {
+                    // ACE OBR can handle non bundle resource if we pass a filename
+                    AceObrRepository aceToRepo = (AceObrRepository) toRepo;
+                    aceToRepo.upload(input, getFileName(resource), getMimetype(resource));
+                }
+                else {
+                    toRepo.put(input, null);
+                }
+            }
+            finally {
+                if (input != null)
+                    input.close();
+            }
+        }
+        return resources;
+    }
+
+    public static void uploadResource(AbstractIndexedRepo toRepo, URL location, String filename) throws Exception {
+        InputStream input = null;
+        try {
+            input = location.openStream();
+            if (toRepo instanceof AceObrRepository) {
+                // ACE OBR can handle non bundle resource if we pass a filename
+                AceObrRepository aceToRepo = (AceObrRepository) toRepo;
+                aceToRepo.upload(input, filename, null);
+            }
+            else {
+                toRepo.put(input, null);
+            }
+        }
+        finally {
+            if (input != null)
+                input.close();
+        }
+    }
+
+    public static List<Resource> copyResources(AbstractIndexedRepo fromRepo, AbstractIndexedRepo toRepo, List<Resource> resources) throws Exception {
+        List<Resource> targetResources = new LinkedList<Resource>();
+        for (Resource resource : resources) {
+            Resource targetResource = copyResource(fromRepo, toRepo, resource);
+            targetResources.add(targetResource);
+        }
+        return targetResources;
+    }
+
+    public static Resource copyResource(AbstractIndexedRepo fromRepo, AbstractIndexedRepo toRepo, Resource resource) throws Exception {
+
+        File file = fromRepo.get(getIdentity(resource), getVersion(resource).toString(), Strategy.EXACT, null);
+        InputStream input = null;
+        try {
+            input = new FileInputStream(file);
+            if (toRepo instanceof AceObrRepository) {
+                // ACE OBR can handle non bundle resource if we pass a filename
+                AceObrRepository aceToRepo = (AceObrRepository) toRepo;
+                aceToRepo.upload(input, getFileName(resource), getMimetype(resource));
+            }
+            else {
+                toRepo.put(input, null);
+            }
+
+            List<Resource> resultResources = findResources(toRepo, getIdentity(resource), getVersion(resource).toString());
+            if (resultResources == null || resultResources.size() == 0) {
+                throw new IllegalStateException("Can not find target resource after put: " + resource);
+            }
+            return resultResources.get(0);
+        }
+        finally {
+            if (input != null)
+                input.close();
+        }
+    }
+
+    public static List<Resource> findResources(Repository repository) {
+        return findResources(repository, "*");
+    }
+
+    public static List<Resource> findResources(Repository repository, String bsn) {
+        return findResources(repository, bsn, "*");
+    }
+
+    public static List<Resource> findResources(Repository repository, String bsn, String version) {
+        return findResources(repository, bsn, version, "*");
+    }
+
+    public static List<Resource> findResources(Repository repository, String bsn, String version, String type) {
+        Requirement requirement = new CapReqBuilder("osgi.identity")
+            .addDirective("filter", String.format("(&(osgi.identity=%s)(version=%s)(type=%s))", bsn, version, type))
+            .buildSyntheticRequirement();
+        return findResources(repository, requirement);
+    }
+
+    public static List<Resource> findResources(Repository repository, Requirement requirement) {
+        if (requirement == null) {
+            // FIXME maybe we can just pass null
+            requirement = new CapReqBuilder("osgi.identity")
+                .addDirective("filter", "(&(osgi.identity=*)(version=*)(type=*))")
+                .buildSyntheticRequirement();
+        }
+
+        Map<Requirement, Collection<Capability>> sourceResources = repository.findProviders(Collections.singleton(requirement));
+        if (sourceResources.isEmpty() || sourceResources.get(requirement).isEmpty()) {
+            return Collections.emptyList();
+        }
+        List<Resource> resources = new ArrayList<Resource>();
+        Iterator<Capability> capabilities = sourceResources.get(requirement).iterator();
+        while (capabilities.hasNext()) {
+            Capability capability = capabilities.next();
+            resources.add(capability.getResource());
+        }
+        return resources;
+    }
+
+    public static Version getVersion(Resource resource) {
+        Map<String, Object> attrs = getNamespaceAttributes(resource, "osgi.identity");
+        if (attrs == null)
+            return Version.emptyVersion;
+        Version version = (Version) attrs.get("version");
+        return version == null ? Version.emptyVersion : version;
+    }
+
+    public static List<Version> getVersions(List<Resource> resources) {
+        List<Version> versions = new ArrayList<Version>();
+        for (Resource resource : resources) {
+            versions.add(getVersion(resource));
+        }
+        return versions;
+    }
+
+    public static String getType(Resource resource) {
+        Map<String, Object> attrs = getNamespaceAttributes(resource, "osgi.identity");
+        if (attrs == null)
+            return null;
+        return (String) attrs.get("type");
+    }
+
+    public static String getUrl(Resource resource) {
+        Map<String, Object> attrs = getNamespaceAttributes(resource, "osgi.content");
+        if (attrs == null)
+            return null;
+        URI url = (URI) attrs.get("url");
+        return url == null ? null : url.toString();
+    }
+
+    public static String getMimetype(Resource resource) {
+        Map<String, Object> attrs = getNamespaceAttributes(resource, "osgi.content");
+        if (attrs == null)
+            return null;
+        return (String) attrs.get("mime");
+    }
+
+    public static String getSHA(Resource resource) {
+        Map<String, Object> attrs = getNamespaceAttributes(resource, "osgi.content");
+        if (attrs == null)
+            return null;
+        return (String) attrs.get("osgi.content");
+    }
+
+    private static Map<String, Object> getNamespaceAttributes(Resource resource, String namespace) {
+        List<Capability> caps = resource.getCapabilities(namespace);
+        if (caps.isEmpty())
+            return null;
+        Map<String, Object> attrs = caps.get(0).getAttributes();
+        if (attrs == null)
+            return null;
+        return attrs;
+    }
+}

Added: ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/packageinfo
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/packageinfo?rev=1504472&view=auto
==============================================================================
--- ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/packageinfo (added)
+++ ace/trunk/org.apache.ace.gogo/src/org/apache/ace/gogo/repo/packageinfo Thu Jul 18 13:54:46 2013
@@ -0,0 +1 @@
+version 1.0
\ No newline at end of file

Added: ace/trunk/org.apache.ace.gogo/test/.gitignore
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.gogo/test/.gitignore?rev=1504472&view=auto
==============================================================================
    (empty)

Modified: ace/trunk/run-client/client.bndrun
URL: http://svn.apache.org/viewvc/ace/trunk/run-client/client.bndrun?rev=1504472&r1=1504471&r2=1504472&view=diff
==============================================================================
--- ace/trunk/run-client/client.bndrun (original)
+++ ace/trunk/run-client/client.bndrun Thu Jul 18 13:54:46 2013
@@ -50,7 +50,8 @@
 	org.apache.ace.tageditor;version=latest,\
 	org.apache.ace.target.mgmt.ui;version=latest,\
 	org.apache.ace.useradmin.ui;version=latest,\
-	org.apache.ace.webui.vaadin;version=latest
+	org.apache.ace.webui.vaadin;version=latest,\
+	org.apache.ace.gogo;version=latest
 -runrepos: Workspace,\
 	Release
 -runproperties: org.apache.felix.log.storeDebug=true,\

Modified: ace/trunk/run-server-allinone/server-allinone.bndrun
URL: http://svn.apache.org/viewvc/ace/trunk/run-server-allinone/server-allinone.bndrun?rev=1504472&r1=1504471&r2=1504472&view=diff
==============================================================================
--- ace/trunk/run-server-allinone/server-allinone.bndrun (original)
+++ ace/trunk/run-server-allinone/server-allinone.bndrun Thu Jul 18 13:54:46 2013
@@ -58,7 +58,8 @@
 	org.apache.ace.useradmin.ui;version=latest,\
 	org.apache.ace.verifier.impl;version=latest,\
 	org.apache.ace.verifier.ui;version=latest,\
-	org.apache.ace.webui.vaadin;version=latest
+	org.apache.ace.webui.vaadin;version=latest,\
+	org.apache.ace.gogo;version=latest
 -runrepos: Workspace,\
 	Local Repository,\
 	Release,\



Mime
View raw message