incubator-sling-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From stefane...@apache.org
Subject svn commit: r1511345 - in /sling/trunk/tooling/ide/eclipse-ui: ./ META-INF/ src/org/apache/sling/ide/eclipse/ui/nav/ src/org/apache/sling/ide/eclipse/ui/nav/model/
Date Wed, 07 Aug 2013 14:54:41 GMT
Author: stefanegli
Date: Wed Aug  7 14:54:40 2013
New Revision: 1511345

URL: http://svn.apache.org/r1511345
Log:
SLING-2985 : tooling : show content of .content.xml in project explorer
 - WIP/Work in progress : adding prototype of content[-package][.content.xml] browsing. 'mounts'
the syncDir as a new toplevel node to a sling-faceted project and allows browsing through
folders/.content.xml-content.

Added:
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/JcrContentContentProvider.java
  (with props)
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/JcrContentLabelProvider.java
  (with props)
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/GenericJcrRootFile.java
  (with props)
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNode.java
  (with props)
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNodeAdapterFactory.java
  (with props)
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/ReadOnlyProperties.java
  (with props)
    sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/SyncDir.java
  (with props)
Modified:
    sling/trunk/tooling/ide/eclipse-ui/META-INF/MANIFEST.MF
    sling/trunk/tooling/ide/eclipse-ui/plugin.xml

Modified: sling/trunk/tooling/ide/eclipse-ui/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/META-INF/MANIFEST.MF?rev=1511345&r1=1511344&r2=1511345&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/META-INF/MANIFEST.MF (original)
+++ sling/trunk/tooling/ide/eclipse-ui/META-INF/MANIFEST.MF Wed Aug  7 14:54:40 2013
@@ -14,6 +14,7 @@ Import-Package: org.apache.sling.ide.ecl
  org.eclipse.core.commands,
  org.eclipse.core.commands.operations,
  org.eclipse.core.resources,
+ org.eclipse.core.resources.mapping,
  org.eclipse.core.runtime;version="3.4.0",
  org.eclipse.core.runtime.jobs,
  org.eclipse.debug.core,
@@ -49,4 +50,7 @@ Import-Package: org.apache.sling.ide.ecl
  org.osgi.framework,
  org.osgi.util.tracker;version="1.5.0"
 Bundle-ActivationPolicy: lazy
-Require-Bundle: org.eclipse.wst.common.project.facet.ui
+Require-Bundle: org.eclipse.wst.common.project.facet.ui,
+ org.eclipse.ui.navigator;bundle-version="3.5.101",
+ org.eclipse.ui.views;bundle-version="3.6.0",
+ org.eclipse.ui

Modified: sling/trunk/tooling/ide/eclipse-ui/plugin.xml
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/plugin.xml?rev=1511345&r1=1511344&r2=1511345&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/plugin.xml (original)
+++ sling/trunk/tooling/ide/eclipse-ui/plugin.xml Wed Aug  7 14:54:40 2013
@@ -114,4 +114,72 @@
           </enabledWhen>
         </page> 
     </extension>
