Author: stefanegli
Date: Wed Sep  4 11:21:52 2013
New Revision: 1519984

URL: http://svn.apache.org/r1519984
Log:
SLING-2985 : support <file> <file>.dir serialization format of vault and show a 
file with a child (typically jcr:content) in the content browser

Added:
    
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/DirNode.java
   (with props)
Modified:
    
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNode.java

Added: 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/DirNode.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/DirNode.java?rev=1519984&view=auto
==============================================================================
--- 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/DirNode.java
 (added)
+++ 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/DirNode.java
 Wed Sep  4 11:21:52 2013
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.ide.eclipse.ui.nav.model;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IResource;
+import org.w3c.dom.Node;
+
+public class DirNode extends JcrNode {
+
+       static boolean isDirNode(IResource resource) {
+               if (resource==null) {
+                       return false;
+               }
+               final String resourceName = resource.getName();
+               if (!resourceName.endsWith(".dir")) {
+                       return false;
+               }
+               if (!(resource instanceof IFolder)) {
+                       return false;
+               }
+               final IFolder folder = (IFolder)resource;
+               final IContainer container = folder.getParent();
+               if (container==null || !container.exists()) {
+                       return false;
+               }
+               final IResource peerNode = 
container.findMember(resourceName.substring(0, resourceName.length()-4));
+               if (peerNode==null || !peerNode.exists()) {
+                       return false;
+               }
+               final IResource dotContextXml = 
folder.findMember(".content.xml");
+               if (dotContextXml==null || !dotContextXml.exists()) {
+                       return false;
+               }
+               // then it is likely the pattern that corresponds to the case
+               // which we want to handle with this DirNode
+               return true;
+       }
+       
+       DirNode(JcrNode parent, Node domNode, IResource resource) {
+               super(parent, domNode, resource);
+               if (!isDirNode(resource)) {
+                       throw new IllegalArgumentException("resource is not a 
DirNode: "+resource);
+               }
+       }
+       
+       @Override
+       protected void addChild(JcrNode jcrNode) {
+               final String shortName = getName().substring(0, 
getName().length()-4);
+               Set<JcrNode> c = new HashSet<JcrNode>(parent.children);
+               for (Iterator<JcrNode> it = c.iterator(); it.hasNext();) {
+                       JcrNode node = it.next();
+                       if (node.getName().equals(shortName)) {
+                               // excellent, the parent contains a child which 
+                               // matches the .dir pattern, so add this child 
there
+                               node.addChild(jcrNode);
+                               // but also hide this node from my parent
+                               parent.hide(this);
+                               return;
+                       }
+               }
+               super.addChild(jcrNode);
+       }
+       
+       @Override
+       public boolean canBeOpenedInEditor() {
+               return false;
+       }
+       
+       @Override
+       public boolean canBeRenamed() {
+               return false;
+       }
+       
+}

Propchange: 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/DirNode.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

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=1519984&r1=1519983&r2=1519984&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
 Wed Sep  4 11:21:52 2013
@@ -18,6 +18,7 @@ package org.apache.sling.ide.eclipse.ui.
 
 import java.io.IOException;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -97,6 +98,8 @@ public class JcrNode implements IAdaptab
        private boolean resourceChildrenAdded = false;
        
        final ModifiableProperties properties = new ModifiableProperties(this);
+
+       final Set<JcrNode> hiddenChildren = new HashSet<JcrNode>();
        
        JcrNode() {
                // for subclass use only
@@ -214,11 +217,26 @@ public class JcrNode implements IAdaptab
                }
                return children.size()>0 || members;
        }
+       
+       public void hide(JcrNode node) {
+               hiddenChildren.add(node);
+       }
 
+       Object[] filterHiddenChildren(final Collection<JcrNode> collection) {
+               final Collection<JcrNode> values = new 
HashSet<JcrNode>(collection);
+               
+               for (Iterator<JcrNode> it = hiddenChildren.iterator(); 
it.hasNext();) {
+                       final JcrNode hiddenNode = it.next();
+                       values.remove(hiddenNode);
+               }
+               
+               return values.toArray();
+       }
+       
        public Object[] getChildren() {
                try {
                        if (resourceChildrenAdded) {
-                               return children.toArray();
+                               return filterHiddenChildren(children);
                        }
                        Map<String,JcrNode> resultMap = new HashMap<String, 
JcrNode>();
                        for (Iterator it = children.iterator(); it.hasNext();) {
@@ -254,7 +272,12 @@ public class JcrNode implements IAdaptab
                                        }
                                        for (Iterator it = 
membersList.iterator(); it.hasNext();) {
                                                IResource iResource = 
(IResource) it.next();
-                                               JcrNode node = new 
JcrNode(this, (Node)null, iResource);
+                                               JcrNode node;
+                                               if 
(DirNode.isDirNode(iResource)) {
+                                                       node = new 
DirNode(this, (Node)null, iResource);
+                                               } else {
+                                                       node = new 
JcrNode(this, (Node)null, iResource);
+                                               }
 //                                             node.setResource(iResource);
                                                // load the children - to make 
sure we get vault files loaded too
                                                node.getChildren();
@@ -265,7 +288,7 @@ public class JcrNode implements IAdaptab
                        }
                        resourceChildrenAdded = true;
                        
-                       return resultMap.values().toArray();
+                       return filterHiddenChildren(resultMap.values());
                } catch (CoreException e) {
                        return new Object[0];
                } catch (ParserConfigurationException e) {


Reply via email to