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 2017/05/09 10:46:54 UTC

svn commit: r1794532 - in /sling/trunk/tooling/ide: eclipse-core/ eclipse-core/src/org/apache/sling/ide/eclipse/core/ eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/ eclipse-m2e-test/src/org/apache/sling/ide/eclipse/m2e/ eclipse-m2e-ui/ ec...

Author: rombert
Date: Tue May  9 10:46:53 2017
New Revision: 1794532

URL: http://svn.apache.org/viewvc?rev=1794532&view=rev
Log:
SLING-6830 - Provide a custom navigator for provisioning model feature files

The custom contribution is only enabled for Maven projects. There are no UI
additions for this feature (yet) as I think this will only be used with Maven.

Added:
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/BaseFacetInstallDelegate.java
      - copied, changed from r1794531, sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingBundleFacetInstallDelegate.java
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/EmptyDelegate.java
      - copied, changed from r1794531, sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingBundleFacetUninstallDelegate.java
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadFacetInstallDelegate.java
      - copied, changed from r1794531, sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/FileVaultMetaInfRootFolder.java
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadFacetUninstallDelegate.java
      - copied, changed from r1794531, sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/FileVaultMetaInfRootFolder.java
    sling/trunk/tooling/ide/eclipse-m2e-test/src/org/apache/sling/ide/eclipse/m2e/MavenProjectUtilsTest.java
    sling/trunk/tooling/ide/eclipse-m2e-test/src/org/apache/sling/ide/eclipse/m2e/slingstart-simple-pom.xml
    sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/SlingstartProjectConfigurator.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/BaseRootFolderContentProvider.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/ProvisioningModelContentProvider.java
      - copied, changed from r1794531, sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingContentFacetUninstallDelegate.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/ProvisioningModelLabelProvider.java
      - copied, changed from r1794531, sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/FileVaultMetaInfLabelProvider.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/ProvisioningModelRootFolder.java
      - copied, changed from r1794531, sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/FileVaultMetaInfRootFolder.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/RootFolder.java
      - copied, changed from r1794531, sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/FileVaultMetaInfRootFolder.java
Modified:
    sling/trunk/tooling/ide/eclipse-core/plugin.xml
    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/ProjectUtil.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/SlingBundleFacetInstallDelegate.java
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingBundleFacetUninstallDelegate.java
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingContentFacetInstallDelegate.java
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingContentFacetUninstallDelegate.java
    sling/trunk/tooling/ide/eclipse-m2e-ui/lifecycle-mapping-metadata.xml
    sling/trunk/tooling/ide/eclipse-m2e-ui/plugin.xml
    sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/MavenProjectUtils.java
    sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/ProjectUtilTest.java
    sling/trunk/tooling/ide/eclipse-ui/plugin.xml
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/FileVaultMetaInfContentProvider.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/FileVaultMetaInfLabelProvider.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/FileVaultMetaInfRootFolder.java

Modified: sling/trunk/tooling/ide/eclipse-core/plugin.xml
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/plugin.xml?rev=1794532&r1=1794531&r2=1794532&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-core/plugin.xml (original)
+++ sling/trunk/tooling/ide/eclipse-core/plugin.xml Tue May  9 10:46:53 2017
@@ -87,6 +87,21 @@
   		<action facet="sling.bundle" version="1.0" type="UNINSTALL">
   			<delegate class="org.apache.sling.ide.eclipse.core.internal.SlingBundleFacetUninstallDelegate"/>
   		</action>
+  		
+		<project-facet id="sling.launchpad">
+			<label>Launchpad module</label>
+			<description>Packaging module which contains a provisioning model which can be assembled into a launchpad.</description>
+		</project-facet>
+		
+  		<project-facet-version facet="sling.launchpad" version="1.0"/>
+  		
+  		<action facet="sling.launchpad" version="1.0" type="INSTALL">
+  			<delegate class="org.apache.sling.ide.eclipse.core.internal.SlingLaunchpadFacetInstallDelegate"/>
+  		</action>
+
+  		<action facet="sling.launchpad" version="1.0" type="UNINSTALL">
+  			<delegate class="org.apache.sling.ide.eclipse.core.internal.SlingLaunchpadFacetUninstallDelegate"/>
+  		</action>
 	</extension>  
 
 	<!-- Define the Sling launchpad runtime type -->

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=1794532&r1=1794531&r2=1794532&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 Tue May  9 10:46:53 2017
@@ -55,4 +55,17 @@ public class ConfigurationHelper {
 		aBundleProject.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
 	}
 
