You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2013/09/30 12:28:10 UTC

svn commit: r1527508 [1/4] - in /sling/trunk/tooling/ide: ./ api-test/ api/ api/META-INF/ api/OSGI-INF/ api/src/org/apache/sling/ide/filter/ api/src/org/apache/sling/ide/osgi/ api/src/org/apache/sling/ide/serialization/ api/src/org/apache/sling/ide/tra...

Author: rombert
Date: Mon Sep 30 10:28:08 2013
New Revision: 1527508

URL: http://svn.apache.org/r1527508
Log:
Merged branches/tooling-ide-vlt back into trunk

Base directory: tooling/ide

Now that we have a Jackrabbit FileVault release, we can start working on trunk.

Added:
    sling/trunk/tooling/ide/README.txt
      - copied unchanged from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/README.txt
    sling/trunk/tooling/ide/api-test/   (props changed)
      - copied from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/api-test/
    sling/trunk/tooling/ide/api/OSGI-INF/
      - copied from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/api/OSGI-INF/
    sling/trunk/tooling/ide/api/src/org/apache/sling/ide/osgi/
      - copied from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/osgi/
    sling/trunk/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationData.java
      - copied unchanged from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationData.java
    sling/trunk/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationDataBuilder.java
      - copied unchanged from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationDataBuilder.java
    sling/trunk/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationException.java
      - copied unchanged from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationException.java
    sling/trunk/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationKind.java
      - copied unchanged from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationKind.java
    sling/trunk/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationKindManager.java
      - copied unchanged from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationKindManager.java
    sling/trunk/tooling/ide/api/src/org/apache/sling/ide/transport/TracingCommand.java
      - copied unchanged from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/transport/TracingCommand.java
    sling/trunk/tooling/ide/artifacts/
      - copied from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/artifacts/
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ResourceUtil.java
      - copied unchanged from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ResourceUtil.java
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/SetBundleVersionCommand.java
      - copied unchanged from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/SetBundleVersionCommand.java
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/BundleStateHelper.java
      - copied unchanged from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/BundleStateHelper.java
    sling/trunk/tooling/ide/eclipse-ui/lib/
      - copied from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/lib/
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/actions/OpenHtmlInBrowserAction.java
      - copied unchanged from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/actions/OpenHtmlInBrowserAction.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/editors/
      - copied from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/editors/
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportRepositoryContentAction.java
      - copied unchanged from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportRepositoryContentAction.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ServerModuleDecorator.java
      - copied unchanged from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ServerModuleDecorator.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/unstructured.png
      - copied unchanged from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/unstructured.png
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/Sorter.java
      - copied unchanged from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/Sorter.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/TolerantXMLTokenizer.java
      - copied unchanged from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/TolerantXMLTokenizer.java
    sling/trunk/tooling/ide/impl-vlt/   (props changed)
      - copied from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/
    sling/trunk/tooling/ide/impl-vlt-test/   (props changed)
      - copied from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt-test/
    sling/trunk/tooling/ide/target-definition/Sling IDE Tooling.launch
      - copied unchanged from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/target-definition/Sling IDE Tooling.launch
    sling/trunk/tooling/ide/target-definition/org.apache.sling.ide.target-definition-dev.target
      - copied unchanged from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/target-definition/org.apache.sling.ide.target-definition-dev.target
    sling/trunk/tooling/ide/upload-p2-site.sh
      - copied unchanged from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/upload-p2-site.sh
    sling/trunk/tooling/ide/vlt-wrapper/   (props changed)
      - copied from r1527500, sling/branches/tooling-ide-vlt/tooling/ide/vlt-wrapper/
Removed:
    sling/trunk/tooling/ide/api/src/org/apache/sling/slingclipse/
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/wst/internal/
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/slingclipse/helper/
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/wst/ui/
    sling/trunk/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/AddNodeCommand.java
    sling/trunk/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/TracingCommand.java
    sling/trunk/tooling/ide/impl-resource/src/org/apache/sling/ide/serialization/
    sling/trunk/tooling/ide/impl-resource/src/org/apache/sling/slingclipse/http/
Modified:
    sling/trunk/tooling/ide/   (props changed)
    sling/trunk/tooling/ide/api/META-INF/MANIFEST.MF
    sling/trunk/tooling/ide/api/build.properties
    sling/trunk/tooling/ide/api/src/org/apache/sling/ide/filter/Filter.java
    sling/trunk/tooling/ide/api/src/org/apache/sling/ide/filter/FilterLocator.java
    sling/trunk/tooling/ide/api/src/org/apache/sling/ide/filter/FilterResult.java
    sling/trunk/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java
    sling/trunk/tooling/ide/api/src/org/apache/sling/ide/transport/Command.java
    sling/trunk/tooling/ide/api/src/org/apache/sling/ide/transport/FileInfo.java
    sling/trunk/tooling/ide/api/src/org/apache/sling/ide/transport/Repository.java
    sling/trunk/tooling/ide/api/src/org/apache/sling/ide/transport/ResourceProxy.java
    sling/trunk/tooling/ide/api/src/org/apache/sling/ide/util/PathUtil.java
    sling/trunk/tooling/ide/eclipse-core/META-INF/MANIFEST.MF
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ConfigurationHelper.java
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ISlingLaunchpadServer.java
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/MavenLaunchHelper.java
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ProjectUtil.java
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ServerUtil.java
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/Activator.java
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/ProjectHelper.java
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadServer.java
    sling/trunk/tooling/ide/eclipse-m2e-ui/META-INF/MANIFEST.MF
    sling/trunk/tooling/ide/eclipse-m2e-ui/build.properties
    sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/EmbeddedArchetypeInstaller.java
    sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/Activator.java
    sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/AbstractNewSlingApplicationWizard.java
    sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ArchetypeParametersWizardPage.java
    sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ChooseArchetypeWizardPage.java
    sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/NewSlingBundleWizard.java
    sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/SetupServerWizardPage.java
    sling/trunk/tooling/ide/eclipse-ui/META-INF/MANIFEST.MF
    sling/trunk/tooling/ide/eclipse-ui/build.properties
    sling/trunk/tooling/ide/eclipse-ui/plugin.xml
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/WhitelabelSupport.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/Activator.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ConnectionEditorSection.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportContentAction.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizard.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizardPage.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/InstallEditorSection.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/SharedImages.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/JcrContentContentProvider.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/DirNode.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/GenericJcrRootFile.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNode.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/LinkHelper.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/ModifiableProperties.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertToBundleAction.java
    sling/trunk/tooling/ide/feature/feature.xml
    sling/trunk/tooling/ide/impl-resource-test/pom.xml
    sling/trunk/tooling/ide/impl-resource-test/src/test/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.java
    sling/trunk/tooling/ide/impl-resource/META-INF/MANIFEST.MF
    sling/trunk/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/filer/SimpleFilter.java
    sling/trunk/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/filer/SimpleFilterLocator.java
    sling/trunk/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManager.java
    sling/trunk/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/AbstractCommand.java
    sling/trunk/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/AbstractRepository.java
    sling/trunk/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/DeleteNodeCommand.java
    sling/trunk/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/GetNodeContentCommand.java
    sling/trunk/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/RepositoryImpl.java
    sling/trunk/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/transport/UpdateContentCommand.java
    sling/trunk/tooling/ide/m2e-feature/feature.xml
    sling/trunk/tooling/ide/pom.xml
    sling/trunk/tooling/ide/target-definition/   (props changed)
    sling/trunk/tooling/ide/target-definition/org.apache.sling.ide.target-definition.target

Propchange: sling/trunk/tooling/ide/
------------------------------------------------------------------------------
    svn:mergeinfo = /sling/branches/tooling-ide-vlt/tooling/ide:1514633-1527500

Propchange: sling/trunk/tooling/ide/api-test/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Mon Sep 30 10:28:08 2013
@@ -0,0 +1,4 @@
+target
+.classpath
+.settings
+.project

Modified: sling/trunk/tooling/ide/api/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/api/META-INF/MANIFEST.MF?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/api/META-INF/MANIFEST.MF (original)
+++ sling/trunk/tooling/ide/api/META-INF/MANIFEST.MF Mon Sep 30 10:28:08 2013
@@ -3,11 +3,20 @@ Bundle-ManifestVersion: 2
 Bundle-Name: Slingclipse-api
 Bundle-SymbolicName: org.apache.sling.ide.api
 Bundle-Version: 0.0.1.qualifier
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Export-Package: org.apache.sling.ide.filter,
+ org.apache.sling.ide.osgi,
  org.apache.sling.ide.serialization,
  org.apache.sling.ide.transport,
  org.apache.sling.ide.util
