Author: stefanegli
Date: Tue Sep 17 15:44:21 2013
New Revision: 1524099

URL: http://svn.apache.org/r1524099
Log:
SLING-3072 and SLING-2989 : as alternative to a combined command, filter 
directories if a corresponding .content.xml exists (.dir currently explicitly 
ignored - tbfixed). Also, not ignoring publish requests for bundles even if 
NO_CHANGE - that is a valid case for bundles as ./target might be ignored

Modified:
    
sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java

Modified: 
sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java
URL: 
http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java?rev=1524099&r1=1524098&r2=1524099&view=diff
==============================================================================
--- 
sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java
 (original)
+++ 
sling/branches/tooling-ide-vlt/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java
 Tue Sep 17 15:44:21 2013
@@ -21,9 +21,11 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.commons.httpclient.Credentials;
 import org.apache.commons.httpclient.HttpClient;
@@ -173,12 +175,6 @@ public class SlingLaunchpadBehaviour ext
             return;
         }
 
-        if (kind == IServer.PUBLISH_AUTO && deltaKind == 
ServerBehaviourDelegate.NO_CHANGE) {
-            System.out
-                    .println("Ignoring request to publish the module when no 
resources have changed; most likely another module has changed");
-            return;
-        }
-
         try {
             if (ProjectHelper.isBundleProject(module[0].getProject())) {
                 String serverMode = getServer().getMode();
@@ -189,6 +185,11 @@ public class SlingLaunchpadBehaviour ext
                        publishBundleModule(module, monitor);
                }
             } else if (ProjectHelper.isContentProject(module[0].getProject())) 
{
+                if (kind == IServer.PUBLISH_AUTO && deltaKind == 
ServerBehaviourDelegate.NO_CHANGE) {
+                    System.out
+                            .println("Ignoring request to publish the module 
when no resources have changed; most likely another module has changed");
+                    return;
+                }
                 try {
                     publishContentModule(kind, deltaKind, module, monitor);
                 } catch (SerializationException e) {
@@ -279,8 +280,6 @@ public class SlingLaunchpadBehaviour ext
                // otherwise fallback to old behaviour
                
                Repository repository = ServerUtil.getRepository(getServer(), 
monitor);
-
-        IModuleResource[] moduleResources = getResources(module);
         
         // TODO it would be more efficient to have a module -> filter mapping
         // it would be simpler to implement this in SlingContentModuleAdapter, 
but
@@ -289,8 +288,12 @@ public class SlingLaunchpadBehaviour ext
 
         switch (deltaKind) {
             case ServerBehaviourDelegate.CHANGED:
-                IModuleResourceDelta[] publishedResourceDelta = 
getPublishedResourceDelta(module);
-                for (IModuleResourceDelta resourceDelta : 
publishedResourceDelta) {
+                List<IModuleResourceDelta> publishedResourceDelta = 
+                       Arrays.asList(getPublishedResourceDelta(module));
+                
+                List<IModuleResourceDelta> adjustedPublishedResourceDelta = 
filterContentXmlParents(publishedResourceDelta);
+
+                for (IModuleResourceDelta resourceDelta : 
adjustedPublishedResourceDelta) {
 
                     StringBuilder deltaTrace = new StringBuilder();
                     deltaTrace.append("- processing delta kind ");
@@ -331,12 +334,15 @@ public class SlingLaunchpadBehaviour ext
 
             case ServerBehaviourDelegate.ADDED:
             case ServerBehaviourDelegate.NO_CHANGE: // TODO is this correct ?
-                for (IModuleResource resource : moduleResources) {
+                IModuleResource[] moduleResources1 = getResources(module);
+                List<IModuleResource> adjustedModuleResourcesList = 
filterContentXmlParents(moduleResources1);
+                for (IModuleResource resource : adjustedModuleResourcesList) {
                     execute(addFileCommand(repository, resource));
                 }
                 break;
             case ServerBehaviourDelegate.REMOVED:
-                for (IModuleResource resource : moduleResources) {
+                IModuleResource[] moduleResources2 = getResources(module);
+                for (IModuleResource resource : moduleResources2) {
                     execute(removeFileCommand(repository, resource));
                 }
                 break;
@@ -349,6 +355,63 @@ public class SlingLaunchpadBehaviour ext
 //        setServerPublishState(IServer.PUBLISH_STATE_NONE);
        }
 
+       private List<IModuleResourceDelta> filterContentXmlParents(
+                       List<IModuleResourceDelta> publishedResourceDelta) {
+               List<IModuleResourceDelta> adjustedPublishedResourceDelta = new 
LinkedList<IModuleResourceDelta>();
+               Map<String,IModuleResourceDelta> map = new HashMap<String, 
IModuleResourceDelta>();
+               for (IModuleResourceDelta resourceDelta : 
publishedResourceDelta) {
+                       
map.put(resourceDelta.getModuleRelativePath().toString(), resourceDelta);
+               }
+               for (Iterator<IModuleResourceDelta> it = 
publishedResourceDelta.iterator(); it
+                               .hasNext();) {
+                       IModuleResourceDelta iModuleResourceDelta = it.next();
+                       String resPath = 
iModuleResourceDelta.getModuleRelativePath().toString();
+                       if (resPath.contains(".dir")) {
+                               // filter those for the moment
+                               continue;
+                       }
+                       IModuleResourceDelta originalEntry = map.get(resPath);
+                       IModuleResourceDelta detailedEntry = map.remove(
+                                       resPath+"/.content.xml");
+                       if (detailedEntry!=null) {
+                               
adjustedPublishedResourceDelta.add(detailedEntry);
+                       } else if (originalEntry!=null) {
+                               
adjustedPublishedResourceDelta.add(originalEntry);
+                       }
+               }
+               return adjustedPublishedResourceDelta;
+       }
+
+       private List<IModuleResource> filterContentXmlParents(
+                       IModuleResource[] moduleResources) {
+               List<IModuleResource> moduleResourcesList = 
Arrays.asList(moduleResources);
+        List<IModuleResource> adjustedModuleResourcesList = new 
LinkedList<IModuleResource>();
+        Map<String,IModuleResource> map1 = new HashMap<String, 
IModuleResource>();
+        for (Iterator<IModuleResource> it = moduleResourcesList.iterator(); it
+                               .hasNext();) {
+               IModuleResource r = it.next();
+               map1.put(r.getModuleRelativePath().toString(), r);
+        }
+        for (Iterator<IModuleResource> it = moduleResourcesList.iterator(); it
+                               .hasNext();) {
+                       IModuleResource iModuleResource = it.next();
+                       String resPath = 
iModuleResource.getModuleRelativePath().toString();
+                       if (resPath.contains(".dir")) {
+                               continue;
+                       }
+                       IModuleResource originalEntry = map1.get(resPath);
+                       IModuleResource detailedEntry = 
map1.remove(resPath+"/.content.xml");
+               if (detailedEntry!=null) {
+                       adjustedModuleResourcesList.add(detailedEntry);
+               } else if (originalEntry!=null){
+                       adjustedModuleResourcesList.add(originalEntry);
+               } else {
+                       // entry was already added at filter time
+               }
+               }
+               return adjustedModuleResourcesList;
+       }
+
        private boolean runLaunchesIfExist(int kind, int deltaKind, IModule[] 
module,
                        IProgressMonitor monitor) throws CoreException {
                final IProject project = module[0].getProject();


Reply via email to