+	public static void convertToLaunchpadProject(IProject project, IPath modelsDirectoryPath) throws CoreException {
+
+		IProjectFacet facet = ProjectFacetsManager.getProjectFacet("sling.launchpad");
+		IFacetedProject fp2 = ProjectFacetsManager.create(project, true, null);
+		fp2.installProjectFacet(facet.getLatestVersion(), null, null);
+		project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
+		
+		if ( modelsDirectoryPath != null ) {
+			ProjectUtil.setProvisioningModelPath(project, modelsDirectoryPath);
+		}
+		
+
+	}
 }

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=1794532&r1=1794531&r2=1794532&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 Tue May  9 10:46:53 2017
@@ -43,6 +43,8 @@ import org.osgi.service.prefs.BackingSto
 public abstract class ProjectUtil {
 
     private static final String PROPERTY_SYNC_ROOT = Activator.PLUGIN_ID + ".content_sync_root";
+    private static final String PROPERTY_PROVISIONING_MODEL_DIR = Activator.PLUGIN_ID + ".provisioning_model_dir";
+    
     private static final String PROPERTY_SYNC_ROOT_DEFAULT_VALUE = "jcr_root";
     
     private static final QualifiedName PROPERTY_SYNC_ROOT_OLD = new QualifiedName(Activator.PLUGIN_ID, "sync_root");
@@ -149,17 +151,49 @@ public abstract class ProjectUtil {
      */
     public static void setSyncDirectoryPath(IProject project, IPath path) {
         
-        IScopeContext projectScope = new ProjectScope(project);
+        setPathPersistentProperty(project, path, PROPERTY_SYNC_ROOT);
+    }
+
+	private static void setPathPersistentProperty(IProject project, IPath path, String propertyName) {
+		
+		IScopeContext projectScope = new ProjectScope(project);
         IEclipsePreferences projectNode = projectScope.getNode(Activator.PLUGIN_ID);
         if ( projectNode != null ) {
-            projectNode.put(PROPERTY_SYNC_ROOT, path.toPortableString());
+            projectNode.put(propertyName, path.toPortableString());
             try {
                 projectNode.flush();
             } catch (BackingStoreException e) {
                 Activator.getDefault().getPluginLogger().error(e.getMessage(), e);
             }
         }
-    }
+	}
+
+	public static IPath getProvisioningModelPath(IProject project) {
+		
+		if ( project == null || !project.isOpen() || !ProjectHelper.isLaunchpadProject(project)) {
+			return null;
+		}
+		
+        IScopeContext projectScope = new ProjectScope(project);
+        IEclipsePreferences projectNode = projectScope.getNode(Activator.PLUGIN_ID);
+        if ( projectNode == null ) {
+        	return null;
+        }
+        
+        String propertyValue = projectNode.get(PROPERTY_PROVISIONING_MODEL_DIR, null);
+        if ( propertyValue == null ) {
+        	return null;
+        }
+		
+		return Path.fromPortableString(propertyValue);
+	}
+	
+	public static void setProvisioningModelPath(IProject project, IPath modelPath) {
+		
+		setPathPersistentProperty(project, modelPath, PROPERTY_PROVISIONING_MODEL_DIR);
+		
+	}
+	
     
     /**
      * Loads a filter for the specified project

Copied: sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/BaseFacetInstallDelegate.java (from r1794531, sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingBundleFacetInstallDelegate.java)
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/BaseFacetInstallDelegate.java?p2=sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/BaseFacetInstallDelegate.java&p1=sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingBundleFacetInstallDelegate.java&r1=1794531&r2=1794532&rev=1794532&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingBundleFacetInstallDelegate.java (original)
+++ sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/BaseFacetInstallDelegate.java Tue May  9 10:46:53 2017
@@ -23,17 +23,31 @@ import org.eclipse.core.runtime.IProgres
 import org.eclipse.wst.common.project.facet.core.IDelegate;
 import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
 
-public class SlingBundleFacetInstallDelegate implements IDelegate {
-
-    @Override
-    public void execute(IProject project, IProjectFacetVersion facetVersion, Object config, IProgressMonitor monitor)
-            throws CoreException {
-
+/**
+ * Support class for facet installations
+ * 
+ * <p>By default, the <tt>enableValidationBuilderAndCommand</tt> is set to true</p>
+ *
+ */
+class BaseFacetInstallDelegate implements IDelegate {
+	
+	private boolean enableValidationBuilderAndCommand = true;
+	
+	public void setEnableValidationBuilderAndCommand(boolean enableValidationBuilderAndCommand) {
+		this.enableValidationBuilderAndCommand = enableValidationBuilderAndCommand;
+	}
+
+	@Override
+	public void execute(IProject project, IProjectFacetVersion facetVersion, Object config, IProgressMonitor monitor)
+			throws CoreException {
+		
         Logger pluginLogger = Activator.getDefault().getPluginLogger();
 
         pluginLogger.trace("Installing facet {0} on project {1}", facetVersion, project);
 
-        new ProjectDescriptionManager(pluginLogger).enableValidationBuilderAndCommand(project, monitor);
-    }
+        if ( enableValidationBuilderAndCommand ) {
+        	new ProjectDescriptionManager(pluginLogger).enableValidationBuilderAndCommand(project, monitor);
+        }
+	}
 
 }

Copied: sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/EmptyDelegate.java (from r1794531, sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingBundleFacetUninstallDelegate.java)
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/EmptyDelegate.java?p2=sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/EmptyDelegate.java&p1=sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingBundleFacetUninstallDelegate.java&r1=1794531&r2=1794532&rev=1794532&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingBundleFacetUninstallDelegate.java (original)
+++ sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/EmptyDelegate.java Tue May  9 10:46:53 2017
@@ -22,12 +22,11 @@ import org.eclipse.core.runtime.IProgres
 import org.eclipse.wst.common.project.facet.core.IDelegate;
 import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
 
