Author: rombert Date: Mon Feb 16 11:24:47 2015 New Revision: 1660070 URL: http://svn.apache.org/r1660070 Log: SLING-4332 - Malformed .content.xml files cause unhandled errors and break the content navigator
Modified: sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/JcrContentContentProviderTest.java sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNode.java Modified: sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/JcrContentContentProviderTest.java URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/JcrContentContentProviderTest.java?rev=1660070&r1=1660069&r2=1660070&view=diff ============================================================================== --- sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/JcrContentContentProviderTest.java (original) +++ sling/trunk/tooling/ide/eclipse-test/src/org/apache/sling/ide/test/impl/JcrContentContentProviderTest.java Mon Feb 16 11:24:47 2015 @@ -18,6 +18,7 @@ package org.apache.sling.ide.test.impl; import static org.junit.Assert.assertThat; +import java.io.ByteArrayInputStream; import java.io.InputStream; import org.apache.sling.ide.eclipse.ui.nav.JcrContentContentProvider; @@ -130,6 +131,42 @@ public class JcrContentContentProviderTe } + @Test + public void listChildrenWhenContentXmlIsBroken() throws Exception { + // 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 .content.xml structure + project.createOrUpdateFile(Path.fromPortableString("jcr_root/content/.content.xml"), new ByteArrayInputStream( + "invalid".getBytes())); + + project.createOrUpdateFile(Path.fromPortableString("jcr_root/content/child1.txt"), new ByteArrayInputStream( + "hello, world".getBytes())); + project.createOrUpdateFile(Path.fromPortableString("jcr_root/content/child2.txt"), new ByteArrayInputStream( + "hello, world".getBytes())); + + // instantiate the content provider + JcrContentContentProvider contentProvider = new JcrContentContentProvider(); + + // directly create the root node + SyncDir syncDirNode = new SyncDir((IFolder) contentProject.findMember("jcr_root")); + + // test children of '/' + Object[] children = contentProvider.getChildren(syncDirNode); + assertChildrenHavePaths(children, "/content"); + + // test children of '/content' + JcrNode contentNode = (JcrNode) children[0]; + Object[] children2 = contentProvider.getChildren(contentNode); + assertChildrenHavePaths(children2, "/content/child1.txt", "/content/child2.txt"); + } + private void assertChildrenHavePaths(Object[] children, String... paths) { assertThat("Unexpected number of children found", children.length, CoreMatchers.equalTo(paths.length)); for (int i = 0; i < children.length; i++) { Modified: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNode.java URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNode.java?rev=1660070&r1=1660069&r2=1660070&view=diff ============================================================================== --- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNode.java (original) +++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNode.java Mon Feb 16 11:24:47 2015 @@ -98,6 +98,7 @@ import de.pdark.decentxml.Element; import de.pdark.decentxml.Namespace; import de.pdark.decentxml.Node; import de.pdark.decentxml.Text; +import de.pdark.decentxml.XMLParseException; import de.pdark.decentxml.XMLTokenizer.Type; /** WIP: model object for a jcr node shown in the content package view in project explorer **/ @@ -347,10 +348,16 @@ public class JcrNode implements IAdaptab continue; } if (isVaultFile(iResource)) { - GenericJcrRootFile gjrf = new GenericJcrRootFile(this, (IFile)iResource); + GenericJcrRootFile gjrf; + try { + gjrf = new GenericJcrRootFile(this, (IFile)iResource); + // gjrf.getChildren(); + gjrf.pickResources(membersList); + } catch (XMLParseException e) { + // don't try to parse it + // errors will be reported by the XML validation infrastructure + } it.remove(); - //gjrf.getChildren(); - gjrf.pickResources(membersList); // as this might have added some new children, go through the children again and // add them if they're not already added