+	<extension
+			point="org.eclipse.ui.navigator.viewer">
+		<viewerContentBinding viewerId="org.eclipse.ui.navigator.ProjectExplorer">
+			<includes>
+				<contentExtension pattern="org.apache.sling.ide.eclipse-ui.navigatorJcrContent" />
+			</includes>
+		</viewerContentBinding>
+	</extension>
+   <extension
+         point="org.eclipse.ui.navigator.navigatorContent">
+      <navigatorContent
+            appearsBefore="org.eclipse.jst.jee.ui.ejb"
+            contentProvider="org.apache.sling.ide.eclipse.ui.nav.JcrContentContentProvider"
+            icon="icons/obj16/sling.gif"
+            id="org.apache.sling.ide.eclipse-ui.navigatorJcrContent"
+            labelProvider="org.apache.sling.ide.eclipse.ui.nav.JcrContentLabelProvider"
+            name="Sling (JCR) Content"
+            priority="highest">
+         <triggerPoints>
+            <or>         
+              <instanceof 
+                    value="org.eclipse.core.resources.IWorkspaceRoot" /> 
+              <instanceof
+                    value="org.eclipse.core.resources.IProject" />  
+              <instanceof  
+                     value="org.eclipse.core.resources.IFolder" /> 
+              <instanceof  
+                     value="org.eclipse.core.resources.IFile" /> 
+              <instanceof  
+                     value="org.apache.sling.ide.eclipse.ui.nav.model.JcrNode" /> 
+           </or>
+         </triggerPoints>
+         <enablement>
+            <or>         
+              <instanceof 
+                    value="org.eclipse.core.resources.IWorkspaceRoot" /> 
+              <instanceof
+                    value="org.eclipse.core.resources.IProject" />  
+              <instanceof  
+                     value="org.eclipse.core.resources.IFolder" /> 
+              <instanceof  
+                     value="org.eclipse.core.resources.IFile" /> 
+              <instanceof  
+                     value="org.apache.sling.ide.eclipse.ui.nav.model.JcrNode" /> 
+           </or>
+         </enablement>
+         <!--org.eclipse.ui.navigator.resourceContent-->
+         <!--org.eclipse.jdt.java.ui.javaContent-->
+         <!--override
+               policy="InvokeAlwaysRegardlessOfSuppressedExt"
+               suppressedExtensionId="org.eclipse.ui.navigator.resourceContent">
+         </override-->
+        
+      </navigatorContent>
+   </extension>
+   <extension
+         point="org.eclipse.core.runtime.adapters">
+      <factory
+            adaptableType="org.apache.sling.ide.eclipse.ui.nav.model.JcrNode"
+            class="org.apache.sling.ide.eclipse.ui.nav.model.JcrNodeAdapterFactory">
+         <adapter
+               type="org.eclipse.core.resources.IFile">
+         </adapter>
+         <adapter
+               type="org.eclipse.core.resources.IResource">
+         </adapter>
+      </factory>
+   </extension> 
 </plugin>    

Added: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/JcrContentContentProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/JcrContentContentProvider.java?rev=1511345&view=auto
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/JcrContentContentProvider.java
(added)
+++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/JcrContentContentProvider.java
Wed Aug  7 14:54:40 2013
@@ -0,0 +1,199 @@
+/*
+ * 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 java.util.Arrays;
+import java.util.Set;
+
+import org.apache.sling.ide.eclipse.core.ProjectUtil;
+import org.apache.sling.ide.eclipse.ui.internal.Activator;
+import org.apache.sling.ide.eclipse.ui.nav.model.JcrNode;
+import org.apache.sling.ide.eclipse.ui.nav.model.SyncDir;
+import org.apache.sling.ide.serialization.SerializationManager;
+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.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.navigator.ICommonContentExtensionSite;
+import org.eclipse.ui.navigator.IPipelinedTreeContentProvider2;
+import org.eclipse.ui.navigator.PipelinedShapeModification;
+import org.eclipse.ui.navigator.PipelinedViewerUpdate;
+
+/** WIP: content provider for content package view in project explorer **/
+public class JcrContentContentProvider implements ITreeContentProvider, IPipelinedTreeContentProvider2
{
+
+	@Override
+	public void dispose() {
+		// nothing to be done here
+	}
+
+	@Override
+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		// nothing to be done here
+	}
+
+	@Override
+	public Object[] getElements(Object inputElement) {
+		return null;
+	}
+
+	@Override
+	public Object[] getChildren(Object parentElement) {
+		if (parentElement instanceof IProject) {
+			return projectGetChildren((IProject)parentElement);
+		} else if (parentElement instanceof JcrNode) {
+			JcrNode node = (JcrNode)parentElement;
+			return node.getChildren();
+		} else {
+			return null;
+		}
+	}
+
+	private Object[] projectGetChildren(IProject parentElement) {
+		IFolder syncDir = getSyncDir(parentElement);
+		if (syncDir!=null && syncDir.exists()) {
+			return new Object[] {new SyncDir(syncDir)};
+		}
+		return null;
+	}
+
+	@Override
+	public Object getParent(Object element) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public boolean hasChildren(Object element) {
+		if (element instanceof IProject) {
+			return projectHasChildren((IProject)element);
+		} else if (element instanceof JcrNode) {
+			JcrNode jcrNode = (JcrNode) element;
+			return jcrNode.hasChildren();
+		}
+		return false;
+	}
+
+	private boolean projectHasChildren(IProject project) {
+		IFolder syncDir = getSyncDir(project);
+		if (syncDir!=null && syncDir.exists()) {
+			return true;
+		}
+		return false;
+	}
+
+	private IFolder getSyncDir(IProject project) {
+		if (!project.isOpen()) {
+			return null;
+		}
+		IResource syncDir = project.findMember(ProjectUtil.getSyncDirectoryValue(project));
+		return (IFolder) syncDir;
+	}
+
+	@Override
+	public void getPipelinedElements(Object anInput, Set theCurrentElements) {
+		// we're not adding any elements at the root level
+		// hence nothing to be done here
+	}
+
+
+	@Override
+	public Object getPipelinedParent(Object anObject, Object aSuggestedParent) {
+		// not fiddling with the parent
+		// hence returning the suggested parent
+		return aSuggestedParent;
+	}
+
+
+	@Override
+	public PipelinedShapeModification interceptAdd(
+			PipelinedShapeModification anAddModification) {
+		// nothing to do here
+		// passing along the parameter unchanged
+		return anAddModification;
+	}
+
+
+	@Override
+	public PipelinedShapeModification interceptRemove(
+			PipelinedShapeModification aRemoveModification) {
+		// nothing to do here
+		// passing along the parameter unchanged
+		return aRemoveModification;
+	}
+
+
+	@Override
+	public boolean interceptRefresh(
+			PipelinedViewerUpdate aRefreshSynchronization) {
+		// nothing to do here
+		return false;
+	}
+
+
+	@Override
+	public boolean interceptUpdate(PipelinedViewerUpdate anUpdateSynchronization) {
+		// nothing to do here
+		return false;
+	}
+
+
+	@Override
+	public void init(ICommonContentExtensionSite aConfig) {
+		// nothing to do here
+	}
+
+
+	@Override
+	public void restoreState(IMemento aMemento) {
+		// nothing to do here
+	}
+
+
+	@Override
+	public void saveState(IMemento aMemento) {
+		// nothing to do here
+	}
+
+	@Override
+	public void getPipelinedChildren(Object aParent, Set theCurrentChildren) {
+		if (aParent instanceof IProject) {
+			Object[] children = projectGetChildren((IProject)aParent);
+			if (children!=null && children.length>0) {
+				theCurrentChildren.addAll(Arrays.asList(children));
+			}
+			return;
+		} else if (aParent instanceof SyncDir) {
+			theCurrentChildren.clear();
+			Object[] children = getChildren(aParent);
+			if (children!=null) {
+				theCurrentChildren.addAll(Arrays.asList(children));
+			}
+		}
+	}
+
+	@Override
+	public boolean hasPipelinedChildren(Object anInput,
+			boolean currentHasChildren) {
+		// TODO Auto-generated method stub
+		return true;
+	}
+
+}

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