+Import-Package: org.apache.commons.httpclient;version="3.1.0",
+ org.apache.commons.httpclient.auth;version="3.1.0",
+ org.apache.commons.httpclient.methods;version="3.1.0",
+ org.apache.commons.httpclient.methods.multipart;version="3.1.0",
+ org.apache.commons.httpclient.params;version="3.1.0",
+ org.apache.commons.io;version="2.0.1",
+ org.json,
+ org.osgi.framework;version="1.6.0",
+ org.osgi.service.event
+Service-Component: OSGI-INF/*.xml

Modified: sling/trunk/tooling/ide/api/build.properties
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/api/build.properties?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/api/build.properties (original)
+++ sling/trunk/tooling/ide/api/build.properties Mon Sep 30 10:28:08 2013
@@ -1,4 +1,5 @@
 source.. = src/
 output.. = bin/
 bin.includes = META-INF/,\
-               .
+               .,\
+               OSGI-INF/

Modified: sling/trunk/tooling/ide/api/src/org/apache/sling/ide/filter/Filter.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/api/src/org/apache/sling/ide/filter/Filter.java?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/api/src/org/apache/sling/ide/filter/Filter.java (original)
+++ sling/trunk/tooling/ide/api/src/org/apache/sling/ide/filter/Filter.java Mon Sep 30 10:28:08 2013
@@ -16,6 +16,10 @@
  */
 package org.apache.sling.ide.filter;
 
+import java.io.File;
+
+import org.apache.sling.ide.transport.RepositoryInfo;
+
 public interface Filter {
 
     /**
@@ -23,5 +27,5 @@ public interface Filter {
      * @param relativeFilePath a relative path
      * @return the filter result
      */
-    FilterResult filter(String relativeFilePath);
+    FilterResult filter(File contentSyncRoot, String relativeFilePath, RepositoryInfo repositoryInfo);
 }

Modified: sling/trunk/tooling/ide/api/src/org/apache/sling/ide/filter/FilterLocator.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/api/src/org/apache/sling/ide/filter/FilterLocator.java?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/api/src/org/apache/sling/ide/filter/FilterLocator.java (original)
+++ sling/trunk/tooling/ide/api/src/org/apache/sling/ide/filter/FilterLocator.java Mon Sep 30 10:28:08 2013
@@ -22,7 +22,19 @@ import java.io.InputStream;
 
 public interface FilterLocator {
 
+    // TODO - should be File[] to allow multiple lookups, see {filter-vlt.xml, filter.xml}
     File findFilterLocation(File syncDirectory);
 
+    /**
+     * Loads a filter based on the raw <tt>filterFileContents</tt>
+     * 
+     * <p>
+     * If the <tt>filterFileContents</tt> is null it returns a default filter
+     * </p>
+     * 
+     * @param filterFileContents the raw contents of the filter file, possibly null
+     * @return
+     * @throws IOException
+     */
     Filter loadFilter(InputStream filterFileContents) throws IOException;
 }

Modified: sling/trunk/tooling/ide/api/src/org/apache/sling/ide/filter/FilterResult.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/api/src/org/apache/sling/ide/filter/FilterResult.java?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/api/src/org/apache/sling/ide/filter/FilterResult.java (original)
+++ sling/trunk/tooling/ide/api/src/org/apache/sling/ide/filter/FilterResult.java Mon Sep 30 10:28:08 2013
@@ -17,5 +17,17 @@
 package org.apache.sling.ide.filter;
 
 public enum FilterResult {
-    ALLOW, DENY;
+    /**
+     * Signals that the resource is allowed by the filter
+     */
+    ALLOW,
+    /**
+     * Signals that the resource is not allowed by the filter
+     */
+    DENY,
+    /**
+     * Signals that the resources is not explicitly included in the filter definitions but it is a parent of a resource
+     * which is allowed
+     */
+    PREREQUISITE;
 }

Modified: sling/trunk/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java (original)
+++ sling/trunk/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java Mon Sep 30 10:28:08 2013
@@ -16,19 +16,30 @@
  */
 package org.apache.sling.ide.serialization;
 
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Map;
+
+import org.apache.sling.ide.transport.Repository;
+import org.apache.sling.ide.transport.ResourceProxy;
 
 public interface SerializationManager {
 
+    void destroy();
+
     boolean isSerializationFile(String filePath);
 
     String getBaseResourcePath(String serializationFilePath);
 
-    String getSerializationFilePath(String baseFilePath);
+    String getSerializationFilePath(String baseFilePath, SerializationKind serializationKind);
 
-    String buildSerializationData(Map<String, Object> content) throws IOException;
+    SerializationDataBuilder newBuilder(Repository repository, File contentSyncRoot) throws SerializationException;
 
-    Map<String, Object> readSerializationData(InputStream source) throws IOException;
+    /**
+     * @param filePath The filePath, in repository format
+     * @param source
+     * @return
+     * @throws IOException
+     */
+    ResourceProxy readSerializationData(String filePath, InputStream source) throws IOException;
 }

Modified: sling/trunk/tooling/ide/api/src/org/apache/sling/ide/transport/Command.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/api/src/org/apache/sling/ide/transport/Command.java?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/api/src/org/apache/sling/ide/transport/Command.java (original)
+++ sling/trunk/tooling/ide/api/src/org/apache/sling/ide/transport/Command.java Mon Sep 30 10:28:08 2013
@@ -19,4 +19,6 @@ package org.apache.sling.ide.transport;
 public interface Command<T> {
 
 	Result<T> execute();
+
+    String getPath();
 }

Modified: sling/trunk/tooling/ide/api/src/org/apache/sling/ide/transport/FileInfo.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/api/src/org/apache/sling/ide/transport/FileInfo.java?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/api/src/org/apache/sling/ide/transport/FileInfo.java (original)
+++ sling/trunk/tooling/ide/api/src/org/apache/sling/ide/transport/FileInfo.java Mon Sep 30 10:28:08 2013
@@ -36,6 +36,9 @@ public class FileInfo {
 		this.relativeLocation = relativeLocation;
 	}
 
+    /**
+     * @return the absolute location of the file on the filesystem
+     */
 	public String getLocation() {
 		return location;
 	}
@@ -44,6 +47,9 @@ public class FileInfo {
 		return name;
 	}
 
+    /**
+     * @return the location of the file relative to the repository root
+     */
 	public String getRelativeLocation() {
 		return relativeLocation;
 	}

Modified: sling/trunk/tooling/ide/api/src/org/apache/sling/ide/transport/Repository.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/api/src/org/apache/sling/ide/transport/Repository.java?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/api/src/org/apache/sling/ide/transport/Repository.java (original)
+++ sling/trunk/tooling/ide/api/src/org/apache/sling/ide/transport/Repository.java Mon Sep 30 10:28:08 2013
@@ -16,8 +16,6 @@
  */
 package org.apache.sling.ide.transport;
 