-public class SlingBundleFacetUninstallDelegate implements IDelegate {
+class EmptyDelegate implements IDelegate {
 
-    @Override
-    public void execute(IProject arg0, IProjectFacetVersion arg1, Object arg2, IProgressMonitor arg3)
-            throws CoreException {
-
-    }
+	@Override
+	public void execute(IProject arg0, IProjectFacetVersion arg1, Object arg2, IProgressMonitor arg3)
+			throws CoreException {
 
+	}
 }

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=1794532&r1=1794531&r2=1794532&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 Tue May  9 10:46:53 2017
@@ -140,6 +140,10 @@ public class ProjectHelper {
 		return FacetHelper.containsFacet(project, SlingContentModuleFactory.SLING_CONTENT_FACET_ID);
 	}
 
+	public static boolean isLaunchpadProject(IProject project) {
+		return FacetHelper.containsFacet(project, "sling.launchpad");
+	}
+
 	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/SlingBundleFacetInstallDelegate.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingBundleFacetInstallDelegate.java?rev=1794532&r1=1794531&r2=1794532&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingBundleFacetInstallDelegate.java (original)
+++ sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingBundleFacetInstallDelegate.java Tue May  9 10:46:53 2017
@@ -16,24 +16,9 @@
  */
 package org.apache.sling.ide.eclipse.core.internal;
 
-import org.apache.sling.ide.log.Logger;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.wst.common.project.facet.core.IDelegate;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-public class SlingBundleFacetInstallDelegate implements IDelegate {
-
-    @Override
-    public void execute(IProject project, IProjectFacetVersion facetVersion, Object config, IProgressMonitor monitor)
-            throws CoreException {
-
-        Logger pluginLogger = Activator.getDefault().getPluginLogger();
-
-        pluginLogger.trace("Installing facet {0} on project {1}", facetVersion, project);
-
-        new ProjectDescriptionManager(pluginLogger).enableValidationBuilderAndCommand(project, monitor);
-    }
+public class SlingBundleFacetInstallDelegate extends BaseFacetInstallDelegate {
 
+	public SlingBundleFacetInstallDelegate() {
+		setEnableValidationBuilderAndCommand(true);
+	}
 }

Modified: sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingBundleFacetUninstallDelegate.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingBundleFacetUninstallDelegate.java?rev=1794532&r1=1794531&r2=1794532&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingBundleFacetUninstallDelegate.java (original)
+++ sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingBundleFacetUninstallDelegate.java Tue May  9 10:46:53 2017
@@ -16,18 +16,6 @@
  */
 package org.apache.sling.ide.eclipse.core.internal;
 
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.wst.common.project.facet.core.IDelegate;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-public class SlingBundleFacetUninstallDelegate implements IDelegate {
-
-    @Override
-    public void execute(IProject arg0, IProjectFacetVersion arg1, Object arg2, IProgressMonitor arg3)
-            throws CoreException {
-
-    }
+public class SlingBundleFacetUninstallDelegate extends EmptyDelegate {
 
 }

Modified: sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingContentFacetInstallDelegate.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingContentFacetInstallDelegate.java?rev=1794532&r1=1794531&r2=1794532&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingContentFacetInstallDelegate.java (original)
+++ sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingContentFacetInstallDelegate.java Tue May  9 10:46:53 2017
@@ -16,24 +16,6 @@
  */
 package org.apache.sling.ide.eclipse.core.internal;
 
-import org.apache.sling.ide.log.Logger;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.wst.common.project.facet.core.IDelegate;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-public class SlingContentFacetInstallDelegate implements IDelegate {
-
-    @Override
-    public void execute(IProject project, IProjectFacetVersion facetVersion, Object config, IProgressMonitor monitor)
-            throws CoreException {
-
-        Logger pluginLogger = Activator.getDefault().getPluginLogger();
-
-        pluginLogger.trace("Installing facet {0} on project {1}", facetVersion, project);
-
-        new ProjectDescriptionManager(pluginLogger).enableValidationBuilderAndCommand(project, monitor);
-    }
+public class SlingContentFacetInstallDelegate extends BaseFacetInstallDelegate {
 
 }

Modified: sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingContentFacetUninstallDelegate.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingContentFacetUninstallDelegate.java?rev=1794532&r1=1794531&r2=1794532&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingContentFacetUninstallDelegate.java (original)
+++ sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingContentFacetUninstallDelegate.java Tue May  9 10:46:53 2017
@@ -16,17 +16,6 @@
  */
 package org.apache.sling.ide.eclipse.core.internal;
 
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.wst.common.project.facet.core.IDelegate;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-public class SlingContentFacetUninstallDelegate implements IDelegate {
-
-    @Override
-    public void execute(IProject arg0, IProjectFacetVersion arg1, Object arg2, IProgressMonitor arg3)
-            throws CoreException {
-    }
+public class SlingContentFacetUninstallDelegate extends EmptyDelegate {
 
 }

Copied: sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadFacetInstallDelegate.java (from r1794531, sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/FileVaultMetaInfRootFolder.java)
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadFacetInstallDelegate.java?p2=sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadFacetInstallDelegate.java&p1=sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/FileVaultMetaInfRootFolder.java&r1=1794531&r2=1794532&rev=1794532&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/FileVaultMetaInfRootFolder.java (original)
+++ sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadFacetInstallDelegate.java Tue May  9 10:46:53 2017
@@ -14,24 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sling.ide.eclipse.ui.nav.model;
+package org.apache.sling.ide.eclipse.core.internal;
 
-import org.eclipse.core.resources.IFolder;
+public class SlingLaunchpadFacetInstallDelegate extends BaseFacetInstallDelegate {
 
-public class FileVaultMetaInfRootFolder {
-
-    private final IFolder folder;
-
-    public FileVaultMetaInfRootFolder(IFolder folder) {
-        this.folder = folder;
-    }
-
-    @Override
-    public String toString() {
-        return folder.getProjectRelativePath().toString();
-    }
-
-    public IFolder getFolder() {
-        return folder;
-    }
+	public SlingLaunchpadFacetInstallDelegate() {
+		setEnableValidationBuilderAndCommand(false);
+	}
 }

Copied: sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadFacetUninstallDelegate.java (from r1794531, sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/FileVaultMetaInfRootFolder.java)
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadFacetUninstallDelegate.java?p2=sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadFacetUninstallDelegate.java&p1=sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/FileVaultMetaInfRootFolder.java&r1=1794531&r2=1794532&rev=1794532&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/FileVaultMetaInfRootFolder.java (original)
+++ sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadFacetUninstallDelegate.java Tue May  9 10:46:53 2017
@@ -14,24 +14,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sling.ide.eclipse.ui.nav.model;
+package org.apache.sling.ide.eclipse.core.internal;
 
-import org.eclipse.core.resources.IFolder;
+public class SlingLaunchpadFacetUninstallDelegate extends EmptyDelegate {
 
-public class FileVaultMetaInfRootFolder {
-
-    private final IFolder folder;
-
-    public FileVaultMetaInfRootFolder(IFolder folder) {
-        this.folder = folder;
-    }
-
-    @Override
-    public String toString() {
-        return folder.getProjectRelativePath().toString();
-    }
-
-    public IFolder getFolder() {
-        return folder;
-    }
 }

Added: sling/trunk/tooling/ide/eclipse-m2e-test/src/org/apache/sling/ide/eclipse/m2e/MavenProjectUtilsTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-m2e-test/src/org/apache/sling/ide/eclipse/m2e/MavenProjectUtilsTest.java?rev=1794532&view=auto
==============================================================================
--- sling/trunk/tooling/ide/eclipse-m2e-test/src/org/apache/sling/ide/eclipse/m2e/MavenProjectUtilsTest.java (added)
+++ sling/trunk/tooling/ide/eclipse-m2e-test/src/org/apache/sling/ide/eclipse/m2e/MavenProjectUtilsTest.java Tue May  9 10:46:53 2017
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.ide.eclipse.m2e;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.sling.ide.eclipse.core.ProjectUtil;
+import org.apache.sling.ide.eclipse.m2e.impl.helpers.MavenProjectAdapter;
+import org.apache.sling.ide.test.impl.helpers.Poller;
+import org.apache.sling.ide.test.impl.helpers.TemporaryProject;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class MavenProjectUtilsTest {
+
+    @Rule
+    public TemporaryProject projectRule = new TemporaryProject();
+	
+	@Test
+	public void inferDefaultProvisioningModelDirectories() throws Exception {
+
+		IPath modelsDir = Path.fromPortableString("src/main/provisioning");
+		
+		// create project
+        final IProject launchpadProject = projectRule.getProject();
+
+        MavenProjectAdapter project = new MavenProjectAdapter(launchpadProject);
+        project.createOrUpdateFile(Path.fromPortableString("pom.xml"), getClass().getResourceAsStream("slingstart-simple-pom.xml"));
+		project.ensureDirectoryExists(modelsDir);
+        project.convertToMavenProject();
+
+        // conversion should enable the slingstart configurator and set the provisioning model path
+        new Poller(TimeUnit.MINUTES.toMillis(1)).pollUntil(new Callable<IPath>() {
+			@Override
+			public IPath call() throws Exception {
+				return ProjectUtil.getProvisioningModelPath(launchpadProject);
+			}
+		}, equalTo(modelsDir));
+        
+	}
+}

Added: sling/trunk/tooling/ide/eclipse-m2e-test/src/org/apache/sling/ide/eclipse/m2e/slingstart-simple-pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-m2e-test/src/org/apache/sling/ide/eclipse/m2e/slingstart-simple-pom.xml?rev=1794532&view=auto
==============================================================================
--- sling/trunk/tooling/ide/eclipse-m2e-test/src/org/apache/sling/ide/eclipse/m2e/slingstart-simple-pom.xml (added)
+++ sling/trunk/tooling/ide/eclipse-m2e-test/src/org/apache/sling/ide/eclipse/m2e/slingstart-simple-pom.xml Tue May  9 10:46:53 2017
@@ -0,0 +1,29 @@
+<!--
+    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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.apache.sling.ide.testing</groupId>
+    <artifactId>simple-launchpad</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <packaging>slingstart</packaging>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.sling</groupId>
+                <artifactId>slingstart-maven-plugin</artifactId>
+                <version>1.7.0</version>
+                <extensions>true</extensions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file

Modified: sling/trunk/tooling/ide/eclipse-m2e-ui/lifecycle-mapping-metadata.xml
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-m2e-ui/lifecycle-mapping-metadata.xml?rev=1794532&r1=1794531&r2=1794532&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-m2e-ui/lifecycle-mapping-metadata.xml (original)
+++ sling/trunk/tooling/ide/eclipse-m2e-ui/lifecycle-mapping-metadata.xml Tue May  9 10:46:53 2017
@@ -88,5 +88,20 @@
                 </ignore>
             </action>
         </pluginExecution>
+        <pluginExecution>
+            <pluginExecutionFilter>
+                <groupId>org.apache.sling</groupId>
+                <artifactId>slingstart-maven-plugin</artifactId>
+                <versionRange>[1.0.0,)</versionRange>
+                <goals>
+                    <goal>package</goal>
+                </goals>
+            </pluginExecutionFilter>
+            <action>
+                <configurator>
+                    <id>org.apache.sling.ide.eclipse.m2e.slingstartConfigurator</id>
+                </configurator>
+            </action>
+        </pluginExecution>
     </pluginExecutions>
 </lifecycleMappingMetadata>
\ No newline at end of file

Modified: sling/trunk/tooling/ide/eclipse-m2e-ui/plugin.xml
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-m2e-ui/plugin.xml?rev=1794532&r1=1794531&r2=1794532&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-m2e-ui/plugin.xml (original)
+++ sling/trunk/tooling/ide/eclipse-m2e-ui/plugin.xml Tue May  9 10:46:53 2017
@@ -65,6 +65,10 @@
                 id="org.apache.sling.ide.eclipse.m2e.configurator"
                 class="org.apache.sling.ide.eclipse.m2e.internal.ContentPackageProjectConfigurator"
                 name="Sling Content Package Configurator" />
+        <configurator 
+                id="org.apache.sling.ide.eclipse.m2e.slingstartConfigurator"
+                class="org.apache.sling.ide.eclipse.m2e.internal.SlingstartProjectConfigurator"
+                name="Sling Launchpad Configurator" />
     </extension>
     
     <!-- generic error marker (not bound to any quick fixes) for errors in any project configurators -->

Modified: sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/MavenProjectUtils.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/MavenProjectUtils.java?rev=1794532&r1=1794531&r2=1794532&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/MavenProjectUtils.java (original)
+++ sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/MavenProjectUtils.java Tue May  9 10:46:53 2017
@@ -16,12 +16,18 @@
  */
 package org.apache.sling.ide.eclipse.m2e.internal;
 
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.apache.maven.model.Dependency;
+import org.apache.maven.model.Plugin;
 import org.apache.maven.model.Resource;
 import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.util.xml.Xpp3Dom;
 
 public class MavenProjectUtils {
 
@@ -54,6 +60,36 @@ public class MavenProjectUtils {
         return DEFAULT_SERVLET_API_VERSION;
     }
     
+    /**
+     * Returns a set of candidate locations for the project's model directory
+     * 
+     * <p>The heuristics are based on the logic from <tt>org.apache.sling.maven.slingstart.ModelPreprocessor</tt>.
+     * The returned values may or may not exist on the filesystem, it is up to the client to check that.
+     * The values are ordered from the most likely to the least likely, so clients should iterate
+     * the returned candidates in order and pick the first one that exists.</p>
+     * 
+     * @param mavenProject the project, must not be null
+     * @return an ordered set of candidates, never empty
+     */
+    public static Set<String> getModelDirectoryCandidateLocations(MavenProject mavenProject) {
+    	
+    	List<String> candidates = new ArrayList<>();
+    	candidates.add("src/main/provisioning");
+    	candidates.add("src/test/provisioning");
+    	
+    	Plugin slingstartPlugin = mavenProject.getPlugin("org.apache.sling:slingstart-maven-plugin");
+    	if ( slingstartPlugin != null && slingstartPlugin.getConfiguration() instanceof Xpp3Dom ) {
+			Xpp3Dom config = (Xpp3Dom) slingstartPlugin.getConfiguration();
+			Xpp3Dom modelDir = config.getChild("modelDirectory");
+			if ( modelDir != null ) {
+				 candidates.add(0, modelDir.getValue());
+			}    		
+    	}
+    	
+    	return new LinkedHashSet<>(candidates);
+    	
+    }
+    
     private MavenProjectUtils() {
         
     }

Added: sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/SlingstartProjectConfigurator.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/SlingstartProjectConfigurator.java?rev=1794532&view=auto
==============================================================================
--- sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/SlingstartProjectConfigurator.java (added)
+++ sling/trunk/tooling/ide/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/SlingstartProjectConfigurator.java Tue May  9 10:46:53 2017
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.ide.eclipse.m2e.internal;
+
+import java.util.Set;
+
+import org.apache.sling.ide.eclipse.core.ConfigurationHelper;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.m2e.core.project.configurator.ProjectConfigurationRequest;
+
+public class SlingstartProjectConfigurator extends AbstractProjectConfigurator {
+
+	@Override
+	public void configure(ProjectConfigurationRequest request, IProgressMonitor monitor) throws CoreException {
+		
+		IProject project = request.getProject();
+		Set<String> candidates = MavenProjectUtils.getModelDirectoryCandidateLocations(request.getMavenProject());
+		IPath modelsPath = null; 
+		
+		for ( String candidate : candidates ) {
+			IPath candidatePath = Path.fromPortableString(candidate);
+			IFolder modelsFolder = project.getFolder(candidatePath);
+			if ( modelsFolder.exists() ) {
+				modelsPath = candidatePath;
+				break;
+			}
+		}
+		
+		trace("Configuring project {0} with models path {1}", project.getName(), modelsPath);
+		
+		ConfigurationHelper.convertToLaunchpadProject(request.getProject(), modelsPath);
+	}
+}

Modified: sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/ProjectUtilTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/ProjectUtilTest.java?rev=1794532&r1=1794531&r2=1794532&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/ProjectUtilTest.java (original)
+++ sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/ProjectUtilTest.java Tue May  9 10:46:53 2017
@@ -58,7 +58,6 @@ public class ProjectUtilTest {
         project.createVltFilterWithRoots();
         // create content sync dir
         project.ensureDirectoryExists(Path.fromPortableString("jcr_root"));
-
     }
     
     @Test
@@ -115,4 +114,32 @@ public class ProjectUtilTest {
         assertThat("sync_root not obeyed after old store for property was deleted", 
                 ProjectUtil.getSyncDirectory(contentProject).getProjectRelativePath(), equalTo(contentSyncPath));
     }
+    
+    @Test
+    public void noModelsDirectory() throws Exception {
+    	
+    	assertThat("provisioning model path", ProjectUtil.getProvisioningModelPath(contentProject), nullValue());
+    }
+
+    @Test
+    public void existingModelsDirectoryWithoutLaunchpadNature() throws Exception {
+
+    	IPath modelPath = Path.fromPortableString("src/main/provisioning");
+		project.ensureDirectoryExists(modelPath);
+    	ProjectUtil.setProvisioningModelPath(contentProject, modelPath);
+    	
+    	assertThat("provisioning model path", ProjectUtil.getProvisioningModelPath(contentProject), nullValue());
+    }
+
+    @Test
+    public void existingModelsDirectoryWithLaunchpadNature() throws Exception {
+    	
+    	project.installFacet("sling.launchpad", "1.0");
+    	
+    	IPath modelPath = Path.fromPortableString("src/main/provisioning");
+    	project.ensureDirectoryExists(modelPath);
+    	ProjectUtil.setProvisioningModelPath(contentProject, modelPath);
+    	
+    	assertThat("provisioning model path", ProjectUtil.getProvisioningModelPath(contentProject), equalTo(modelPath));
+    }
 }

Modified: sling/trunk/tooling/ide/eclipse-ui/plugin.xml
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/plugin.xml?rev=1794532&r1=1794531&r2=1794532&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/plugin.xml (original)
+++ sling/trunk/tooling/ide/eclipse-ui/plugin.xml Tue May  9 10:46:53 2017
@@ -230,6 +230,7 @@
 				<contentExtension pattern="org.apache.sling.ide.eclipse-ui.javaEEFilter" />
 				<contentExtension pattern="org.apache.sling.ide.eclipse-ui.navigatorJcrContent" />
 				<contentExtension pattern="org.apache.sling.ide.eclipse-ui.navigatorVaultMetaInf" />
+				<contentExtension pattern="org.apache.sling.ide.eclipse-ui.navigatorProvisioningModel" />
 				<contentExtension pattern="org.apache.sling.ide.eclipse-ui.linkHelper"/>	
 			</includes>
 		</viewerContentBinding>
@@ -350,7 +351,38 @@
              </and>
           </possibleChildren>
       </navigatorContent>
-   </extension>
+  	  <!-- content provider for provisioning model -->
+      <navigatorContent id="org.apache.sling.ide.eclipse-ui.navigatorProvisioningModel" 
+           name="Provisioning Model"
+           appearsBefore="org.eclipse.jst.jee.ui.ejb"
+           contentProvider="org.apache.sling.ide.eclipse.ui.nav.ProvisioningModelContentProvider"
+           labelProvider="org.apache.sling.ide.eclipse.ui.nav.ProvisioningModelLabelProvider"
+           icon="icons/obj16/sling_misc.gif">
+          <triggerPoints>
+              <and>
+                  <!-- only trigger for Sling Launchpad Projects -->
+                  <adapt type="org.eclipse.core.resources.IResource">
+                      <test property="org.eclipse.wst.common.project.facet.core.projectFacet" value="sling.launchpad"/>
+                  </adapt>
+                  <or>
+                      <!-- and either IProject or ProvisioningModelRootFolder -->
+                      <instanceof value="org.eclipse.core.resources.IProject" />
+                      <instanceof value="org.apache.sling.ide.eclipse.ui.nav.model.ProvisioningModelRootFolder" />
+                  </or>
+              </and>
+          </triggerPoints>
+          <possibleChildren>
+              <and>
+                  <!-- only trigger for Sling Launchpad Projects -->
+                  <adapt type="org.eclipse.core.resources.IResource">
+                      <test property="org.eclipse.wst.common.project.facet.core.projectFacet" value="sling.launchpad"/>
+                  </adapt>         
+	              <instanceof 
+	                     value="org.eclipse.core.resources.IResource" /> 
+             </and>
+          </possibleChildren>
+      </navigatorContent>
+   </extension>   
    <extension
          point="org.eclipse.core.runtime.adapters">
       <factory
@@ -407,6 +439,9 @@
               	<test
 	    			property="org.eclipse.wst.common.project.facet.core.projectFacet" 
     				value="sling.bundle"/>
+              	<test
+	    			property="org.eclipse.wst.common.project.facet.core.projectFacet" 
+    				value="sling.launchpad"/>
     		  </or>
 			</not>               
          </definition>

Added: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/BaseRootFolderContentProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/BaseRootFolderContentProvider.java?rev=1794532&view=auto
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/BaseRootFolderContentProvider.java (added)
+++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/BaseRootFolderContentProvider.java Tue May  9 10:46:53 2017
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.ide.eclipse.ui.nav;
+
+import org.apache.sling.ide.eclipse.ui.internal.Activator;
+import org.apache.sling.ide.eclipse.ui.nav.model.RootFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+public abstract class BaseRootFolderContentProvider<T extends RootFolder> implements ITreeContentProvider {
+	
+	protected static final Object[] NO_CHILDREN = new Object[0];
+	private final Class<T> klazz;
+	
+	public BaseRootFolderContentProvider(Class<T> klazz) {
+		this.klazz = klazz;
+	}
+
+    @Override
+    public boolean hasChildren(Object parentElement) {
+        // the getChildren is not expensive, therefore we leverage that here
+        return getChildren(parentElement) != null;
+    }
+    
+    @Override
+    public Object[] getChildren(Object parentElement) {
+    	if ( parentElement == null ) {
+    		return NO_CHILDREN;
+    	}
+    	
+        // expose the contribution directly below the project
+        if (parentElement instanceof IProject) {
+            IProject project = (IProject) parentElement;
+            RootFolder folder = findRootFolder(project);
+            if (folder != null) {
+            	return new Object[] { folder };
+            }
+        } else if (klazz.isAssignableFrom(parentElement.getClass())) {
+        	RootFolder rootFolder = (RootFolder) parentElement;
+            try {
+                return rootFolder.members();
+            } catch (CoreException e) {
+                Activator.getDefault().getPluginLogger().error(
+                        "Could not list members of  " + rootFolder, e);
+            }
+        }
+        return NO_CHILDREN;
+    }
+    
+    @Override
+    public Object getParent(Object element) {
+        if (element instanceof IResource) {
+            IResource resource = (IResource) element;
+            RootFolder rootFolder = findRootFolder(resource.getProject());
+            if (rootFolder != null) {
+                return rootFolder.findMember(resource.getFullPath());
+            }
+        }
+        return null;
+    }
+    
+
+	@Override
+	public void dispose() {
+
+	}
+
+	@Override
+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+
+	}
+
+	@Override
+	public Object[] getElements(Object inputElement) {
+		return null;
+	}
+    
+    protected abstract T findRootFolder(IProject project);
+}

Modified: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/FileVaultMetaInfContentProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/FileVaultMetaInfContentProvider.java?rev=1794532&r1=1794531&r2=1794532&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/FileVaultMetaInfContentProvider.java (original)
+++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/FileVaultMetaInfContentProvider.java Tue May  9 10:46:53 2017
@@ -18,22 +18,21 @@ package org.apache.sling.ide.eclipse.ui.
 
 import org.apache.sling.ide.eclipse.core.ProjectUtil;
 import org.apache.sling.ide.eclipse.core.internal.ProjectHelper;
-import org.apache.sling.ide.eclipse.ui.internal.Activator;
 import org.apache.sling.ide.eclipse.ui.nav.model.FileVaultMetaInfRootFolder;
 import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
 
-public class FileVaultMetaInfContentProvider implements ITreeContentProvider {
+public class FileVaultMetaInfContentProvider extends BaseRootFolderContentProvider<FileVaultMetaInfRootFolder> {
 
-    private static final String FILEVAULT_METAINF_PATH = "META-INF/vault";
-    private static final Object[] NO_CHILDREN = new Object[0];
+	private static final String FILEVAULT_METAINF_PATH = "META-INF/vault";
+	
+    public FileVaultMetaInfContentProvider() {
+		super(FileVaultMetaInfRootFolder.class);
+	}
 
-    private FileVaultMetaInfRootFolder getFileVaultMetaInfFolder(IProject project) {
+    @Override
+    protected FileVaultMetaInfRootFolder findRootFolder(IProject project) {
         if (ProjectHelper.isContentProject(project)) {
             IFolder syncDir = ProjectUtil.getSyncDirectory(project);
             if (syncDir != null) {
@@ -43,62 +42,6 @@ public class FileVaultMetaInfContentProv
                 }
             }
         }
-        return null;
-    }
-
-    @Override
-    public void dispose() {
-    }
-
-    @Override
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+        return null;    	
     }
-
-    @Override
-    public Object[] getElements(Object inputElement) {
-        return null;
-    }
-
-    @Override
-    public Object[] getChildren(Object parentElement) {
-        final Object[] children;
-        // expose the filevault meta-inf directly below the project
-        if (parentElement instanceof IProject) {
-            IProject project = (IProject) parentElement;
-            FileVaultMetaInfRootFolder folder = getFileVaultMetaInfFolder(project);
-            if (folder != null) {
-                children = new Object[1];
-                children[0] = folder;
-                return children;
-            }
-        } else if (parentElement instanceof FileVaultMetaInfRootFolder) {
-            FileVaultMetaInfRootFolder fileVaultMetaInfRootFolder = (FileVaultMetaInfRootFolder) parentElement;
-            try {
-                return fileVaultMetaInfRootFolder.getFolder().members();
-            } catch (CoreException e) {
-                Activator.getDefault().getPluginLogger().error(
-                        "Could not list members of folder " + fileVaultMetaInfRootFolder.getFolder().getName(), e);
-            }
-        }
-        return NO_CHILDREN;
-    }
-
-    @Override
-    public Object getParent(Object element) {
-        if (element instanceof IResource) {
-            IResource resource = (IResource) element;
-            FileVaultMetaInfRootFolder fileVaultMetaInfoFolder = getFileVaultMetaInfFolder(resource.getProject());
-            if (fileVaultMetaInfoFolder != null) {
-                return fileVaultMetaInfoFolder.getFolder().findMember(resource.getFullPath()) != null;
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public boolean hasChildren(Object parentElement) {
-        // the getChildren is not expensive, therefore we leverage that here
-        return getChildren(parentElement) != null;
-    }
-
 }

Modified: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/FileVaultMetaInfLabelProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/FileVaultMetaInfLabelProvider.java?rev=1794532&r1=1794531&r2=1794532&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/FileVaultMetaInfLabelProvider.java (original)
+++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/FileVaultMetaInfLabelProvider.java Tue May  9 10:46:53 2017
@@ -68,7 +68,7 @@ public class FileVaultMetaInfLabelProvid
     public String getText(Object element) {
         if (element instanceof FileVaultMetaInfRootFolder) {
             FileVaultMetaInfRootFolder fileVaultMetaInfRootFolder = (FileVaultMetaInfRootFolder) element;
-            return fileVaultMetaInfRootFolder.getFolder().getProjectRelativePath().toPortableString();
+            return fileVaultMetaInfRootFolder.getProjectRelativePath().toPortableString();
         }
         return null;
     }

Copied: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/ProvisioningModelContentProvider.java (from r1794531, sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingContentFacetUninstallDelegate.java)
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/ProvisioningModelContentProvider.java?p2=sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/ProvisioningModelContentProvider.java&p1=sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingContentFacetUninstallDelegate.java&r1=1794531&r2=1794532&rev=1794532&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingContentFacetUninstallDelegate.java (original)
+++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/ProvisioningModelContentProvider.java Tue May  9 10:46:53 2017
@@ -14,19 +14,30 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sling.ide.eclipse.core.internal;
+package org.apache.sling.ide.eclipse.ui.nav;
 
+import org.apache.sling.ide.eclipse.core.ProjectUtil;
+import org.apache.sling.ide.eclipse.ui.nav.model.ProvisioningModelRootFolder;
+import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.wst.common.project.facet.core.IDelegate;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.core.runtime.IPath;
 
-public class SlingContentFacetUninstallDelegate implements IDelegate {
+public class ProvisioningModelContentProvider extends BaseRootFolderContentProvider<ProvisioningModelRootFolder> {
 
+    public ProvisioningModelContentProvider() {
+    	super(ProvisioningModelRootFolder.class);
+	}
+    
     @Override
-    public void execute(IProject arg0, IProjectFacetVersion arg1, Object arg2, IProgressMonitor arg3)
-            throws CoreException {
+    protected ProvisioningModelRootFolder findRootFolder(IProject project) {
+    
+    	IPath modelDirPath = ProjectUtil.getProvisioningModelPath(project);
+    	
+    	IFolder folder = project.getFolder(modelDirPath);
+    	if ( !folder.exists() ) {
+    		return null;
+    	}
+    	
+    	return new ProvisioningModelRootFolder(folder);
     }
-
 }

Copied: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/ProvisioningModelLabelProvider.java (from r1794531, sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/FileVaultMetaInfLabelProvider.java)
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/ProvisioningModelLabelProvider.java?p2=sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/ProvisioningModelLabelProvider.java&p1=sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/FileVaultMetaInfLabelProvider.java&r1=1794531&r2=1794532&rev=1794532&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/FileVaultMetaInfLabelProvider.java (original)
+++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/ProvisioningModelLabelProvider.java Tue May  9 10:46:53 2017
@@ -16,7 +16,7 @@
  */
 package org.apache.sling.ide.eclipse.ui.nav;
 
-import org.apache.sling.ide.eclipse.ui.nav.model.FileVaultMetaInfRootFolder;
+import org.apache.sling.ide.eclipse.ui.nav.model.ProvisioningModelRootFolder;
 import org.eclipse.jface.viewers.ILabelProvider;
 import org.eclipse.jface.viewers.ILabelProviderListener;
 import org.eclipse.swt.graphics.Image;
@@ -25,17 +25,12 @@ import org.eclipse.ui.PlatformUI;
 
 /**
  * Mostly copied from org.eclipse.ui.internal.ide.dialogs.FileFolderSelectionDialog.FileLabelProvider.
- *
  */
-public class FileVaultMetaInfLabelProvider implements ILabelProvider {
+public class ProvisioningModelLabelProvider implements ILabelProvider {
 
     private static final Image IMG_FOLDER = PlatformUI.getWorkbench().getSharedImages()
             .getImage(ISharedImages.IMG_OBJ_FOLDER);
-
-    public FileVaultMetaInfLabelProvider() {
-        super();
-    }
-
+	
     @Override
     public void addListener(ILabelProviderListener listener) {
 
@@ -58,17 +53,18 @@ public class FileVaultMetaInfLabelProvid
 
     @Override
     public Image getImage(Object element) {
-        if (element instanceof FileVaultMetaInfRootFolder) {
-            return IMG_FOLDER;
-        }
-        return null;
+    	if ( element instanceof ProvisioningModelRootFolder ) {
+    		return IMG_FOLDER;
+    	}
+    	
+    	return null;
     }
 
     @Override
     public String getText(Object element) {
-        if (element instanceof FileVaultMetaInfRootFolder) {
-            FileVaultMetaInfRootFolder fileVaultMetaInfRootFolder = (FileVaultMetaInfRootFolder) element;
-            return fileVaultMetaInfRootFolder.getFolder().getProjectRelativePath().toPortableString();
+        if (element instanceof ProvisioningModelRootFolder) {
+        	ProvisioningModelRootFolder rootFolder = (ProvisioningModelRootFolder) element;
+            return rootFolder.getProjectRelativePath().toPortableString();
         }
         return null;
     }

Modified: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/FileVaultMetaInfRootFolder.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/FileVaultMetaInfRootFolder.java?rev=1794532&r1=1794531&r2=1794532&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/FileVaultMetaInfRootFolder.java (original)
+++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/FileVaultMetaInfRootFolder.java Tue May  9 10:46:53 2017
@@ -17,8 +17,11 @@
 package org.apache.sling.ide.eclipse.ui.nav.model;
 
 import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
 
-public class FileVaultMetaInfRootFolder {
+public class FileVaultMetaInfRootFolder implements RootFolder{
 
     private final IFolder folder;
 
@@ -27,11 +30,24 @@ public class FileVaultMetaInfRootFolder
     }
 
     @Override
+    public IResource[] members() throws CoreException {
+    	return folder.members();
+    }
+    
+    @Override
+    public IResource findMember(IPath path) {
+    	return folder.findMember(path);
+    }
+
+	@Override
+	public IPath getProjectRelativePath() {
+		return folder.getProjectRelativePath();
+	}
+    
+    @Override
     public String toString() {
         return folder.getProjectRelativePath().toString();
     }
 
-    public IFolder getFolder() {
-        return folder;
-    }
+    
 }

Copied: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/ProvisioningModelRootFolder.java (from r1794531, sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/FileVaultMetaInfRootFolder.java)
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/ProvisioningModelRootFolder.java?p2=sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/ProvisioningModelRootFolder.java&p1=sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/FileVaultMetaInfRootFolder.java&r1=1794531&r2=1794532&rev=1794532&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/FileVaultMetaInfRootFolder.java (original)
+++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/ProvisioningModelRootFolder.java Tue May  9 10:46:53 2017
@@ -17,12 +17,15 @@
 package org.apache.sling.ide.eclipse.ui.nav.model;
 
 import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
 
-public class FileVaultMetaInfRootFolder {
+public class ProvisioningModelRootFolder implements RootFolder {
 
     private final IFolder folder;
 
-    public FileVaultMetaInfRootFolder(IFolder folder) {
+    public ProvisioningModelRootFolder(IFolder folder) {
         this.folder = folder;
     }
 
@@ -30,8 +33,19 @@ public class FileVaultMetaInfRootFolder
     public String toString() {
         return folder.getProjectRelativePath().toString();
     }
-
-    public IFolder getFolder() {
-        return folder;
-    }
+    
+    @Override
+    public IResource findMember(IPath path) {
+    	return folder.findMember(path);
+    }    
+
+	@Override
+	public IPath getProjectRelativePath() {
+		return folder.getProjectRelativePath();
+	}
+
+	@Override
+	public IResource[] members() throws CoreException {
+		return folder.members();
+	}
 }

Copied: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/RootFolder.java (from r1794531, sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/FileVaultMetaInfRootFolder.java)
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/RootFolder.java?p2=sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/RootFolder.java&p1=sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/FileVaultMetaInfRootFolder.java&r1=1794531&r2=1794532&rev=1794532&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/FileVaultMetaInfRootFolder.java (original)
+++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/RootFolder.java Tue May  9 10:46:53 2017
@@ -16,22 +16,13 @@
  */
 package org.apache.sling.ide.eclipse.ui.nav.model;
 
-import org.eclipse.core.resources.IFolder;
-
-public class FileVaultMetaInfRootFolder {
-
-    private final IFolder folder;
-
-    public FileVaultMetaInfRootFolder(IFolder folder) {
-        this.folder = folder;
-    }
-
-    @Override
-    public String toString() {
-        return folder.getProjectRelativePath().toString();
-    }
-
-    public IFolder getFolder() {
-        return folder;
-    }
-}
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+
+public interface RootFolder {
+	
+	public IResource[] members() throws CoreException;
+	public IResource findMember(IPath path);
+	public IPath getProjectRelativePath();
+}
\ No newline at end of file