Added: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/JcrContentLabelProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/JcrContentLabelProvider.java?rev=1511345&view=auto
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/JcrContentLabelProvider.java
(added)
+++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/JcrContentLabelProvider.java
Wed Aug  7 14:54:40 2013
@@ -0,0 +1,85 @@
+/*
+ * 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.nav.model.JcrNode;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.navigator.IDescriptionProvider;
+
+/** WIP: label provider for content package view in project explorer **/
+public class JcrContentLabelProvider implements ILabelProvider, IDescriptionProvider {
+
+	@Override
+	public void addListener(ILabelProviderListener listener) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void dispose() {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public boolean isLabelProperty(Object element, String property) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public void removeListener(ILabelProviderListener listener) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public Image getImage(Object element) {
+		if (element instanceof JcrNode) {
+			JcrNode jcrNode = (JcrNode)element;
+			return jcrNode.getImage();
+		} else {
+			// fallback to default
+			return null;
+		}
+	}
+
+	@Override
+	public String getText(Object element) {
+		if (element instanceof JcrNode) {
+			JcrNode jcrNode = (JcrNode)element;
+			return jcrNode.getLabel();
+		} else {
+			// fallback to the default
+			return null;
+		}
+	}
+
+	@Override
+	public String getDescription(Object element) {
+		if (element instanceof JcrNode) {
+			JcrNode jcrNode = (JcrNode)element;
+			return jcrNode.getDescription();
+		} else {
+			// fallback to the default
+			return null;
+		}
+	}
+
+}

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

Added: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/GenericJcrRootFile.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/GenericJcrRootFile.java?rev=1511345&view=auto
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/GenericJcrRootFile.java
(added)
+++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/GenericJcrRootFile.java
Wed Aug  7 14:54:40 2013
@@ -0,0 +1,159 @@
+/*
+ * 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.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+/** WIP: model object for a [.content.xml] shown in the content package view in project explorer
**/
+public class GenericJcrRootFile extends JcrNode {
+
+	private final IFile file;
+	private final Document document;
+
+	public GenericJcrRootFile(JcrNode parent, IFile file) throws ParserConfigurationException,
SAXException, IOException, CoreException {
+		if (file==null) {
+			throw new IllegalArgumentException("file must not be null");
+		}
+		this.file = file;
+		setResource(file);
+		this.underlying = this;
+		if (parent==null) {
+			throw new IllegalArgumentException("parent must not be null");
+		}
+		this.parent = parent;
+		this.domNode = null;
+		
+		DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+		this.document = docBuilder.parse(file.getContents());
+		handleJcrRoot(this.document.getFirstChild());
+	}
+
+	private void handleJcrRoot(Node domNode) {
+		NodeList children = domNode.getChildNodes();
+		final JcrNode effectiveParent;
+		if (isRootContentXml()) {
+			handleProperties(domNode, parent.properties);
+			effectiveParent = parent;
+		} else {
+			handleProperties(domNode, properties);
+			effectiveParent = this;
+			parent.addChild(this);
+		}
+		for(int i=0; i<children.getLength(); i++) {
+			handleChild(effectiveParent, children.item(i));
+		}
+	}
+
+	private boolean isRootContentXml() {
+		return file.getName().equals(".content.xml");
+	}
+	
+	private void handleProperties(Node domNode, ReadOnlyProperties properties) {
+		NamedNodeMap attributes = domNode.getAttributes();
+		for(int i=0; i<attributes.getLength(); i++) {
+			Node attr = attributes.item(i);
+			properties.add(attr.getNodeName(), attr.getNodeValue());
+		}
+	}
+
+	@Override
+	public String getLabel() {
+		if (isRootContentXml()) {
+			return "SHOULD NOT OCCUR";
+		} else {
+			// de-escape the file name
+			
+			String label = file.getName();
+
+			// 1. remove the trailing .xml
+			if (label.endsWith(".xml")) {
+				label = label.substring(0, label.length()-4);
+			}
+			
+			// 2. de-escape stuff like '_cq_' to 'cq:'
+			if (label.startsWith("_")) {
+				label = label.substring(1);
+				int first = label.indexOf("_");
+				if (first!=-1) {
+					label = label.substring(0, first) + ":" + label.substring(first+1);
+				}
+			}
+			return label;
+		}
+	}
+
+	private void handleChild(JcrNode parent, Node domNode) {
+		if (domNode.getNodeType() == Node.TEXT_NODE) {
+			// ignore
+			return;
+		}
+		if (domNode.getAttributes().getLength() == 0) {
+			// then ignore this empty node 
+			// either there is a file or a folder corresponding to this element
+			// (in which case it will show up again anyway) 
+			// or just an empty node without any further attributes such
+			// as primaryType doesn't help a lot
+			return;
+		}
+		JcrNode childJcrNode = new JcrNode(parent, domNode);
+		childJcrNode.init();
+		handleProperties(domNode, childJcrNode.properties);
+		NodeList children = domNode.getChildNodes();
+		for(int i=0; i<children.getLength(); i++) {
+			handleChild(childJcrNode, children.item(i));
+		}
+	}
+
+	public void pickResources(List<Object> membersList) {
+		for (Iterator it = membersList.iterator(); it.hasNext();) {
+			final IResource resource = (IResource) it.next();
+			final String resName = resource.getName();
+			Iterator it2;
+			if (isRootContentXml()) {
+				it2 = parent.children.iterator();
+			} else {
+				it2 = children.iterator();
+			}
+			while(it2.hasNext()) {
+				JcrNode aChild = (JcrNode) it2.next();
+				if (resName.equals(aChild.getName())) {
+					// then pick this one
+					it.remove();
+					aChild.setResource(resource);
+					break;
+				}
+			}
+		}
+		
+	}
+	
+}

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

Added: 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=1511345&view=auto
==============================================================================
--- 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/JcrNode.java
Wed Aug  7 14:54:40 2013
@@ -0,0 +1,381 @@
+/*
+ * 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.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.apache.sling.ide.eclipse.ui.internal.SharedImages;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.mapping.ResourceMapping;
+import org.eclipse.core.resources.mapping.ResourceMappingContext;
+import org.eclipse.core.resources.mapping.ResourceTraversal;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.IContributorResourceAdapter;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.w3c.dom.Node;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/** WIP: model object for a jcr node shown in the content package view in project explorer
**/
+public class JcrNode implements IAdaptable {
+
+    private final class JcrRootHandler extends DefaultHandler {
+		boolean firstElement = true;
+		boolean isVaultFile = false;
+
+		public boolean isVaultFile() {
+			return isVaultFile;
+		}
+
+		@Override
+		public void startElement(String uri, String localName,
+				String qName, Attributes attributes)
+				throws SAXException {
+			if (!firstElement) {
+				return;
+			}
+			firstElement = false;
+			if ("jcr:root".equals(qName)) {
+				String ns = attributes.getValue("xmlns:jcr");
+				if (ns!=null && ns.startsWith("http://www.jcp.org/jcr")) {
+					// then this is a vault file with a jcr:root at the beginning
+					isVaultFile = true;
+				}
+			}
+		}
+	}
+
+	private final static WorkbenchLabelProvider workbenchLabelProvider = new WorkbenchLabelProvider();
+	
+	GenericJcrRootFile underlying;
+
+	JcrNode parent;
+
+	final Set<JcrNode> children = new HashSet<JcrNode>();
+
+	Node domNode;
+
+	private IResource resource;
+	
+	private boolean resourceChildrenAdded = false;
+	
+	final ReadOnlyProperties properties = new ReadOnlyProperties();
+	
+	JcrNode() {
+		// for subclass use only
+	}
+	
+	JcrNode(JcrNode parent, Node domNode) {
+		if (parent == null) {
+			throw new IllegalArgumentException("parent must not be null");
+		}
+		this.parent = parent;
+		// domNode can be null
+		this.domNode = domNode;
+		this.underlying = parent.underlying;
+		parent.addChild(this);
+	}
+	
+	@Override
+	public String toString() {
+		return "JcrNode[dom:"+domNode+", file:"+resource+"]";
+	}
+
+	protected void addChild(JcrNode jcrNode) {
+		children.add(jcrNode);
+	}
+
+	/** shown in the navigator (project explorer) as the label of this element **/
+	public String getLabel() {
+		if (domNode!=null && resource!=null) {
+			return domNode.getNodeName();// + "[domnode+file]";
+		} else if (domNode!=null && resource==null) {
+			return domNode.getNodeName();// + "[domnode]";
+		} else if (resource!=null) {
+			return resource.getName();//+" [file]";
+		} else {
+			return "n/a";
+		}
+	}
+
+	/** shown in the statusbar when this element is selected **/
+	public String getDescription() {
+		return getJcrPath();
+	}
+
+	public boolean hasChildren() {
+		boolean members;
+		try {
+			members = resource!=null && resource instanceof IFolder && ((IFolder)resource).members().length>0;
+		} catch (CoreException e) {
+			members = false;
+		}
+		return children.size()>0 || members;
+	}
+
+	public Object[] getChildren() {
+		try {
+			if (resourceChildrenAdded) {
+				return children.toArray();
+			}
+			Map<String,JcrNode> resultMap = new HashMap<String, JcrNode>();
+			for (Iterator it = children.iterator(); it.hasNext();) {
+				JcrNode node = (JcrNode) it.next();
+				resultMap.put(node.getName(), node);
+			}
+			
+			if (resource!=null && resource instanceof IFolder) {
+				IFolder folder = (IFolder)resource;
+				IResource[] members = folder.members();
+				List<Object> membersList = new LinkedList<Object>(Arrays.asList(members));
+				outerLoop: while(membersList.size()>0) {
+					for (Iterator it = membersList.iterator(); it.hasNext();) {
+						IResource iResource = (IResource) it.next();
+						if (isVaultFile(iResource)) {
+							GenericJcrRootFile gjrf = new GenericJcrRootFile(this, (IFile)iResource);
+							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
+							for (Iterator it3 = children.iterator(); it3
+									.hasNext();) {
+								JcrNode node = (JcrNode) it3.next();
+								if (!resultMap.containsKey(node.getName())) {
+									resultMap.put(node.getName(), node);
+								}
+							}
+							
+							continue outerLoop;
+						}
+					}
+					for (Iterator it = membersList.iterator(); it.hasNext();) {
+						IResource iResource = (IResource) it.next();
+						JcrNode node = new JcrNode(this, (Node)null);
+						node.setResource(iResource);
+						node.init();
+						// load the children - to make sure we get vault files loaded too
+						node.getChildren();
+						resultMap.put(node.getName(), node);
+						it.remove();
+					}
+				}
+			}
+			resourceChildrenAdded = true;
+			
+			return resultMap.values().toArray();
+		} catch (CoreException e) {
+			return new Object[0];
+		} catch (ParserConfigurationException e) {
+			return new Object[0];
+		} catch (SAXException e) {
+			return new Object[0];
+		} catch (IOException e) {
+			return new Object[0];
+		}
+	}
+
+	protected void init() {
+		// placeholder for initializing any common properties
+	}
+
+	private boolean isVaultFile(IResource iResource)
+			throws ParserConfigurationException, SAXException, IOException,
+			CoreException {
+		if (iResource.getName().endsWith(".xml")) {
+			// then it could potentially be a vlt file. 
+			// let's check if it contains a jcr:root element with the appropriate namespace
+			
+			IFile file = (IFile)iResource;
+			
+		    SAXParserFactory factory = SAXParserFactory.newInstance();
+		    SAXParser saxParser = factory.newSAXParser();
+
+		    JcrRootHandler h = new JcrRootHandler();
+			saxParser.parse(new InputSource(file.getContents()), h);
+
+			return h.isVaultFile();
+		}
+		return false;
+	}
+
+	public void setResource(IResource resource) {
+		if (this.resource!=null) {
+			throw new IllegalStateException("can only set resource once");
+		}
+		this.resource = resource;
+	}
+
+	public Image getImage() {
+		if (resource!=null) {
+			if (resource instanceof IFolder) {
+				Image folderImage = workbenchLabelProvider.getImage(resource);
+				if (domNode==null && false) {
+					// then make it greyscale
+					folderImage = new
+							Image(folderImage.getDevice(), folderImage,SWT.IMAGE_GRAY);
+				}
+				return folderImage;
+			} else
+				try {
+					if (!isVaultFile(resource)){
+						return workbenchLabelProvider.getImage(resource);
+					}
+				} catch (ParserConfigurationException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				} catch (SAXException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				} catch (IOException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				} catch (CoreException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+		}
+		//if (domNode!=null && children!=null && children.size()>0) {
+		//	return workbenchLabelProvider.getImage(domNode);
+		//}
+		
+		return SharedImages.SLING_ICON.createImage();
+	}
+
+	public String getName() {
+		if (domNode!=null) {
+			return domNode.getNodeName();
+		} else if (resource!=null) {
+			return resource.getName();
+		} else {
+			return "";
+		}
+	}
+		
+	String getJcrPath() {
+		String prefix;
+		if (parent==null) {
+			prefix = "";
+		} else {
+			prefix = parent.getJcrPath();
+			if (!prefix.endsWith("/")) {
+				prefix = prefix + "/";
+			}
+		}
+		return prefix + getName();
+	}
+
+	@Override
+	public Object getAdapter(Class adapter) {
+		final Object result = doGetAdapter(adapter);
+		if (result==null) {
+		//	System.out.println("adapter looked for: "+adapter+", result: "+result);
+		}
+		return result;
+	}
+	
+	private Object doGetAdapter(Class adapter) {
+		if (adapter==IPropertySource.class) {
+			return properties;
+		} else if (adapter == IFile.class) {
+			if (resource instanceof IFile) {
+				return (IFile)resource;
+			} else {
+				return null;
+			}
+		} else if (adapter == IContributorResourceAdapter.class) {
+			if (resource==null) {
+				return null;
+			}
+			return new IContributorResourceAdapter() {
+				
+				@Override
+				public IResource getAdaptedResource(IAdaptable adaptable) {
+					if (!(adaptable instanceof JcrNode)) {
+						return null;
+					}
+					JcrNode node = (JcrNode)adaptable;
+					if (node.resource!=null) {
+						return node.resource;
+					}
+					return null;
+				}
+			};
+		} else if (adapter == IResource.class) {
+			return resource;		
+		} else if (adapter == ResourceMapping.class) { 
+			boolean t = true;
+			if (!t) {
+				return null;
+			}
+			if (resource==null) {
+				return null;
+			}
+			return new ResourceMapping() {
+				
+				@Override
+				public ResourceTraversal[] getTraversals(ResourceMappingContext context,
+						IProgressMonitor monitor) throws CoreException {
+					return new ResourceTraversal[] { new ResourceTraversal(new IResource[] { resource },
IResource.DEPTH_INFINITE, IResource.NONE) };
+				}
+				
+				@Override
+				public IProject[] getProjects() {
+					if (resource!=null) {
+						return new IProject[] {resource.getProject()};
+					}
+					return null;
+				}
+				
+				@Override
+				public String getModelProviderId() {
+					return "org.apache.sling.ide.eclipse.ui.nav.model.JcrNode.ResourceMapping";
+				}
+				
+				@Override
+				public Object getModelObject() {
+					return resource;
+				}
+			};
+		}
+		return null;
+	}
+
+}

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

Added: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNodeAdapterFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNodeAdapterFactory.java?rev=1511345&view=auto
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNodeAdapterFactory.java
(added)
+++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNodeAdapterFactory.java
Wed Aug  7 14:54:40 2013
@@ -0,0 +1,37 @@
+/*
+ * 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 org.eclipse.core.runtime.IAdapterFactory;
+
+public class JcrNodeAdapterFactory implements IAdapterFactory {
+
+	@Override
+	public Object getAdapter(Object adaptableObject, Class adapterType) {
+		if (adaptableObject instanceof JcrNode) {
+			JcrNode node = (JcrNode) adaptableObject;
+			return node.getAdapter(adapterType);
+		}
+		return null;
+	}
+
+	@Override
+	public Class[] getAdapterList() {
+		return null;
+	}
+
+}

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

Added: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/ReadOnlyProperties.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/ReadOnlyProperties.java?rev=1511345&view=auto
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/ReadOnlyProperties.java
(added)
+++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/ReadOnlyProperties.java
Wed Aug  7 14:54:40 2013
@@ -0,0 +1,82 @@
+/*
+ * 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.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+public class ReadOnlyProperties implements IPropertySource {
+	
+	private Map<String, String> properties = new HashMap<String, String>();
+	
+	public ReadOnlyProperties() {
+		
+	}
+	
+	public ReadOnlyProperties(Map<String, String> properties) {
+		this.properties.putAll(properties);
+	}
+	
+	@Override
+	public Object getEditableValue() {
+		return null;
+	}
+
+	@Override
+	public IPropertyDescriptor[] getPropertyDescriptors() {
+		final List<IPropertyDescriptor> result = new LinkedList<IPropertyDescriptor>();
+		for (Iterator<Map.Entry<String, String>> it = properties.entrySet().iterator();
it.hasNext();) {
+			Map.Entry<String, String> entry = it.next();
+			IPropertyDescriptor pd = new PropertyDescriptor(entry, entry.getKey());
+			result.add(pd);
+		}
+		return result.toArray(new IPropertyDescriptor[] {});
+	}
+
+	@Override
+	public Object getPropertyValue(Object id) {
+		Map.Entry<String, String> entry = (Map.Entry<String, String>)id;
+		return entry.getValue();
+	}
+
+	@Override
+	public boolean isPropertySet(Object id) {
+		return properties.containsKey(String.valueOf(id));
+	}
+
+	@Override
+	public void resetPropertyValue(Object id) {
+
+	}
+
+	@Override
+	public void setPropertyValue(Object id, Object value) {
+
+	}
+
+	public void add(String label, String value) {
+		properties.put(label, value);
+	}
+
+}

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

Added: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/SyncDir.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/SyncDir.java?rev=1511345&view=auto
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/SyncDir.java
(added)
+++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/SyncDir.java
Wed Aug  7 14:54:40 2013
@@ -0,0 +1,59 @@
+/*
+ * 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 org.apache.sling.ide.eclipse.ui.internal.SharedImages;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.swt.graphics.Image;
+
+/** WIP: model object for the syncDir [root] shown in the content package view in project
explorer **/
+public class SyncDir extends JcrNode {
+
+	private final IFolder folder;
+
+	public SyncDir(IFolder folder) {
+		if (folder==null) {
+			throw new IllegalArgumentException("folder must not be null");
+		}
+		this.folder = folder;
+		setResource(folder);
+	}
+	
+	@Override
+	public Image getImage() {
+		return SharedImages.SLING_ICON.createImage();
+	}
+
+	public String getLabel() {
+		return folder.getProjectRelativePath()+" [sling synched]";
+	}
+	
+	@Override
+	public String getDescription() {
+		return folder.getProjectRelativePath().toString() + "[jcr root]";
+	}
+
+	public IFolder getFolder() {
+		return folder;
+	}
+	
+	@Override
+	public String getName() {
+		return "/";
+	}
+
+}

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



Mime
View raw message