-import java.util.Map;
-
 public interface Repository {
 	
 	public static String JCR_PRIMARY_TYPE= "jcr:primaryType";
@@ -81,15 +79,27 @@ public interface Repository {
     // FIXME this is not thread-safe and with multiple sling servers will fail intermitently
 	public void setRepositoryInfo(RepositoryInfo repositoryInfo);
 
-	Command<Void> newAddNodeCommand(FileInfo fileInfo);
-	
-    Command<Void> newUpdateContentNodeCommand(FileInfo fileInfo, Map<String, Object> serializationData);
+    RepositoryInfo getRepositoryInfo();
+
+    Command<Void> newAddOrUpdateNodeCommand(FileInfo fileInfo, ResourceProxy resourceProxy);
 	
-	Command<Void> newDeleteNodeCommand(FileInfo fileInfo);
+	Command<Void> newDeleteNodeCommand(ResourceProxy resourceProxy);
  
+    /**
+     * Retrieves information about the resource located at <tt>path</tt> and its direct descendants
+     * 
+     * @param path
+     * @return a <tt>ResourceProxy</tt> rooted at <tt>path</tt> and its direct descendants
+     */
     Command<ResourceProxy> newListChildrenNodeCommand(String path);
  	
-    Command<Map<String, Object>> newGetNodeContentCommand(String path);
+    /**
+     * Retrieves all properties of a resource located at <tt>path</tt>
+     * 
+     * @param path
+     * @return all properties for the resource located at <tt>path</tt>
+     */
+    Command<ResourceProxy> newGetNodeContentCommand(String path);
 
 	Command<byte[]> newGetNodeCommand(String path);
 }

Modified: sling/trunk/tooling/ide/api/src/org/apache/sling/ide/transport/ResourceProxy.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/api/src/org/apache/sling/ide/transport/ResourceProxy.java?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/api/src/org/apache/sling/ide/transport/ResourceProxy.java (original)
+++ sling/trunk/tooling/ide/api/src/org/apache/sling/ide/transport/ResourceProxy.java Mon Sep 30 10:28:08 2013
@@ -24,11 +24,17 @@ import java.util.Map;
 public class ResourceProxy {
 
     private final String path;
-    private final Map<String, Object> properties = new HashMap<String, Object>();
+    private final Map<String, Object> properties;
     private final List<ResourceProxy> children = new ArrayList<ResourceProxy>();
+    private final Map<Class<?>, Object> adapted = new HashMap<Class<?>, Object>(1);
 
     public ResourceProxy(String path) {
+        this(path, new HashMap<String, Object>());
+    }
+
+    public ResourceProxy(String path, Map<String, Object> properties) {
         this.path = path;
+        this.properties = properties;
     }
 
     public void addChild(ResourceProxy child) {
@@ -53,6 +59,19 @@ public class ResourceProxy {
         return properties;
     }
 
+    public <T> void addAdapted(Class<T> klazz, T adaptedInstance) {
+
+        adapted.put(klazz, adaptedInstance);
+    }
+
+    public <T> T adaptTo(Class<T> klazz) {
+
+        // OK to suppress warnings since type safety is insured by addAdapted
+        @SuppressWarnings("unchecked")
+        T res = (T) adapted.get(klazz);
+
+        return res;
+    }
 
     @Override
     public String toString() {

Modified: sling/trunk/tooling/ide/api/src/org/apache/sling/ide/util/PathUtil.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/api/src/org/apache/sling/ide/util/PathUtil.java?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/api/src/org/apache/sling/ide/util/PathUtil.java (original)
+++ sling/trunk/tooling/ide/api/src/org/apache/sling/ide/util/PathUtil.java Mon Sep 30 10:28:08 2013
@@ -32,4 +32,9 @@ public class PathUtil {
 
         throw new AssertionError("unreachable");
     }
+
+    public static String getName(String path) {
+
+        return path.substring(path.lastIndexOf('/') + 1);
+    }
 }

Modified: sling/trunk/tooling/ide/eclipse-core/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/META-INF/MANIFEST.MF?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-core/META-INF/MANIFEST.MF (original)
+++ sling/trunk/tooling/ide/eclipse-core/META-INF/MANIFEST.MF Mon Sep 30 10:28:08 2013
@@ -7,27 +7,20 @@ Require-Bundle: org.eclipse.core.runtime
  org.eclipse.equinox.ds;bundle-version="1.2.1",
  org.eclipse.osgi.services;bundle-version="3.2.100",
  org.eclipse.core.resources,
- org.eclipse.ui,
- org.eclipse.m2e.core;bundle-version="1.4.0",
- org.eclipse.m2e.archetype.common;bundle-version="1.4.0"
+ org.eclipse.ui
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-ClassPath: .
 Import-Package: org.apache.commons.httpclient;version="3.1.0",
  org.apache.commons.httpclient.auth;version="3.1.0",
  org.apache.commons.httpclient.methods;version="3.1.0",
- org.apache.maven,
- org.apache.maven.artifact,
- org.apache.maven.artifact.handler,
- org.apache.maven.artifact.installer,
- org.apache.maven.artifact.repository,
- org.apache.maven.execution,
- org.apache.maven.model,
- org.apache.maven.plugin,
+ org.apache.commons.httpclient.params;version="3.1.0",
+ org.apache.commons.io;version="2.0.1",
+ org.apache.sling.ide.artifacts,
  org.apache.sling.ide.filter,
+ org.apache.sling.ide.osgi,
  org.apache.sling.ide.serialization,
  org.apache.sling.ide.transport,
- org.codehaus.plexus,
  org.eclipse.core.commands,
  org.eclipse.core.commands.operations,
  org.eclipse.core.resources,
@@ -46,8 +39,8 @@ Import-Package: org.apache.commons.httpc
  org.eclipse.wst.server.core,
  org.eclipse.wst.server.core.model,
  org.eclipse.wst.server.core.util,
- org.osgi.service.component;version="1.1.0",
- org.sonatype.aether
+ org.json,
+ org.osgi.service.component;version="1.1.0"
 Export-Package: org.apache.sling.ide.eclipse.core,
  org.apache.sling.ide.eclipse.core.internal
 Service-Component: OSGI-INF/Tracer.xml

Modified: sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ConfigurationHelper.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ConfigurationHelper.java?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ConfigurationHelper.java (original)
+++ sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ConfigurationHelper.java Mon Sep 30 10:28:08 2013
@@ -16,11 +16,6 @@
  */
 package org.apache.sling.ide.eclipse.core;
 
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
@@ -37,15 +32,6 @@ public class ConfigurationHelper {
 		fp2.installProjectFacet(slingContentFacet.getLatestVersion(), null, null);
 		
 		ProjectUtil.setSyncDirectoryPath(aContentProject, jcr_root);
-		
-		// temp hack: install the launch file
-		IFolder dotLaunches = aContentProject.getFolder(".settings").getFolder(".launches");
-		dotLaunches.create(true, true, monitor);
-		IFile launchFile = dotLaunches.getFile("clean_package_content_package_install.launch");
-		String l = MavenLaunchHelper.createMavenLaunchConfigMemento(aContentProject.getLocation().toOSString(), 
-				"clean package content-package:install", null, false, null);
-		InputStream in = new ByteArrayInputStream(l.getBytes());
-		launchFile.create(in, true, monitor);
 	}
 
 	public static void convertToBundleProject(IProject aBundleProject)

Modified: sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ISlingLaunchpadServer.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ISlingLaunchpadServer.java?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ISlingLaunchpadServer.java (original)
+++ sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ISlingLaunchpadServer.java Mon Sep 30 10:28:08 2013
@@ -17,6 +17,7 @@
 package org.apache.sling.ide.eclipse.core;
 
 import org.eclipse.core.runtime.IProgressMonitor;
+import org.osgi.framework.Version;
 
 public interface ISlingLaunchpadServer {
 
@@ -31,10 +32,15 @@ public interface ISlingLaunchpadServer {
     public static final String PROP_DEBUG_PORT = "launchpad.debugPort";
 
     public static final String PROP_INSTALL_LOCALLY = "launchpad.installLocally";
+    public static final String PROP_BUNDLE_VERSION_FORMAT = "launchpad.bundle.%s.version";
     
     void setPublishState(int publishState, IProgressMonitor monitor);
 
     int getPublishState();
 
     ISlingLaunchpadConfiguration getConfiguration();
+
+    void setBundleVersion(String bundleSymbolicName, Version version, IProgressMonitor monitor);
+
+    Version getBundleVersion(String bundleSymbolicName);
 }

Modified: sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/MavenLaunchHelper.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/MavenLaunchHelper.java?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/MavenLaunchHelper.java (original)
+++ sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/MavenLaunchHelper.java Mon Sep 30 10:28:08 2013
@@ -48,7 +48,7 @@ public class MavenLaunchHelper {
 					"	<stringAttribute key=\"M2_RUNTIME\" value=\"EMBEDDED\"/>"+ NL+
 					"	<booleanAttribute key=\"M2_SKIP_TESTS\" value=\"true\"/>"+ NL+
 					"	<intAttribute key=\"M2_THREADS\" value=\"1\"/>"+ NL+
-					"	<booleanAttribute key=\"M2_UPDATE_SNAPSHOTS\" value=\"true\"/>"+ NL+
+					"	<booleanAttribute key=\"M2_UPDATE_SNAPSHOTS\" value=\"false\"/>"+ NL+
 					"	<booleanAttribute key=\"M2_WORKSPACE_RESOLUTION\" value=\"false\"/>"+ NL+
 					"	<stringAttribute key=\"org.eclipse.jdt.launching.WORKING_DIRECTORY\" value=\""+location+"\"/>"+ NL+
 					"	</launchConfiguration>";

Modified: sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ProjectUtil.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ProjectUtil.java?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ProjectUtil.java (original)
+++ sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ProjectUtil.java Mon Sep 30 10:28:08 2013
@@ -16,6 +16,8 @@
  */
 package org.apache.sling.ide.eclipse.core;
 
+import java.io.File;
+
 import org.apache.sling.ide.eclipse.core.internal.Activator;
 import org.apache.sling.ide.eclipse.core.internal.ProjectHelper;
 import org.eclipse.core.resources.IFolder;
@@ -76,6 +78,10 @@ public abstract class ProjectUtil {
 
         return value;
     }
+    
+    public static File getSyncDirectoryFile(IProject project) {
+    	return new File(project.getLocation().toFile(), getSyncDirectoryValue(project));
+    }
 
     public static IPath getSyncDirectoryFullPath(IProject project) {
 

Modified: sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ServerUtil.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ServerUtil.java?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ServerUtil.java (original)
+++ sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ServerUtil.java Mon Sep 30 10:28:08 2013
@@ -23,32 +23,42 @@ import org.apache.sling.ide.eclipse.core
 import org.apache.sling.ide.eclipse.core.internal.SlingLaunchpadServer;
 import org.apache.sling.ide.transport.Repository;
 import org.apache.sling.ide.transport.RepositoryInfo;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Status;
 import org.eclipse.wst.server.core.IServer;
 
 public abstract class ServerUtil {
 
-    public static Repository getRepository(IServer server, IProgressMonitor monitor) {
+    public static Repository getRepository(IServer server, IProgressMonitor monitor) throws CoreException {
 
-        ISlingLaunchpadServer launchpadServer = (ISlingLaunchpadServer) server.loadAdapter(SlingLaunchpadServer.class,
-                monitor);
-
-        ISlingLaunchpadConfiguration configuration = launchpadServer.getConfiguration();
 
         Repository repository = Activator.getDefault().getRepository();
         try {
-            // TODO configurable scheme?
-            URI uri = new URI("http", null, server.getHost(), configuration.getPort(), configuration.getContextPath(),
-                    null, null);
-            RepositoryInfo repositoryInfo = new RepositoryInfo(configuration.getUsername(),
-                    configuration.getPassword(), uri.toString());
+            RepositoryInfo repositoryInfo = getRepositoryInfo(server, monitor);
             repository.setRepositoryInfo(repositoryInfo);
         } catch (URISyntaxException e) {
-            // TODO handle error
+            throw new CoreException(new Status(Status.ERROR, Activator.PLUGIN_ID, e.getMessage(), e));
+        } catch (RuntimeException e) {
+            throw new CoreException(new Status(Status.ERROR, Activator.PLUGIN_ID, e.getMessage(), e));
         }
         return repository;
     }
 
+    public static RepositoryInfo getRepositoryInfo(IServer server, IProgressMonitor monitor) throws URISyntaxException {
+
+        ISlingLaunchpadServer launchpadServer = (ISlingLaunchpadServer) server.loadAdapter(SlingLaunchpadServer.class,
+                monitor);
+
+        ISlingLaunchpadConfiguration configuration = launchpadServer.getConfiguration();
+
+        // TODO configurable scheme?
+        URI uri = new URI("http", null, server.getHost(), configuration.getPort(), configuration.getContextPath(),
+                null, null);
+        return new RepositoryInfo(configuration.getUsername(),
+                configuration.getPassword(), uri.toString());
+    }
+
     private ServerUtil() {
 
     }

Modified: sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/Activator.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/Activator.java?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/Activator.java (original)
+++ sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/Activator.java Mon Sep 30 10:28:08 2013
@@ -18,6 +18,7 @@ package org.apache.sling.ide.eclipse.cor
 
 import org.apache.sling.ide.eclipse.core.ServiceUtil;
 import org.apache.sling.ide.filter.FilterLocator;
+import org.apache.sling.ide.osgi.OsgiClientFactory;
 import org.apache.sling.ide.serialization.SerializationManager;
 import org.apache.sling.ide.transport.Repository;
 import org.eclipse.core.runtime.Plugin;
@@ -43,6 +44,7 @@ public class Activator extends Plugin {
     private ServiceTracker<Repository, Repository> repository;
     private ServiceTracker<SerializationManager, SerializationManager> serializationManager;
     private ServiceTracker<FilterLocator, FilterLocator> filterLocator;
+    private ServiceTracker<OsgiClientFactory, OsgiClientFactory> osgiClientFactory;
 
 	public void start(BundleContext context) throws Exception {
 		super.start(context);
@@ -57,6 +59,10 @@ public class Activator extends Plugin {
 
         filterLocator = new ServiceTracker<FilterLocator, FilterLocator>(context, FilterLocator.class, null);
         filterLocator.open();
+
+        osgiClientFactory = new ServiceTracker<OsgiClientFactory, OsgiClientFactory>(context, OsgiClientFactory.class,
+                null);
+        osgiClientFactory.open();
 	}
 
 	/*
@@ -67,6 +73,7 @@ public class Activator extends Plugin {
         repository.close();
         serializationManager.close();
         filterLocator.close();
+        osgiClientFactory.close();
 
         plugin = null;
 		super.stop(context);
@@ -93,4 +100,8 @@ public class Activator extends Plugin {
     public FilterLocator getFilterLocator() {
         return ServiceUtil.getNotNull(filterLocator);
     }
+
+    public OsgiClientFactory getOsgiClientFactory() {
+        return ServiceUtil.getNotNull(osgiClientFactory);
+    }
 }

Modified: sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/ProjectHelper.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/ProjectHelper.java?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/ProjectHelper.java (original)
+++ sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/ProjectHelper.java Mon Sep 30 10:28:08 2013
@@ -98,6 +98,10 @@ public class ProjectHelper {
 	}
 
 	private static boolean containsFacet(IProject project, String facetId) {
+        // deleted modules can trigger a publish call without having an attached project
+        if (project == null) {
+            return false;
+        }
 		IFacetedProject facetedProject = (IFacetedProject) project.getAdapter(IFacetedProject.class);
 		if (facetedProject==null ) {
 			return false;
@@ -106,7 +110,7 @@ public class ProjectHelper {
 		return facetedProject.hasProjectFacet(facet);
 	}
 	
-	static IJavaProject asJavaProject(IProject project) {
+	public static IJavaProject asJavaProject(IProject project) {
 		return JavaCore.create(project);
 	}
 	

Modified: sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java (original)
+++ sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java Mon Sep 30 10:28:08 2013
@@ -20,30 +20,34 @@ import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.URISyntaxException;
 import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.commons.httpclient.Credentials;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.URIException;
-import org.apache.commons.httpclient.UsernamePasswordCredentials;
-import org.apache.commons.httpclient.auth.AuthScope;
-import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.io.IOUtils;
+import org.apache.sling.ide.artifacts.EmbeddedArtifactLocator;
 import org.apache.sling.ide.eclipse.core.ISlingLaunchpadServer;
 import org.apache.sling.ide.eclipse.core.MavenLaunchHelper;
 import org.apache.sling.ide.eclipse.core.ProjectUtil;
+import org.apache.sling.ide.eclipse.core.ResourceUtil;
 import org.apache.sling.ide.eclipse.core.ServerUtil;
 import org.apache.sling.ide.filter.Filter;
 import org.apache.sling.ide.filter.FilterLocator;
 import org.apache.sling.ide.filter.FilterResult;
+import org.apache.sling.ide.osgi.OsgiClient;
+import org.apache.sling.ide.osgi.OsgiClientException;
+import org.apache.sling.ide.serialization.SerializationException;
+import org.apache.sling.ide.serialization.SerializationKind;
 import org.apache.sling.ide.serialization.SerializationManager;
 import org.apache.sling.ide.transport.Command;
 import org.apache.sling.ide.transport.FileInfo;
 import org.apache.sling.ide.transport.Repository;
+import org.apache.sling.ide.transport.RepositoryInfo;
 import org.apache.sling.ide.transport.ResourceProxy;
 import org.apache.sling.ide.transport.Result;
 import org.eclipse.core.resources.IFile;
@@ -68,6 +72,7 @@ import org.eclipse.wst.server.core.IServ
 import org.eclipse.wst.server.core.model.IModuleResource;
 import org.eclipse.wst.server.core.model.IModuleResourceDelta;
 import org.eclipse.wst.server.core.model.ServerBehaviourDelegate;
+import org.osgi.framework.Version;
 
 public class SlingLaunchpadBehaviour extends ServerBehaviourDelegate {
 
@@ -89,14 +94,40 @@ public class SlingLaunchpadBehaviour ext
         Result<ResourceProxy> result = null;
 
         if (getServer().getMode().equals(ILaunchManager.DEBUG_MODE)) {
-        	debuggerConnection = new JVMDebuggerConnection();
-        	success = debuggerConnection.connectInDebugMode(launch, getServer(), monitor);
-			
+            debuggerConnection = new JVMDebuggerConnection();
+            success = debuggerConnection.connectInDebugMode(launch, getServer(), monitor);
+
         } else {
-	        
-        	Command<ResourceProxy> command = ServerUtil.getRepository(getServer(), monitor).newListChildrenNodeCommand("/");
-	        result = command.execute();
-	        success = result.isSuccess();
+
+            Repository repository;
+            try {
+                repository = ServerUtil.getRepository(getServer(), monitor);
+            } catch (CoreException e) {
+                setServerState(IServer.STATE_STOPPED);
+                throw e;
+            }
+            Command<ResourceProxy> command = repository.newListChildrenNodeCommand("/");
+            result = command.execute();
+            success = result.isSuccess();
+            
+            RepositoryInfo repositoryInfo;
+            try {
+                repositoryInfo = ServerUtil.getRepositoryInfo(getServer(), monitor);
+                OsgiClient client = Activator.getDefault().getOsgiClientFactory().createOsgiClient(repositoryInfo);
+                Version bundleVersion = client.getBundleVersion(EmbeddedArtifactLocator.SUPPORT_BUNDLE_SYMBOLIC_NAME);
+                
+                ISlingLaunchpadServer launchpadServer = (ISlingLaunchpadServer) getServer().loadAdapter(SlingLaunchpadServer.class,
+                        monitor);
+                launchpadServer.setBundleVersion(EmbeddedArtifactLocator.SUPPORT_BUNDLE_SYMBOLIC_NAME, bundleVersion,
+                        monitor);
+                
+            } catch (URISyntaxException e) {
+                Activator.getDefault().getLog().log(new Status(IStatus.WARNING, Activator.PLUGIN_ID, 
+                        "Failed retrieving information about the installation support bundle", e));
+            } catch (OsgiClientException e) {
+                Activator.getDefault().getLog().log(new Status(IStatus.WARNING, Activator.PLUGIN_ID, 
+                        "Failed retrieving information about the installation support bundle", e));
+            }
         }
 
         if (success) {
@@ -107,8 +138,7 @@ public class SlingLaunchpadBehaviour ext
             if (result != null) {
                 message += " (" + result.toString() + ")";
             }
-            throw new CoreException(new Status(IStatus.ERROR, "org.apache.sling.ide.eclipse.wst",
-                    message));
+            throw new CoreException(new Status(IStatus.ERROR, "org.apache.sling.ide.eclipse.wst", message));
         }
     }
 
@@ -168,16 +198,42 @@ public class SlingLaunchpadBehaviour ext
 
         System.out.println(trace.toString());
 
-        if (ProjectHelper.isBundleProject(module[0].getProject())) {
-            String serverMode = getServer().getMode();
-            if (!serverMode.equals(ILaunchManager.DEBUG_MODE)) {
-                // in debug mode, we rely on the hotcode replacement feature of eclipse/jvm
-                // otherwise, for run and profile modes we explicitly publish the bundle module
-                // TODO: make this configurable as part of the server config
-        		publishBundleModule(module, monitor);
-        	}
-        } else if (ProjectHelper.isContentProject(module[0].getProject())) {
-    		publishContentModule(kind, deltaKind, module, monitor); 
+        if (kind == IServer.PUBLISH_FULL && deltaKind == ServerBehaviourDelegate.REMOVED) {
+            System.out.println("Ignoring request to unpublish all of the module resources");
+            return;
+        }
+
+        try {
+            if (ProjectHelper.isBundleProject(module[0].getProject())) {
+                String serverMode = getServer().getMode();
+                if (!serverMode.equals(ILaunchManager.DEBUG_MODE)) {
+                    // in debug mode, we rely on the hotcode replacement feature of eclipse/jvm
+                    // otherwise, for run and profile modes we explicitly publish the bundle module
+                    // TODO: make this configurable as part of the server config
+            		publishBundleModule(module, monitor);
+					BundleStateHelper.resetBundleState(getServer(), module[0].getProject());
+            	}
+            } else if (ProjectHelper.isContentProject(module[0].getProject())) {
+                if ((kind == IServer.PUBLISH_AUTO || kind == IServer.PUBLISH_INCREMENTAL) && deltaKind == ServerBehaviourDelegate.NO_CHANGE) {
+                    System.out
+                            .println("Ignoring request to publish the module when no resources have changed; most likely another module has changed");
+                    return;
+                }
+                try {
+                    publishContentModule(kind, deltaKind, module, monitor);
+					BundleStateHelper.resetBundleState(getServer(), module[0].getProject());
+                } catch (SerializationException e) {
+                    throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Serialization error for "
+                            + trace.toString(), e));
+                } catch (IOException e) {
+                    throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "IO error for "
+                            + trace.toString(), e));
+                }
+            }
+        } finally {
+            if (serializationManager != null) {
+                serializationManager.destroy();
+            }
         }
     }
 
@@ -185,71 +241,51 @@ public class SlingLaunchpadBehaviour ext
 		final IProject project = module[0].getProject();
         boolean installLocally = getServer().getAttribute(ISlingLaunchpadServer.PROP_INSTALL_LOCALLY, true);
 		if (!installLocally) {
-			try{
-				final String launchMemento = MavenLaunchHelper.createMavenLaunchConfigMemento(project.getLocation().toString(),
-						"sling:install", "bundle", false, null);
-				IFolder dotLaunches = project.getFolder(".settings").getFolder(".launches");
-				if (!dotLaunches.exists()) {
-					dotLaunches.create(true, true, monitor);
-				}
-				IFile launchFile = dotLaunches.getFile("sling_install.launch");
-				InputStream in = new ByteArrayInputStream(launchMemento.getBytes());
-				if (!launchFile.exists()) {
-					launchFile.create(in, true, monitor);
-				}
+            final String launchMemento = MavenLaunchHelper.createMavenLaunchConfigMemento(project.getLocation()
+                    .toString(), "package org.apache.sling:maven-sling-plugin:install", null, false, null);
+            IFolder dotLaunches = project.getFolder(".settings").getFolder(".launches");
+            if (!dotLaunches.exists()) {
+                dotLaunches.create(true, true, monitor);
+            }
+            IFile launchFile = dotLaunches.getFile("sling_install.launch");
+            InputStream in = new ByteArrayInputStream(launchMemento.getBytes());
+            if (!launchFile.exists()) {
+                launchFile.create(in, true, monitor);
+            }
 
-				ILaunchConfiguration launchConfig = 
-						DebugPlugin.getDefault().getLaunchManager().getLaunchConfiguration(launchFile);
-				launchConfig.launch(ILaunchManager.RUN_MODE, monitor);
-			} catch(Exception e) {
-				// TODO proper logging
-				e.printStackTrace();
-			}
+            ILaunchConfiguration launchConfig = DebugPlugin.getDefault().getLaunchManager()
+                    .getLaunchConfiguration(launchFile);
+            launchConfig.launch(ILaunchManager.RUN_MODE, monitor);
 		} else {
 			monitor.beginTask("deploying via local install", 5);
-	        HttpClient httpClient = new HttpClient();
-	        String hostname = getServer().getHost();
-	        int launchpadPort = getServer().getAttribute(ISlingLaunchpadServer.PROP_PORT, 8080);
-	        PostMethod method = new PostMethod("http://"+hostname+":"+launchpadPort+"/system/sling/tooling/install");
-	        String username = getServer().getAttribute(ISlingLaunchpadServer.PROP_USERNAME, "admin");
-	        String password = getServer().getAttribute(ISlingLaunchpadServer.PROP_PASSWORD, "admin");
-	        String userInfo = username+":"+password;
-	        if (userInfo != null) {
-	        	Credentials c = new UsernamePasswordCredentials(userInfo);
-	        	try {
-					httpClient.getState().setCredentials(
-							new AuthScope(method.getURI().getHost(), method
-									.getURI().getPort()), c);
-				} catch (URIException e) {
-					// TODO proper logging
-					e.printStackTrace();
-				}
-	        }
-	        IJavaProject javaProject = ProjectHelper.asJavaProject(project);
-	        IPath outputLocation = javaProject.getOutputLocation();
-			outputLocation = outputLocation.makeRelativeTo(project.getFullPath());
-	        IPath location = project.getRawLocation();
-	        if (location==null) {
-	        	location = project.getLocation();
-	        }
-			method.addParameter("dir", location.toString() + "/" + outputLocation.toString());
-	        monitor.worked(1);
+
             try {
-				httpClient.executeMethod(method);
-		        monitor.worked(4);
-		        setModulePublishState(module, IServer.PUBLISH_STATE_NONE);
-			} catch (HttpException e) {
-				// TODO proper logging
-				e.printStackTrace();
-			} catch (IOException e) {
-				// TODO proper logging
-				e.printStackTrace();
-			}
+                OsgiClient osgiClient = Activator.getDefault().getOsgiClientFactory()
+                        .createOsgiClient(ServerUtil.getRepositoryInfo(getServer(), monitor));
+
+                IJavaProject javaProject = ProjectHelper.asJavaProject(project);
+
+                IPath outputLocation = project.getWorkspace().getRoot().findMember(javaProject.getOutputLocation())
+                        .getLocation();
+                monitor.worked(1);
+
+                osgiClient.installLocalBundle(outputLocation.toOSString());
+                monitor.worked(4);
+                setModulePublishState(module, IServer.PUBLISH_STATE_NONE);
+
+            } catch (URISyntaxException e1) {
+                throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, e1.getMessage(), e1));
+            } catch (OsgiClientException e1) {
+                throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Failed installing bundle : "
+                        + e1.getMessage(), e1));
+            } finally {
+                monitor.done();
+            }
 		}
 	}
 
-	private void publishContentModule(int kind, int deltaKind,
-			IModule[] module, IProgressMonitor monitor) throws CoreException {
+    private void publishContentModule(int kind, int deltaKind, IModule[] module, IProgressMonitor monitor)
+            throws CoreException, SerializationException, IOException {
 
 		if (runLaunchesIfExist(kind, deltaKind, module, monitor)) {
 			return;
@@ -257,8 +293,6 @@ public class SlingLaunchpadBehaviour ext
 		// otherwise fallback to old behaviour
 		
 		Repository repository = ServerUtil.getRepository(getServer(), monitor);
-
-        IModuleResource[] moduleResources = getResources(module);
         
         // TODO it would be more efficient to have a module -> filter mapping
         // it would be simpler to implement this in SlingContentModuleAdapter, but
@@ -267,8 +301,12 @@ public class SlingLaunchpadBehaviour ext
 
         switch (deltaKind) {
             case ServerBehaviourDelegate.CHANGED:
-                IModuleResourceDelta[] publishedResourceDelta = getPublishedResourceDelta(module);
-                for (IModuleResourceDelta resourceDelta : publishedResourceDelta) {
+                List<IModuleResourceDelta> publishedResourceDelta = 
+                	Arrays.asList(getPublishedResourceDelta(module));
+                
+                List<IModuleResourceDelta> adjustedPublishedResourceDelta = filterContentXmlParents(publishedResourceDelta);
+
+                for (IModuleResourceDelta resourceDelta : adjustedPublishedResourceDelta) {
 
                     StringBuilder deltaTrace = new StringBuilder();
                     deltaTrace.append("- processing delta kind ");
@@ -309,12 +347,15 @@ public class SlingLaunchpadBehaviour ext
 
             case ServerBehaviourDelegate.ADDED:
             case ServerBehaviourDelegate.NO_CHANGE: // TODO is this correct ?
-                for (IModuleResource resource : moduleResources) {
+                IModuleResource[] moduleResources1 = getResources(module);
+                List<IModuleResource> adjustedModuleResourcesList = filterContentXmlParents(moduleResources1);
+                for (IModuleResource resource : adjustedModuleResourcesList) {
                     execute(addFileCommand(repository, resource));
                 }
                 break;
             case ServerBehaviourDelegate.REMOVED:
-                for (IModuleResource resource : moduleResources) {
+                IModuleResource[] moduleResources2 = getResources(module);
+                for (IModuleResource resource : moduleResources2) {
                     execute(removeFileCommand(repository, resource));
                 }
                 break;
@@ -327,6 +368,60 @@ public class SlingLaunchpadBehaviour ext
 //        setServerPublishState(IServer.PUBLISH_STATE_NONE);
 	}
 
+    // TODO - this needs to be revisited, as it potentially prevents empty folders ( nt:folder node type) from being
+    // created
+    // TODO - we shouldn't hardcode knowledge of .content.xml here
+    private List<IModuleResourceDelta> filterContentXmlParents(List<IModuleResourceDelta> publishedResourceDelta) {
+		List<IModuleResourceDelta> adjustedPublishedResourceDelta = new LinkedList<IModuleResourceDelta>();
+		Map<String,IModuleResourceDelta> map = new HashMap<String, IModuleResourceDelta>();
+		for (IModuleResourceDelta resourceDelta : publishedResourceDelta) {
+			map.put(resourceDelta.getModuleRelativePath().toString(), resourceDelta);
+		}
+		for (Iterator<IModuleResourceDelta> it = publishedResourceDelta.iterator(); it
+				.hasNext();) {
+			IModuleResourceDelta iModuleResourceDelta = it.next();
+			String resPath = iModuleResourceDelta.getModuleRelativePath().toString();
+			IModuleResourceDelta originalEntry = map.get(resPath);
+			IModuleResourceDelta detailedEntry = map.remove(
+					resPath+"/.content.xml");
+			if (detailedEntry!=null) {
+				adjustedPublishedResourceDelta.add(detailedEntry);
+			} else if (originalEntry!=null) {
+				adjustedPublishedResourceDelta.add(originalEntry);
+			}
+		}
+		return adjustedPublishedResourceDelta;
+	}
+
+    // TODO - this needs to be revisited, as it potentially prevents empty folders ( nt:folder node type) from being
+    // created
+    // TODO - we shouldn't hardcode knowledge of .content.xml here
+    private List<IModuleResource> filterContentXmlParents(IModuleResource[] moduleResources) {
+		List<IModuleResource> moduleResourcesList = Arrays.asList(moduleResources);
+        List<IModuleResource> adjustedModuleResourcesList = new LinkedList<IModuleResource>();
+        Map<String,IModuleResource> map1 = new HashMap<String, IModuleResource>();
+        for (Iterator<IModuleResource> it = moduleResourcesList.iterator(); it
+				.hasNext();) {
+        	IModuleResource r = it.next();
+        	map1.put(r.getModuleRelativePath().toString(), r);
+        }
+        for (Iterator<IModuleResource> it = moduleResourcesList.iterator(); it
+				.hasNext();) {
+			IModuleResource iModuleResource = it.next();
+			String resPath = iModuleResource.getModuleRelativePath().toString();
+			IModuleResource originalEntry = map1.get(resPath);
+			IModuleResource detailedEntry = map1.remove(resPath+"/.content.xml");
+        	if (detailedEntry!=null) {
+        		adjustedModuleResourcesList.add(detailedEntry);
+        	} else if (originalEntry!=null){
+        		adjustedModuleResourcesList.add(originalEntry);
+        	} else {
+        		// entry was already added at filter time
+        	}
+		}
+		return adjustedModuleResourcesList;
+	}
+
 	private boolean runLaunchesIfExist(int kind, int deltaKind, IModule[] module,
 			IProgressMonitor monitor) throws CoreException {
 		final IProject project = module[0].getProject();
@@ -386,64 +481,155 @@ public class SlingLaunchpadBehaviour ext
         }
         Result<?> result = command.execute();
 
-        if (!result.isSuccess()) // TODO proper logging
-            throw new CoreException(new Status(Status.ERROR, "some.plugin", result.toString()));
+        if (!result.isSuccess()) {
+            // TODO - proper error logging
+            throw new CoreException(new Status(Status.ERROR, Activator.PLUGIN_ID, "Failed publishing "
+                    + result.toString()));
+        }
+
     }
 
-    private Command<?> addFileCommand(Repository repository, IModuleResource resource) throws CoreException {
+    private Command<?> addFileCommand(Repository repository, IModuleResource resource) throws CoreException,
+            SerializationException, IOException {
+
+        FileInfo info = createFileInfo(resource, repository);
+
+        IResource res = getResource(resource);
+        if (res == null) {
+            return null;
+        }
+
+        Object ignoreNextUpdate = res.getSessionProperty(ResourceUtil.QN_IGNORE_NEXT_CHANGE);
+        if (ignoreNextUpdate != null) {
+            res.setSessionProperty(ResourceUtil.QN_IGNORE_NEXT_CHANGE, null);
+            return null;
+        }
 
-        FileInfo info = createFileInfo(resource);
+        if (res.isTeamPrivateMember(IResource.CHECK_ANCESTORS)) {
+            Activator.getDefault().getLog()
+                    .log(new Status(IStatus.INFO, Activator.PLUGIN_ID, "Skipping team-private resource " + res));
+            return null;
+        }
 
         System.out.println("For " + resource + " build fileInfo " + info);
         if (info == null) {
             return null;
         }
 
-        if (serializationManager().isSerializationFile(info.getLocation())) {
+        File syncDirectoryAsFile = ProjectUtil.getSyncDirectoryFullPath(res.getProject()).toFile();
+        IFolder syncDirectory = ProjectUtil.getSyncDirectory(res.getProject());
+
+        if (serializationManager(repository, syncDirectoryAsFile).isSerializationFile(info.getLocation())) {
+            InputStream contents = null;
             try {
                 IFile file = (IFile) resource.getAdapter(IFile.class);
-                InputStream contents = file.getContents();
-                Map<String, Object> serializationData = serializationManager().readSerializationData(contents);
-                return repository.newUpdateContentNodeCommand(info, serializationData);
+                contents = file.getContents();
+                String resourceLocation = file.getFullPath().makeRelativeTo(syncDirectory.getFullPath()).toPortableString();
+                ResourceProxy resourceProxy = serializationManager(repository, syncDirectoryAsFile)
+                        .readSerializationData(resourceLocation, contents);
+                // TODO - not sure if this 100% correct, but we definitely should not refer to the FileInfo as the
+                // .serialization file, since for nt:file/nt:resource nodes this will overwrite the file contents
+                String primaryType = (String) resourceProxy.getProperties().get(Repository.JCR_PRIMARY_TYPE);
+                if (Repository.NT_FILE.equals(primaryType) || Repository.NT_RESOURCE.equals(primaryType)) {
+                    // TODO move logic to serializationManager
+                    File locationFile = new File(info.getLocation());
+                    String locationFileParent = locationFile.getParent();
+                    int endIndex = locationFileParent.length() - ".dir".length();
+                    File actualFile = new File(locationFileParent.substring(0, endIndex));
+                    String newLocation = actualFile.getAbsolutePath();
+                    String newName = actualFile.getName();
+                    String newRelativeLocation = actualFile.getAbsolutePath().substring(
+                            syncDirectoryAsFile.getAbsolutePath().length());
+                    info = new FileInfo(newLocation, newRelativeLocation, newName);
+                }
+
+                return repository.newAddOrUpdateNodeCommand(info, resourceProxy);
             } catch (IOException e) {
                 // TODO logging
                 e.printStackTrace();
                 return null;
+            } finally {
+                if (contents != null) {
+                    contents.close();
+                }
             }
         } else {
-            return repository.newAddNodeCommand(info);
+
+            ResourceProxy resourceProxy = buildResourceProxyForPlainFileOrFolder( resource, syncDirectory);
+
+            return repository.newAddOrUpdateNodeCommand(info, resourceProxy);
         }
     }
 
-    private FileInfo createFileInfo(IModuleResource resource) {
+	private ResourceProxy buildResourceProxyForPlainFileOrFolder( IModuleResource resource, IFolder syncDirectory)
+			throws IOException, CoreException {
+		IFile file = (IFile) resource.getAdapter(IFile.class);
+		IFolder folder = (IFolder) resource.getAdapter(IFolder.class);
 
-        IResource file = (IFile) resource.getAdapter(IFile.class);
-        if (file == null) {
-            file = (IFolder) resource.getAdapter(IFolder.class);
+		IResource changedResource = file != null ? file : folder;
+		if (changedResource == null) {
+		    System.err.println("Could not find a file or a folder for " + resource);
+		    return null;
+		}
+
+		SerializationKind serializationKind;
+		String fallbackNodeType;
+		if (changedResource.getType() == IResource.FILE) {
+		    serializationKind = SerializationKind.FILE;
+		    fallbackNodeType = Repository.NT_FILE;
+		} else { // i.e. IResource.FOLDER
+		    serializationKind = SerializationKind.FOLDER;
+		    fallbackNodeType = Repository.NT_FOLDER;
+		}
+
+		String resourceLocation = '/' + changedResource.getFullPath().makeRelativeTo(syncDirectory.getFullPath())
+		        .toPortableString();
+		String serializationFilePath = serializationManager.getSerializationFilePath(resourceLocation,
+		        serializationKind);
+		IResource serializationResource = syncDirectory.findMember(serializationFilePath);
+		return buildResourceProxy(resourceLocation, serializationResource, syncDirectory, fallbackNodeType);
+	}
+
+    private ResourceProxy buildResourceProxy(String resourceLocation, IResource serializationResource,
+            IFolder syncDirectory, String fallbackPrimaryType) throws IOException, CoreException {
+        if (serializationResource instanceof IFile) {
+            IFile serializationFile = (IFile) serializationResource;
+            InputStream contents = null;
+            try {
+                contents = serializationFile.getContents();
+                String serializationFilePath = serializationResource.getFullPath()
+                        .makeRelativeTo(syncDirectory.getFullPath()).toPortableString();
+                return serializationManager.readSerializationData(serializationFilePath, contents);
+            } finally {
+                if (contents != null) {
+                    contents.close();
+                }
+            }
         }
 
+        return new ResourceProxy(resourceLocation, Collections.singletonMap(Repository.JCR_PRIMARY_TYPE,
+                    (Object) fallbackPrimaryType));
+    }
+
+    private FileInfo createFileInfo(IModuleResource resource, Repository repository) throws SerializationException,
+            CoreException {
+
+        IResource file = getResource(resource);
         if (file == null) {
-            // Usually happens on server startup, it seems to be safe to ignore for now
-            System.out.println("Got null '" + IFile.class.getSimpleName() + "' and '" + IFolder.class.getSimpleName()
-                    + "' for " + resource);
             return null;
         }
 
         IProject project = file.getProject();
 
         String syncDirectory = ProjectUtil.getSyncDirectoryValue(project);
+        File syncDirectoryAsFile = ProjectUtil.getSyncDirectoryFile(project);
 
-        Filter filter = null;
-        try {
-            filter = loadFilter(project, project.getFolder(syncDirectory));
-        } catch (CoreException e) {
-            // TODO error handling
-            e.printStackTrace();
-        }
+        Filter filter = loadFilter(project.getFolder(syncDirectory));
 
         if (filter != null) {
-            FilterResult filterResult = getFilterResult(resource, filter);
-            if (filterResult == FilterResult.DENY) {
+            FilterResult filterResult = getFilterResult(resource, filter, syncDirectoryAsFile,
+                    repository);
+            if (filterResult == FilterResult.DENY || filterResult == FilterResult.PREREQUISITE) {
                 return null;
             }
         }
@@ -457,32 +643,79 @@ public class SlingLaunchpadBehaviour ext
         return info;
     }
 
-    private FilterResult getFilterResult(IModuleResource resource, Filter filter) {
+    private IResource getResource(IModuleResource resource) {
 
-        String filePath = resource.getModuleRelativePath().toOSString();
-        if (serializationManager().isSerializationFile(filePath)) {
-            filePath = serializationManager.getBaseResourcePath(filePath);
+        IResource file = (IFile) resource.getAdapter(IFile.class);
+        if (file == null) {
+            file = (IFolder) resource.getAdapter(IFolder.class);
         }
 
-        System.out.println("Filtering by " + filePath + " for " + resource);
+        if (file == null) {
+            // Usually happens on server startup, it seems to be safe to ignore for now
+            System.out.println("Got null '" + IFile.class.getSimpleName() + "' and '" + IFolder.class.getSimpleName()
+                    + "' for " + resource);
+            return null;
+        }
 
-        return filter.filter(filePath);
+        return file;
     }
 
-    private Command<?> removeFileCommand(Repository repository, IModuleResource resource) {
+    private FilterResult getFilterResult(IModuleResource resource, Filter filter, File contentSyncRoot,
+            Repository repository) throws SerializationException {
 
-        FileInfo info = createFileInfo(resource);
+        String filePath = resource.getModuleRelativePath().toOSString();
+		String absFilePath = new File(contentSyncRoot, filePath).getAbsolutePath();
+        if (serializationManager(repository, contentSyncRoot).isSerializationFile(absFilePath)) {
+            filePath = serializationManager.getBaseResourcePath(filePath);
+        }
+        
+        String repositoryPath = resource.getModuleRelativePath().toPortableString();
 
-        if (info == null) {
+        System.out.println("Filtering by " + repositoryPath + " for " + resource);
+
+        return filter.filter(contentSyncRoot, repositoryPath, repository.getRepositoryInfo());
+    }
+
+    private Command<?> removeFileCommand(Repository repository, IModuleResource resource) throws SerializationException, IOException, CoreException {
+    	
+        IResource deletedResource = getResource(resource);
+        
+        if ( deletedResource == null ) {
+        	return null;
+        }
+        
+        if (deletedResource.isTeamPrivateMember(IResource.CHECK_ANCESTORS)) {
+            Activator
+                    .getDefault()
+                    .getLog()
+                    .log(new Status(IStatus.INFO, Activator.PLUGIN_ID, "Skipping team-private resource "
+                            + deletedResource));
             return null;
         }
+        
+        IFolder syncDirectory = ProjectUtil.getSyncDirectory(deletedResource.getProject());
+        File syncDirectoryAsFile = ProjectUtil.getSyncDirectoryFile(deletedResource.getProject());
+        
+        Filter filter = loadFilter(syncDirectory);
+
+        if (filter != null) {
+            FilterResult filterResult = getFilterResult(resource, filter, syncDirectoryAsFile, repository);
+            if (filterResult == FilterResult.DENY || filterResult == FilterResult.PREREQUISITE) {
+                return null;
+            }
+        }
 
-        return repository.newDeleteNodeCommand(info);
+        ResourceProxy resourceProxy = buildResourceProxyForPlainFileOrFolder(resource, syncDirectory);
+
+        return repository.newDeleteNodeCommand(resourceProxy);
     }
 
-    private Filter loadFilter(IProject project, final IFolder syncFolder) throws CoreException {
+    private Filter loadFilter(final IFolder syncFolder) throws CoreException {
         FilterLocator filterLocator = Activator.getDefault().getFilterLocator();
         File filterLocation = filterLocator.findFilterLocation(syncFolder.getLocation().toFile());
+        if (filterLocation == null) {
+            return null;
+        }
         IPath filterPath = Path.fromOSString(filterLocation.getAbsolutePath());
         IFile filterFile = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(filterPath);
         Filter filter = null;
@@ -492,22 +725,20 @@ public class SlingLaunchpadBehaviour ext
                 filter = filterLocator.loadFilter(contents);
             } catch (IOException e) {
                 throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
-                        "Failed loading filter file for project " + project.getName() + " from location " + filterFile,
-                        e));
+                        "Failed loading filter file for project " + syncFolder.getProject().getName()
+                                + " from location " + filterFile, e));
             } finally {
-                try {
-                    contents.close();
-                } catch (IOException e) {
-                    // TODO exception handling
-                }
+                IOUtils.closeQuietly(contents);
             }
         }
         return filter;
     }
 
-    private SerializationManager serializationManager() {
+    private SerializationManager serializationManager(Repository repository, File contentSyncRoot)
+            throws SerializationException {
         if (serializationManager == null) {
             serializationManager = Activator.getDefault().getSerializationManager();
+//            serializationManager.init(repository, contentSyncRoot);
         }
 
         return serializationManager;

Modified: sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadServer.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadServer.java?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadServer.java (original)
+++ sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadServer.java Mon Sep 30 10:28:08 2013
@@ -25,6 +25,7 @@ import org.eclipse.core.runtime.Status;
 import org.eclipse.wst.server.core.IModule;
 import org.eclipse.wst.server.core.IServerWorkingCopy;
 import org.eclipse.wst.server.core.model.ServerDelegate;
+import org.osgi.framework.Version;
 
 public class SlingLaunchpadServer extends ServerDelegate implements ISlingLaunchpadServer {
 
@@ -152,4 +153,26 @@ public class SlingLaunchpadServer extend
 			throw new RuntimeException(e);
 		}
     }
+
+    @Override
+    public Version getBundleVersion(String bundleSymbolicName) {
+
+        String rawValue = getAttribute(String.format(PROP_BUNDLE_VERSION_FORMAT, bundleSymbolicName), (String) null);
+
+        return rawValue != null ? new Version(rawValue) : null;
+    }
+
+    @Override
+    public void setBundleVersion(String bundleSymbolicName, Version version, IProgressMonitor monitor) {
+
+        String stringVersion = version != null ? version.toString() : null;
+
+        IServerWorkingCopy wc = getServer().createWorkingCopy();
+        wc.setAttribute(String.format(PROP_BUNDLE_VERSION_FORMAT, bundleSymbolicName), stringVersion);
+        try {
+            wc.save(false, monitor);
+        } catch (CoreException e) {
+            throw new RuntimeException(e);
+        }
+    }
 }

Modified: sling/trunk/tooling/ide/eclipse-m2e-ui/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-m2e-ui/META-INF/MANIFEST.MF?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-m2e-ui/META-INF/MANIFEST.MF (original)
+++ sling/trunk/tooling/ide/eclipse-m2e-ui/META-INF/MANIFEST.MF Mon Sep 30 10:28:08 2013
@@ -11,6 +11,7 @@ Import-Package: org.apache.commons.httpc
  org.apache.commons.httpclient.methods;version="3.1.0",
  org.apache.commons.httpclient.methods.multipart;version="3.1.0",
  org.apache.commons.httpclient.params;version="3.1.0",
+ org.apache.commons.io;version="2.0.1",
  org.apache.maven,
  org.apache.maven.archetype,
  org.apache.maven.archetype.catalog,
@@ -22,7 +23,10 @@ Import-Package: org.apache.commons.httpc
  org.apache.maven.execution,
  org.apache.maven.model,
  org.apache.maven.plugin,
+ org.apache.sling.ide.artifacts,
  org.apache.sling.ide.eclipse.core,
+ org.apache.sling.ide.osgi,
+ org.apache.sling.ide.transport,
  org.codehaus.plexus,
  org.eclipse.core.resources,
  org.eclipse.core.runtime;version="3.4.0",
@@ -51,7 +55,8 @@ Import-Package: org.apache.commons.httpc
  org.eclipse.wst.common.project.facet.core,
  org.eclipse.wst.server.core,
  org.osgi.framework;version="1.6.0",
+ org.osgi.util.tracker;version="1.5.0",
  org.sonatype.aether
 Bundle-ActivationPolicy: lazy
-Service-Component: OSGI-INF/*.xml
-Export-Package: org.apache.sling.ide.eclipse.ui.wizards.np
+Export-Package: org.apache.sling.ide.eclipse.m2e,
+ org.apache.sling.ide.eclipse.ui.wizards.np

Modified: sling/trunk/tooling/ide/eclipse-m2e-ui/build.properties
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-m2e-ui/build.properties?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-m2e-ui/build.properties (original)
+++ sling/trunk/tooling/ide/eclipse-m2e-ui/build.properties Mon Sep 30 10:28:08 2013
@@ -1,5 +1,6 @@
 bin.includes = plugin.xml,\
                META-INF/,\
                .,\
-               target/sling-tooling-support-install/
+               target/sling-tooling-support-install/,\
+               target/archetypes/
 source.. = src/

Modified: sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/EmbeddedArchetypeInstaller.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/EmbeddedArchetypeInstaller.java?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/EmbeddedArchetypeInstaller.java (original)
+++ sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/EmbeddedArchetypeInstaller.java Mon Sep 30 10:28:08 2013
@@ -44,7 +44,11 @@ import org.apache.maven.execution.MavenE
 import org.apache.maven.execution.MavenExecutionResult;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.plugin.LegacySupport;
+import org.apache.sling.ide.eclipse.m2e.internal.Activator;
 import org.codehaus.plexus.PlexusContainer;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
 import org.eclipse.m2e.core.MavenPlugin;
 import org.eclipse.m2e.core.embedder.IMaven;
 import org.eclipse.m2e.core.internal.MavenPluginActivator;
@@ -85,62 +89,63 @@ public class EmbeddedArchetypeInstaller 
 		origins.put(fileExtension, new FileInputStream(origin));
 	}
 	
-	public void installArchetype() {
-		IMaven maven = MavenPlugin.getMaven();
-		try{
-			// first get the plexus container
-		    PlexusContainer container = ((MavenImpl) MavenPlugin.getMaven()).getPlexusContainer();
-		    
-		    // then get the DefaultMaven
-		    DefaultMaven mvn = (DefaultMaven) container.lookup(Maven.class);
-
-		    // now create a RepositorySystemSession
-		    MavenExecutionRequest request = new DefaultMavenExecutionRequest();
-		    request.setLocalRepository(maven.getLocalRepository());
-		    RepositorySystemSession repositorySession = mvn.newRepositorySession(request);
-		    
-		    // set the MavenSession on the LegacySupport
-	        MavenExecutionResult result = new DefaultMavenExecutionResult();
-			MavenSession session = new MavenSession( container, repositorySession, request, result );
-			LegacySupport legacy = container.lookup(LegacySupport.class);
-			legacy.setSession(session);
-		    
-			// then lookup the DefaultArtifactInstaller
-		    DefaultArtifactInstaller dai = (DefaultArtifactInstaller) container.lookup(ArtifactInstaller.class);
-
-		    final Set<Entry<String, InputStream>> entries = origins.entrySet();
-		    for (Iterator<Entry<String, InputStream>> it = entries.iterator(); it.hasNext();) {
-				final Entry<String, InputStream> entry = it.next();
-				final String fileExtension = entry.getKey();
-				final InputStream in = entry.getValue();
-				File tmpFile = File.createTempFile("slingClipseTmp", fileExtension);
-				FileOutputStream fos = new FileOutputStream(tmpFile);
-				copyStream(in, fos);
-				fos.close();
-				in.close();
-				Artifact jarArtifact = new DefaultArtifact(
-						groupId, 
-						artifactId, 
-						version,
-						"", fileExtension, "", 
-						new DefaultArtifactHandler());
-				dai.install(tmpFile, jarArtifact, maven.getLocalRepository());
-				tmpFile.delete();
-			}
-
-			Archetype archetype = new Archetype();
-			archetype.setGroupId(groupId);			            
-			archetype.setArtifactId(artifactId);
-			archetype.setVersion(version);
-			org.apache.maven.archetype.Archetype archetyper = MavenPluginActivator.getDefault().getArchetype();
-			archetyper.updateLocalCatalog(archetype);
+    public void installArchetype() throws CoreException {
+        try {
+            IMaven maven = MavenPlugin.getMaven();
+            // first get the plexus container
+            PlexusContainer container = ((MavenImpl) MavenPlugin.getMaven()).getPlexusContainer();
+
+            // then get the DefaultMaven
+            DefaultMaven mvn = (DefaultMaven) container.lookup(Maven.class);
+
+            // now create a RepositorySystemSession
+            MavenExecutionRequest request = new DefaultMavenExecutionRequest();
+            request.setLocalRepository(maven.getLocalRepository());
+            RepositorySystemSession repositorySession = mvn.newRepositorySession(request);
+
+            // set the MavenSession on the LegacySupport
+            MavenExecutionResult result = new DefaultMavenExecutionResult();
+            MavenSession session = new MavenSession(container, repositorySession, request, result);
+            LegacySupport legacy = container.lookup(LegacySupport.class);
+            legacy.setSession(session);
+
+            // then lookup the DefaultArtifactInstaller
+            DefaultArtifactInstaller dai = (DefaultArtifactInstaller) container.lookup(ArtifactInstaller.class);
+
+            final Set<Entry<String, InputStream>> entries = origins.entrySet();
+            for (Iterator<Entry<String, InputStream>> it = entries.iterator(); it.hasNext();) {
+                final Entry<String, InputStream> entry = it.next();
+                final String fileExtension = entry.getKey();
+                final InputStream in = entry.getValue();
+                File tmpFile = File.createTempFile("slingClipseTmp", fileExtension);
+                FileOutputStream fos = new FileOutputStream(tmpFile);
+                copyStream(in, fos);
+                // TODO - close in case of exceptions
+                fos.close();
+                in.close();
+                Artifact jarArtifact = new DefaultArtifact(groupId, artifactId, version, "", fileExtension, "",
+                        new DefaultArtifactHandler());
+                dai.install(tmpFile, jarArtifact, maven.getLocalRepository());
+                tmpFile.delete();
+            }
+
+            Archetype archetype = new Archetype();
+            archetype.setGroupId(groupId);
+            archetype.setArtifactId(artifactId);
+            archetype.setVersion(version);
+            org.apache.maven.archetype.Archetype archetyper = MavenPluginActivator.getDefault().getArchetype();
+            archetyper.updateLocalCatalog(archetype);
+        } catch (CoreException e) {
+            throw e;
+        } catch (RuntimeException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e));
+        }
 
 //			ArchetypeCatalog defaultLocalCatalog = archetyper.getDefaultLocalCatalog();
 //			defaultLocalCatalog.addArchetype(archetype);
 //			manager.readCatalogs();
-		} catch(Exception e) {
-			e.printStackTrace();
-		}
 
 //		try {
 //			ArtifactRepository localRepo = maven.getLocalRepository();
@@ -170,6 +175,7 @@ public class EmbeddedArchetypeInstaller 
 
 	}
 
+    // TODO - replace with commons-io
 	private void copyStream(InputStream in, OutputStream os) throws IOException {
 		final byte[] bytes = new byte[4*1024];
 		while (true) {

Modified: sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/Activator.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/Activator.java?rev=1527508&r1=1527507&r2=1527508&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/Activator.java (original)
+++ sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/Activator.java Mon Sep 30 10:28:08 2013
@@ -1,13 +1,20 @@
 package org.apache.sling.ide.eclipse.m2e.internal;
 
+import org.apache.sling.ide.artifacts.EmbeddedArtifactLocator;
+import org.apache.sling.ide.eclipse.core.ServiceUtil;
+import org.apache.sling.ide.osgi.OsgiClientFactory;
 import org.eclipse.core.runtime.Plugin;
 import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
 
 public class Activator extends Plugin {
 
     public static final String PLUGIN_ID = "org.apache.sling.ide.eclipse-m2e-ui";
     public static Activator INSTANCE;
 
+    private ServiceTracker<EmbeddedArtifactLocator, EmbeddedArtifactLocator> artifactLocator;
+    private ServiceTracker<OsgiClientFactory, OsgiClientFactory> osgiClientFactory;
+
     public static Activator getDefault() {
         return INSTANCE;
     }
@@ -17,12 +24,31 @@ public class Activator extends Plugin {
         super.start(context);
 
         INSTANCE = this;
+
+        artifactLocator = new ServiceTracker<EmbeddedArtifactLocator, EmbeddedArtifactLocator>(context, EmbeddedArtifactLocator.class, null);
+        artifactLocator.open();
+
+        osgiClientFactory = new ServiceTracker<OsgiClientFactory, OsgiClientFactory>(context, OsgiClientFactory.class,
+                null);
+        osgiClientFactory.open();
     }
 
     @Override
     public void stop(BundleContext context) throws Exception {
         INSTANCE = null;
 
+        artifactLocator.close();
+
         super.stop(context);
     }
+
+    public EmbeddedArtifactLocator getArtifactsLocator() {
+
+        return ServiceUtil.getNotNull(artifactLocator);
+    }
+
+    public OsgiClientFactory getOsgiClientFactory() {
+
+        return ServiceUtil.getNotNull(osgiClientFactory);
+    }
 }