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 2014/05/21 12:16:55 UTC

svn commit: r1596528 - in /sling/trunk/tooling/ide: eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/ eclipse-test/src/org/apache/sling/ide/test/impl/ eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/

Author: rombert
Date: Wed May 21 10:16:54 2014
New Revision: 1596528

URL: http://svn.apache.org/r1596528
Log:
SLING-3174 - Add new simple project content wizard

Detect potential content projects by looking for a directory containing
both jcr_root and META-INF/vault/filter.xml . For now, we look under the
project's root location and under src/main/content.

Added:
    sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/ProjectHelperTest.java   (with props)
Modified:
    sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/ProjectHelper.java
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertToContentPackageAction.java

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=1596528&r1=1596527&r2=1596528&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 Wed May 21 10:16:54 2014
@@ -22,10 +22,13 @@ import javax.xml.parsers.DocumentBuilder
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
+import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Path;
 import org.eclipse.jdt.core.IJavaModel;
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.JavaCore;
@@ -41,15 +44,42 @@ import org.xml.sax.SAXException;
 
 public class ProjectHelper {
 
+    private static final String[] CONTENT_PACKAGE_STRUCTURE_BASE = new String[] { "/", "/content", "/src/main/content" };
+
 	public static boolean isPotentialBundleProject(IProject project) {
 		String packaging = getMavenProperty(project, "packaging");
 		return (packaging!=null && "bundle".equals(packaging));
 	}
 	
 	public static boolean isPotentialContentProject(IProject project) {
-		String packaging = getMavenProperty(project, "packaging");
-		return (packaging!=null && "content-package".equals(packaging));
+
+        return !isContentProject(project) && getInferredContentProjectContentRoot(project) != null;
 	}
+
+    public static IContainer getInferredContentProjectContentRoot(IProject project) {
+
+        for (String base : CONTENT_PACKAGE_STRUCTURE_BASE) {
+            IContainer container;
+            if ("/".equals(base)) {
+                container = project;
+            } else {
+                container = project.getFolder(base);
+            }
+            if (container.exists() && hasContentPackageStructure(container)) {
+                return container;
+            }
+        }
+
+        return null;
+    }
+
+    private static boolean hasContentPackageStructure(IContainer base) {
+
+        IFile filterXml = base.getFile(Path.fromPortableString("META-INF/vault/filter.xml"));
+        IFolder jcrRoot = base.getFolder(Path.fromPortableString("jcr_root"));
+
+        return filterXml.exists() && jcrRoot.exists();
+    }
 	
 	public static String getMavenProperty(IProject project, String name) {
 		try{

Added: sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/ProjectHelperTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/ProjectHelperTest.java?rev=1596528&view=auto
==============================================================================
--- sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/ProjectHelperTest.java (added)
+++ sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/ProjectHelperTest.java Wed May 21 10:16:54 2014
@@ -0,0 +1,165 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.ide.test.impl;
+
+import static org.junit.Assert.assertThat;
+
+import java.io.ByteArrayInputStream;
+
+import org.apache.sling.ide.eclipse.core.internal.ProjectHelper;
+import org.apache.sling.ide.test.impl.helpers.ProjectAdapter;
+import org.apache.sling.ide.test.impl.helpers.TemporaryProject;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Path;
+import org.hamcrest.CoreMatchers;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class ProjectHelperTest {
+
+    @Rule
+    public TemporaryProject projectRule = new TemporaryProject();
+
+    @Test
+    public void inferContentProjectContentRootAtTheTopLevel() throws CoreException, InterruptedException {
+
+        // create faceted project
+        IProject contentProject = projectRule.getProject();
+
+        ProjectAdapter project = new ProjectAdapter(contentProject);
+        project.addNatures("org.eclipse.wst.common.project.facet.core.nature");
+
+        // install content facet
+        project.installFacet("sling.content", "1.0");
+
+        // create files
+        project.createOrUpdateFile(Path.fromPortableString("jcr_root/test/hello.txt"), new ByteArrayInputStream(
+                "goodbye, world".getBytes()));
+
+        project.createOrUpdateFile(Path.fromPortableString("META-INF/vault/filter.xml"), new ByteArrayInputStream(
+                "<workspaceFilter version=\"1.0\"/>".getBytes()));
+
+        assertThat(ProjectHelper.getInferredContentProjectContentRoot(contentProject),
+                CoreMatchers.<IContainer> equalTo(contentProject));
+
+    }
+
+    @Test
+    public void inferContentProjectContentRootNested() throws CoreException, InterruptedException {
+
+        // create faceted project
+        IProject contentProject = projectRule.getProject();
+
+        ProjectAdapter project = new ProjectAdapter(contentProject);
+        project.addNatures("org.eclipse.wst.common.project.facet.core.nature");
+
+        // install content facet
+        project.installFacet("sling.content", "1.0");
+
+        // create files
+        project.createOrUpdateFile(Path.fromPortableString("src/main/content/jcr_root/test/hello.txt"),
+                new ByteArrayInputStream("goodbye, world".getBytes()));
+
+        project.createOrUpdateFile(Path.fromPortableString("src/main/content/META-INF/vault/filter.xml"),
+                new ByteArrayInputStream("<workspaceFilter version=\"1.0\"/>".getBytes()));
+
+        assertThat(ProjectHelper.getInferredContentProjectContentRoot(contentProject),
+                CoreMatchers.<IContainer> equalTo(contentProject.getFolder("src/main/content")));
+
+    }
+
+    @Test
+    public void inferContentProjectContentMissingFilter() throws CoreException, InterruptedException {
+
+        // create faceted project
+        IProject contentProject = projectRule.getProject();
+
+        ProjectAdapter project = new ProjectAdapter(contentProject);
+        project.addNatures("org.eclipse.wst.common.project.facet.core.nature");
+
+        // install content facet
+        project.installFacet("sling.content", "1.0");
+
+        // create files
+        project.createOrUpdateFile(Path.fromPortableString("src/main/content/jcr_root/test/hello.txt"),
+                new ByteArrayInputStream("goodbye, world".getBytes()));
+
+        assertThat(ProjectHelper.getInferredContentProjectContentRoot(contentProject), CoreMatchers.nullValue());
+    }
+
+    @Test
+    public void inferContentProjectContentMissingJcrRoot() throws CoreException, InterruptedException {
+
+        // create faceted project
+        IProject contentProject = projectRule.getProject();
+
+        ProjectAdapter project = new ProjectAdapter(contentProject);
+        project.addNatures("org.eclipse.wst.common.project.facet.core.nature");
+
+        // install content facet
+        project.installFacet("sling.content", "1.0");
+
+        // create files
+        project.createOrUpdateFile(Path.fromPortableString("src/main/content/META-INF/vault/filter.xml"),
+                new ByteArrayInputStream("<workspaceFilter version=\"1.0\"/>".getBytes()));
+
+        assertThat(ProjectHelper.getInferredContentProjectContentRoot(contentProject), CoreMatchers.nullValue());
+    }
+
+    @Test
+    public void projectWithInstalledFacetIsCandidate() throws CoreException, InterruptedException {
+
+        // create faceted project
+        IProject contentProject = projectRule.getProject();
+
+        ProjectAdapter project = new ProjectAdapter(contentProject);
+        project.addNatures("org.eclipse.wst.common.project.facet.core.nature");
+
+        // create files
+        project.createOrUpdateFile(Path.fromPortableString("src/main/content/jcr_root/test/hello.txt"),
+                new ByteArrayInputStream("goodbye, world".getBytes()));
+
+        project.createOrUpdateFile(Path.fromPortableString("src/main/content/META-INF/vault/filter.xml"),
+                new ByteArrayInputStream("<workspaceFilter version=\"1.0\"/>".getBytes()));
+
+        assertThat(ProjectHelper.isPotentialContentProject(contentProject), CoreMatchers.equalTo(true));
+    }
+
+    @Test
+    public void projectWithoutInstalledFacetIsNotCandidate() throws CoreException, InterruptedException {
+
+        // create faceted project
+        IProject contentProject = projectRule.getProject();
+
+        ProjectAdapter project = new ProjectAdapter(contentProject);
+        project.addNatures("org.eclipse.wst.common.project.facet.core.nature");
+
+        // install content facet
+        project.installFacet("sling.content", "1.0");
+
+        // create files
+        project.createOrUpdateFile(Path.fromPortableString("src/main/content/jcr_root/test/hello.txt"),
+                new ByteArrayInputStream("goodbye, world".getBytes()));
+
+        project.createOrUpdateFile(Path.fromPortableString("src/main/content/META-INF/vault/filter.xml"),
+                new ByteArrayInputStream("<workspaceFilter version=\"1.0\"/>".getBytes()));
+
+        assertThat(ProjectHelper.isPotentialContentProject(contentProject), CoreMatchers.equalTo(false));
+    }
+}

Propchange: sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/ProjectHelperTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/ProjectHelperTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Modified: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertToContentPackageAction.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertToContentPackageAction.java?rev=1596528&r1=1596527&r2=1596528&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertToContentPackageAction.java (original)
+++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertToContentPackageAction.java Wed May 21 10:16:54 2014
@@ -21,6 +21,7 @@ import java.util.Iterator;
 
 import org.apache.sling.ide.eclipse.core.ConfigurationHelper;
 import org.apache.sling.ide.eclipse.core.internal.ProjectHelper;
+import org.apache.sling.ide.eclipse.ui.internal.Activator;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.CoreException;
@@ -60,10 +61,11 @@ public class ConvertToContentPackageActi
 		if (fSelection instanceof IStructuredSelection) {
 			final IProject project = (IProject) ((IStructuredSelection) fSelection).getFirstElement();
 
-			String jcrRootLocation = "src/main/content/jcr_root";
+            String jcrRootLocation = ProjectHelper.getInferredContentProjectContentRoot(project)
+                    .getProjectRelativePath().append("jcr_root").toPortableString();
 			final InputDialog id = new InputDialog(getDisplay().getActiveShell(), "Convert to Sling Content-Package Project", 
-					"Confirm jcr_root location of "+project.getName()+":", jcrRootLocation, new IInputValidator() {
-						
+		            "Confirm content sync root location of " + project.getName() + ":", jcrRootLocation,
+		            new IInputValidator() {
 						@Override
 						public String isValid(String newText) {
 							if (newText!=null && newText.trim().length()>0) {
@@ -74,7 +76,7 @@ public class ConvertToContentPackageActi
 									return "Directory not found: "+newText;
 								}
 							} else {
-								return "Please specify location of jcr_root";
+                                return "Please specify location of the content sync root";
 							}
 						}
 					});
@@ -87,7 +89,7 @@ public class ConvertToContentPackageActi
 						try {
 							ConfigurationHelper.convertToContentPackageProject(project, monitor, id.getValue());
 						} catch (CoreException e) {
-							e.printStackTrace();
+                            Activator.getDefault().getPluginLogger().warn("Could not convert project", e);
 							MessageDialog.openError(getDisplay().getActiveShell(), "Could not convert project",
 									e.getMessage());
 						}
@@ -96,7 +98,7 @@ public class ConvertToContentPackageActi
 				try {
 					PlatformUI.getWorkbench().getProgressService().busyCursorWhile(r);
 				} catch (Exception e) {
-					e.printStackTrace();
+                    Activator.getDefault().getPluginLogger().warn("Could not convert project", e);
 					MessageDialog.openError(getDisplay().getActiveShell(), "Could not convert project",
 							e.getMessage());
 				}
@@ -114,7 +116,7 @@ public class ConvertToContentPackageActi
 		fSelection = selection;
 		if (selection instanceof IStructuredSelection) {
 			final IStructuredSelection iss = (IStructuredSelection) selection;
-			Iterator<Object> it = iss.iterator();
+            Iterator<?> it = iss.iterator();
 			if (!it.hasNext()) {
 				action.setEnabled(false);
 				return;