Modified: sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNode.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNode.java?rev=1522808&r1=1522807&r2=1522808&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNode.java (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNode.java Fri Sep 13 08:14:36 2013 @@ -16,8 +16,10 @@ */ package org.apache.sling.ide.eclipse.ui.nav.model; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.Arrays; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -30,7 +32,8 @@ import javax.xml.parsers.ParserConfigura import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; -import org.apache.sling.ide.eclipse.ui.internal.SharedImages; +import org.apache.sling.ide.eclipse.ui.WhitelabelSupport; +import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; @@ -41,11 +44,19 @@ import org.eclipse.core.resources.mappin import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.IActionFilter; import org.eclipse.ui.IContributorResourceAdapter; +import org.eclipse.ui.PlatformUI; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.eclipse.ui.views.properties.IPropertySource; +import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor; +import org.w3c.dom.Element; import org.w3c.dom.Node; import org.xml.sax.Attributes; import org.xml.sax.InputSource; @@ -83,7 +94,7 @@ public class JcrNode implements IAdaptab private final static WorkbenchLabelProvider workbenchLabelProvider = new WorkbenchLabelProvider(); - GenericJcrRootFile underlying; + final GenericJcrRootFile underlying; JcrNode parent; @@ -95,20 +106,33 @@ public class JcrNode implements IAdaptab private boolean resourceChildrenAdded = false; - final ReadOnlyProperties properties = new ReadOnlyProperties(); + final ModifiableProperties properties = new ModifiableProperties(this); + + final Set<JcrNode> hiddenChildren = new HashSet<JcrNode>(); JcrNode() { // for subclass use only + if (this instanceof GenericJcrRootFile) { + this.underlying = (GenericJcrRootFile) this; + } else { + this.underlying = null; + } } - JcrNode(JcrNode parent, Node domNode) { + JcrNode(JcrNode parent, Node domNode, IResource resource) { + this(parent, domNode, parent.underlying, resource); + } + + + JcrNode(JcrNode parent, Node domNode, GenericJcrRootFile underlying, IResource resource) { 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; + this.underlying = underlying; + this.resource = resource; parent.addChild(this); } @@ -116,6 +140,60 @@ public class JcrNode implements IAdaptab public String toString() { return "JcrNode[dom:"+domNode+", file:"+resource+"]"; } + + @Override + public int hashCode() { + if (underlying==null) { + if (resource==null) { + if (domNode==null) { + return toString().hashCode(); + } else { + return domNode.toString().hashCode() + parent.hashCode(); + } + } else { + return resource.getFullPath().hashCode(); + } + } else { + return underlying.hashCode() + domNode.toString().hashCode(); + } + } + + @Override + public boolean equals(Object obj) { + if (this==obj) { + return true; + } + if (!(obj instanceof JcrNode)) { + return false; + } + JcrNode other = (JcrNode) obj; + if (other.underlying==null && underlying!=null) { + return false; + } else if (other.underlying!=null && underlying==null) { + return false; + } + if (underlying!=null && !underlying.equals(other.underlying)) { + return false; + } + if (resource!=null && other.resource!=null) { + if (resource.equals(other.resource)) { + return true; + } else { + return false; + } + } else if (resource!=null && other.resource==null) { + return false; + } else if (resource==null && other.resource!=null) { + return false; + } + if (parent!=null && other.parent!=null) { + if (!parent.equals(other.parent)) { + return false; + } + return domNode.toString().equals(other.domNode.toString()); + } + return toString().equals(obj.toString()); + } protected void addChild(JcrNode jcrNode) { children.add(jcrNode); @@ -148,11 +226,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();) { @@ -188,9 +281,13 @@ public class JcrNode implements IAdaptab } for (Iterator it = membersList.iterator(); it.hasNext();) { IResource iResource = (IResource) it.next(); - JcrNode node = new JcrNode(this, (Node)null); - node.setResource(iResource); - node.init(); + 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(); resultMap.put(node.getName(), node); @@ -200,22 +297,22 @@ public class JcrNode implements IAdaptab } resourceChildrenAdded = true; - return resultMap.values().toArray(); + return filterHiddenChildren(resultMap.values()); } catch (CoreException e) { + e.printStackTrace(); return new Object[0]; } catch (ParserConfigurationException e) { + e.printStackTrace(); return new Object[0]; } catch (SAXException e) { + e.printStackTrace(); return new Object[0]; } catch (IOException e) { + e.printStackTrace(); return new Object[0]; } } - protected void init() { - // placeholder for initializing any common properties - } - private boolean isVaultFile(IResource iResource) throws ParserConfigurationException, SAXException, IOException, CoreException { @@ -256,6 +353,13 @@ public class JcrNode implements IAdaptab } else try { if (!isVaultFile(resource)){ + final String jcrMimeType = getJcrContentProperty("jcr:mimeType"); + if (jcrMimeType!=null && jcrMimeType.length()!=0) { + ImageDescriptor desc = getImageDescriptor(resource.getName(), jcrMimeType); + if (desc!=null) { + return desc.createImage(); + } + } return workbenchLabelProvider.getImage(resource); } } catch (ParserConfigurationException e) { @@ -276,7 +380,35 @@ public class JcrNode implements IAdaptab // return workbenchLabelProvider.getImage(domNode); //} - return SharedImages.SLING_ICON.createImage(); + return WhitelabelSupport.JCR_NODE_ICON.createImage(); + } + + private ImageDescriptor getImageDescriptor(String filename, String jcrMimeType) { + final String modifiedFilename; + if (jcrMimeType.equals("image/jpeg")) { + modifiedFilename = filename + ".jpg"; + } else if (jcrMimeType.contains("/")) { + modifiedFilename = filename + "." + (jcrMimeType.substring(jcrMimeType.indexOf("/")+1)); + } else { + return null; + } + return PlatformUI.getWorkbench().getEditorRegistry().getImageDescriptor(modifiedFilename, null); + } + + private String getJcrContentProperty(String propertyKey) { + final Object[] chldrn = getChildren(); + for (int i = 0; i < chldrn.length; i++) { + JcrNode jcrNode = (JcrNode) chldrn[i]; + if ("jcr:content".equals(jcrNode.getName())) { + if (jcrNode.properties!=null) { + Object propertyValue = jcrNode.properties.getValue(propertyKey); + if (propertyValue!=null) { + return String.valueOf(propertyValue); + } + } + } + } + return null; } public String getName() { @@ -305,14 +437,41 @@ public class JcrNode implements IAdaptab @Override public Object getAdapter(Class adapter) { final Object result = doGetAdapter(adapter); - if (result==null) { - // System.out.println("adapter looked for: "+adapter+", result: "+result); - } + //if (result==null) { + //System.out.println("adapter looked for: "+adapter+", result: "+result); + //} return result; } private Object doGetAdapter(Class adapter) { - if (adapter==IPropertySource.class) { + if (adapter==IActionFilter.class) { + return new IActionFilter() { + + @Override + public boolean testAttribute(Object target, String name, String value) { + if (!(target instanceof JcrNode)) { + return false; + } + final JcrNode node = (JcrNode)target; + if ("domNode".equals(name)) { + return node.domNode!=null; + } + if ("nonDomNode".equals(name)) { + return node.domNode==null; + } + return false; + } + }; + } else if (adapter==ITabbedPropertySheetPageContributor.class && "christmas".equals("christmas")) { + return new ITabbedPropertySheetPageContributor() { + + @Override + public String getContributorId() { + return "org.apache.sling.ide.eclipse-ui.propertyContributor1"; + } + + }; + } else if (adapter==IPropertySource.class) { return properties; } else if (adapter == IFile.class) { if (resource instanceof IFile) { @@ -321,9 +480,9 @@ public class JcrNode implements IAdaptab return null; } } else if (adapter == IContributorResourceAdapter.class) { - if (resource==null) { - return null; - } + //if (resource==null) { + // return null; + //} return new IContributorResourceAdapter() { @Override @@ -334,34 +493,46 @@ public class JcrNode implements IAdaptab JcrNode node = (JcrNode)adaptable; if (node.resource!=null) { return node.resource; + } else { + return node.underlying.file; } - return null; +// return null; } }; } else if (adapter == IResource.class) { - return resource; + if (resource!=null) { + return resource; + } else { + return null;//underlying.file; + } } else if (adapter == ResourceMapping.class) { boolean t = true; if (!t) { return null; } - if (resource==null) { - 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) }; + if (resource!=null) { + return new ResourceTraversal[] { new ResourceTraversal(new IResource[] { resource }, IResource.DEPTH_INFINITE, IResource.NONE) }; + } else { + return new ResourceTraversal[] { new ResourceTraversal(new IResource[] { underlying.file }, IResource.DEPTH_INFINITE, IResource.NONE) }; + } } @Override public IProject[] getProjects() { if (resource!=null) { return new IProject[] {resource.getProject()}; + } else { + return new IProject[] {underlying.file.getProject()}; } - return null; +// return null; } @Override @@ -371,11 +542,99 @@ public class JcrNode implements IAdaptab @Override public Object getModelObject() { - return resource; + if (resource!=null) { + return resource; + } else { + return underlying.file; + } } }; } return null; } + public IFile getFileForEditor() { + if (resource instanceof IFile) { +// if (!isVaultFile(resource)) { + return (IFile)resource; + } else if (resource instanceof IContainer) { + return null; + } else if (underlying!=null && underlying.file!=null) { + return underlying.file; + } else { + return null; + } + } + + public void rename(String string) { + if (domNode!=null && underlying!=null) { + domNode.getOwnerDocument().renameNode(domNode, domNode.getNamespaceURI(), string); + underlying.save(); + } + } + + public boolean canBeRenamed() { + if (resource!=null) { + return false; + } + if (domNode!=null && underlying!=null) { + if (domNode.getNodeName().equals("jcr:content")) { + return false; + } + return true; + } + return false; + } + + public JcrNode getParent() { + return parent; + } + + IResource getResource() { + return resource; + } + + public void createChild(String nodeName) { + if (domNode==null) { + // then we're not in the context of a .content.xml file yet + // so we need to create one + final String minimalContentXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><jcr:root xmlns:sling=\"http://sling.apache.org/jcr/sling/1.0\" xmlns:jcr=\"http://www.jcp.org/jcr/1.0\"/>"; + if (resource instanceof IFolder) { + IFolder folder = (IFolder)resource; + IFile file = folder.getFile(nodeName+".xml"); + try { + file.create(new ByteArrayInputStream(minimalContentXml.getBytes()), true, new NullProgressMonitor()); + } catch (CoreException e) { + //TODO proper logging + e.printStackTrace(); + } + } else { + MessageDialog.openInformation(Display.getDefault().getActiveShell(), + "Cannot create JCR node on a File", "Creating a JCR node on a File is not yet supported"); + } + } else { + try{ + Element element = domNode.getOwnerDocument().createElement(nodeName); + element.setAttribute("jcr:primaryType", "nt:unstructured"); + Node childDomNode = domNode.appendChild(element); + JcrNode childNode = new JcrNode(this, childDomNode, null); + underlying.save(); + } catch(Exception e) { + MessageDialog.openError(Display.getDefault().getActiveShell(), "Error creating new JCR node", "The following error occurred: "+e.getMessage()); + } + } + } + + public void delete() { + if (parent==null) { + // then I dont know how to delete + return; + } + parent.children.remove(this); + if (domNode!=null) { + domNode.getParentNode().removeChild(domNode); + } + underlying.save(); + } + }
Modified: sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/SyncDir.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/SyncDir.java?rev=1522808&r1=1522807&r2=1522808&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/SyncDir.java (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/SyncDir.java Fri Sep 13 08:14:36 2013 @@ -17,6 +17,7 @@ package org.apache.sling.ide.eclipse.ui.nav.model; import org.apache.sling.ide.eclipse.ui.internal.SharedImages; +import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.swt.graphics.Image; @@ -34,6 +35,20 @@ public class SyncDir extends JcrNode { } @Override + public int hashCode() { + return folder.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof SyncDir) { + SyncDir other = (SyncDir) obj; + return folder.equals(other.folder); + } + return false; + } + + @Override public Image getImage() { return SharedImages.SLING_ICON.createImage(); } @@ -55,5 +70,10 @@ public class SyncDir extends JcrNode { public String getName() { return "/"; } + + @Override + public IFile getFileForEditor() { + return null; + } } Propchange: sling/branches/tooling-ide-vlt/tooling/ide/m2e-feature/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Fri Sep 13 08:14:36 2013 @@ -0,0 +1,5 @@ +target + +.settings + +.project Modified: sling/branches/tooling-ide-vlt/tooling/ide/p2update/category.xml URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/p2update/category.xml?rev=1522808&r1=1522807&r2=1522808&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/p2update/category.xml (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/p2update/category.xml Fri Sep 13 08:14:36 2013 @@ -3,5 +3,8 @@ <feature url="features/org.apache.sling.ide.feature_0.0.1.qualifier.jar" id="org.apache.sling.ide.feature" version="0.0.1.qualifier"> <category name="sling"/> </feature> + <feature url="features/org.apache.sling.ide.m2e-feature_0.0.1.qualifier.jar" id="org.apache.sling.ide.m2e-feature" version="0.0.1.qualifier"> + <category name="sling"/> + </feature> <category-def name="sling" label="Sling"/> </site> Modified: sling/branches/tooling-ide-vlt/tooling/ide/pom.xml URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/pom.xml?rev=1522808&r1=1522807&r2=1522808&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/pom.xml (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/pom.xml Fri Sep 13 08:14:36 2013 @@ -19,6 +19,8 @@ <module>eclipse-core</module> <module>eclipse-ui</module> <module>feature</module> + <module>eclipse-m2e-ui</module> + <module>m2e-feature</module> <module>p2update</module> </modules> Modified: sling/branches/tooling-ide-vlt/tooling/ide/target-definition/org.apache.sling.ide.target-definition.target URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/target-definition/org.apache.sling.ide.target-definition.target?rev=1522808&r1=1522807&r2=1522808&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/target-definition/org.apache.sling.ide.target-definition.target (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/target-definition/org.apache.sling.ide.target-definition.target Fri Sep 13 08:14:36 2013 @@ -1,21 +1,53 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<?pde version="3.8"?><target name="Sling IDE Tools" sequenceNumber="13"> +<?pde version="3.8"?> +<target name="Sling IDE Tools" sequenceNumber="23"> <locations> <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit"> -<unit id="org.eclipse.wst.server_adapters.feature.feature.group" version="3.2.100.v20110303-51EoAkF77g8HBSc"/> -<unit id="org.eclipse.jdt.feature.group" version="3.7.2.v20120120-1414-7z8gFcuFMP7BW5XTz0jLTnz0l9B1"/> -<unit id="org.eclipse.platform.feature.group" version="3.7.2.v20120207-1839-9gF7UHPDFxGjd-PqDr2jX_4yKaumkoHTz04_q-q"/> -<unit id="org.eclipse.jst.enterprise_ui.feature.feature.group" version="3.3.2.v201111030500-7b7II1YFSK2WIuPRDEnExPV-RvTn"/> -<repository location="http://download.eclipse.org/releases/indigo"/> -</location> -<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit"> +<unit id="org.apache.commons.httpclient" version="3.1.0.v201012070820"/> <unit id="org.json" version="1.0.0.v201011060100"/> <unit id="org.apache.commons.io" version="2.0.1.v201105210651"/> <unit id="org.slf4j.api" version="1.6.4.v20120130-2120"/> <unit id="ch.qos.logback.slf4j" version="1.0.0.v20120123-1500"/> <unit id="org.apache.commons.collections" version="3.2.0.v201005080500"/> -<unit id="org.apache.commons.httpclient" version="3.1.0.v201012070820"/> <repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20120526062928/repository"/> </location> +<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit"> +<unit id="org.eclipse.m2e.feature.feature.group" version="1.4.0.20130601-0317"/> +<repository location="http://download.eclipse.org/technology/m2e/releases"/> +</location> +<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit"> +<unit id="org.eclipse.platform.feature.group" version="3.7.2.v20120207-1839-9gF7UHPDFxGjd-PqDr2jX_4yKaumkoHTz04_q-q"/> +<unit id="org.eclipse.jdt.feature.group" version="3.7.2.v20120120-1414-7z8gFcuFMP7BW5XTz0jLTnz0l9B1"/> +<unit id="org.eclipse.pde.feature.group" version="3.7.2.v20120120-1420-7b7rFUOFEx2Xnqafnpz0E--0"/> +<unit id="org.eclipse.wst.server_adapters.feature.feature.group" version="3.2.100.v20110303-51EoAkF77g8HBSc"/> +<unit id="org.eclipse.jst.enterprise_ui.feature.feature.group" version="3.3.2.v201111030500-7b7II1YFSK2WIuPRDEnExPV-RvTn"/> +<unit id="org.eclipse.pde.api.tools.ee.fragments.feature.group" version="1.0.200.r37x_v20110803-7D-FHkFAFkNZZO9PfBZStN"/> +<unit id="org.eclipse.libra.facet.feature.feature.group" version="0.1.2.201202130952"/> +<repository location="http://download.eclipse.org/releases/indigo"/> +</location> +<location id="org.sonatype.tycho.m2e.feature" path="${eclipse_home}" type="Feature"/> +<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit"> +<unit id="org.eclipse.jst.web_ui.feature.feature.group" version="3.3.2.v201112072049-7F7AFO7C25ToiIbpoiuW12GT78Mciy6W7iwuxaco"/> +<unit id="org.eclipse.wst.common_core.feature.feature.group" version="3.3.2.v201111030500-7B7DFO9F7RZHOhIjR6Mz-NJ"/> +<unit id="org.eclipse.wst.web_core.feature.feature.group" version="3.3.2.v201111030500-7E7EFMcAJvn8cwW45JTLsz-TCw6tofoJ"/> +<unit id="org.eclipse.wst.common_ui.feature.feature.group" version="3.3.2.v201111030500-7C79FVsEdhO_sfog9oNekiJkS7Nz00OK"/> +<unit id="org.eclipse.wst.server_ui.feature.feature.group" version="3.3.2.v20111026_1748-7B79FBdAtJcez0EONePJUSNPjBC42"/> +<unit id="org.eclipse.wst.xml_core.feature.feature.group" version="3.3.2.v201112072049-7C7OFeMF7RZHQOIsNANyRc"/> +<unit id="org.eclipse.jst.server_adapters.ext.feature.feature.group" version="3.3.2.v20111010_1242-777HFHzCcNBDjCbIUfEEE3"/> +<unit id="org.eclipse.wst.server_userdoc.feature.feature.group" version="3.3.0.v20110512-20DF7w312215222664"/> +<unit id="org.eclipse.wst.xml_userdoc.feature.feature.group" version="3.3.0.v201102071641-50FYwAkF7B77UBZFDBL"/> +<unit id="org.eclipse.wst.server_adapters.feature.feature.group" version="3.2.100.v20110303-51EoAkF77g8HBSc"/> +<unit id="org.eclipse.wst.ws_wsdl15.feature.feature.group" version="1.5.301.v201102200555-2407w312123151655"/> +<unit id="org.eclipse.wst.server_core.feature.feature.group" version="3.3.2.v20111026_1748-30FBd8s7356394Ka2531"/> +<unit id="org.eclipse.wst.ws_userdoc.feature.feature.group" version="3.1.300.v201102200555-44FR79oB5855Q8IBD7G"/> +<unit id="org.eclipse.wst.web_userdoc.feature.feature.group" version="3.3.0.v201102200555-31Eo8s734B3E4H7799"/> +<unit id="org.eclipse.jst.web_core.feature.feature.group" version="3.3.2.v201112072049-7Q7DGLAFE9LeAHGQwz0Yz0Nmuitz01z01sRxi387"/> +<unit id="org.eclipse.wst.ws_core.feature.feature.group" version="3.3.1.v201108230355-7L7RFi8FGtGd-thsz0z0rQwh2766"/> +<unit id="org.eclipse.wst.ws_ui.feature.feature.group" version="3.3.2.v201112142348-7I7AFg1EtEoVFjz-98J1iuhhBz-uuWclgZtNHnEN"/> +<unit id="org.eclipse.jst.web_userdoc.feature.feature.group" version="3.3.1.v201108102009-2107w31211938"/> +<unit id="org.eclipse.jst.server_ui.feature.feature.group" version="3.3.0.v201102200555-7A6FHr9xFcAVCFLZBBJLIR43A"/> +<unit id="org.eclipse.jst.server_adapters.feature.feature.group" version="3.2.100.v20110303-208Z7w31211419"/> +<repository location="http://download.eclipse.org/releases/indigo"/> +</location> </locations> </target>