Title: [40576] trunk/hudson/plugins/configurationslicing/src/main/java/configurationslicing/executeshell: adding windows batch slicer

Diff

Added: trunk/hudson/plugins/configurationslicing/src/main/java/configurationslicing/executeshell/AbstractBuildCommandSlicer.java (0 => 40576)


--- trunk/hudson/plugins/configurationslicing/src/main/java/configurationslicing/executeshell/AbstractBuildCommandSlicer.java	                        (rev 0)
+++ trunk/hudson/plugins/configurationslicing/src/main/java/configurationslicing/executeshell/AbstractBuildCommandSlicer.java	2012-05-18 20:10:20 UTC (rev 40576)
@@ -0,0 +1,165 @@
+package configurationslicing.executeshell;
+
+import hudson.matrix.MatrixProject;
+import hudson.model.AbstractProject;
+import hudson.model.Descriptor;
+import hudson.model.Hudson;
+import hudson.model.Project;
+import hudson.tasks.Builder;
+import hudson.util.DescribableList;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import configurationslicing.UnorderedStringSlicer;
+
+/**
+ * @author Jacob Robertson
+ */
+public abstract class AbstractBuildCommandSlicer<B extends Builder> extends UnorderedStringSlicer<AbstractProject<?,?>> {
+
+    public AbstractBuildCommandSlicer(AbstractBuildCommandSliceSpec<B> spec) {
+        super(spec);
+    }
+
+    public static abstract class AbstractBuildCommandSliceSpec<B extends Builder> extends UnorderedStringSlicerSpec<AbstractProject<?,?>> {
+
+        public static final String NOTHING = "(nothing)";
+
+        public String getDefaultValueString() {
+            return NOTHING;
+        }
+
+        public String getName(AbstractProject<?, ?> item) {
+            return item.getName();
+        }
+
+        @Override
+        public boolean isMultipleItemsAllowed() {
+        	return true;
+        }
+        
+        public List<String> getValues(AbstractProject<?, ?> item) {
+            List<String> content = new ArrayList<String>();
+            DescribableList<Builder,Descriptor<Builder>> buildersList = getBuildersList(item);
+
+            List<B> builders = getConcreteBuildersList(buildersList);
+            for (B builder: builders) {
+                content.add(getCommand(builder));
+            }
+            if (content.isEmpty()) {
+            	content.add(NOTHING);
+            }
+
+            return content;
+        }
+        public abstract List<B> getConcreteBuildersList(DescribableList<Builder,Descriptor<Builder>> buildersList);
+        public abstract String getCommand(B builder);
+
+        @SuppressWarnings("unchecked")
+        public List<AbstractProject<?, ?>> getWorkDomain() {
+        	List<AbstractProject<?, ?>> list = new ArrayList<AbstractProject<?, ?>>();
+        	List<AbstractProject> temp = Hudson.getInstance().getItems(AbstractProject.class);
+        	for (AbstractProject p: temp) {
+        		if (p instanceof Project || p instanceof MatrixProject) {
+        			list.add(p);
+        		}
+        	}
+        	return list;
+        }
+        
+        @SuppressWarnings("unchecked")
+		private DescribableList<Builder,Descriptor<Builder>> getBuildersList(AbstractProject<?, ?> item) {
+        	if (item instanceof Project) {
+        		return ((Project) item).getBuildersList();
+        	} else if (item instanceof MatrixProject) {
+        		return ((MatrixProject) item).getBuildersList();
+        	} else {
+        		return null;
+        	}
+        }
+        public abstract B[] createBuilderArray(int len);
+        public abstract B createBuilder(String command);
+        
+        public boolean setValues(AbstractProject<?, ?> item, List<String> list) {
+            DescribableList<Builder,Descriptor<Builder>> buildersList = getBuildersList(item);
+            List<B> builders = getConcreteBuildersList(buildersList);
+            
+            int maxLen = Math.max(list.size(), builders.size());
+            B[] oldBuilders = createBuilderArray(maxLen);
+            B[] newBuilders = createBuilderArray(maxLen);
+
+            for (int i = 0; i < builders.size(); i++) {
+	            oldBuilders[i] = builders.get(i);
+            }
+
+            for (int i = 0; i < list.size(); i++) {
+	            String command = list.get(i);
+	            if(!command.equals(NOTHING) && !command.equals("")) {
+	            	if (oldBuilders[i] != null && getCommand(oldBuilders[i]).equals(command)) {
+	            		newBuilders[i] = oldBuilders[i];
+	            	} else {
+	            		newBuilders[i] = createBuilder(command);
+	            	}
+	            }
+            }
+            
+            // perform any replacements
+            for (int i = 0; i < maxLen; i++) {
+				if (oldBuilders[i] != null && newBuilders[i] != null && oldBuilders[i] != newBuilders[i]) {
+					replaceBuilder(buildersList, oldBuilders[i], newBuilders[i]);
+				}
+			}
+            
+            // add any new ones (should always add to the end, but might not if the original command was empty)
+            for (int i = 0; i < maxLen; i++) {
+				if (oldBuilders[i] == null && newBuilders[i] != null) {
+	                try {
+	                    buildersList.add(newBuilders[i]);
+	                } catch(java.io.IOException e) {
+	                    System.err.println("IOException Thrown add builder value");
+	                    return false;
+	                }
+				}
+			}
+            
+            // delete any old ones
+            for (int i = 0; i < maxLen; i++) {
+				if (oldBuilders[i] != null && newBuilders[i] == null) {
+                    try {
+	                	// the remove command will persist the project
+	                    buildersList.remove(oldBuilders[i]);
+	                } catch(java.io.IOException e) {
+	                    System.err.println("IOException Thrown removing builder value");
+	                    return false;
+	                }
+				}
+			}
+            
+            return true;
+        }
+
+        /**
+         * If we do other builders, publishers, etc - this should be the pattern to use.
+         * @throws IOException 
+         */
+        private boolean replaceBuilder(DescribableList<Builder,Descriptor<Builder>> builders, Builder oldBuilder, Builder newBuilder) {
+        	List<Builder> newList = new ArrayList<Builder>(builders.toList());
+        	for (int i = 0; i < newList.size(); i++) {
+    			Builder b = newList.get(i);
+    			if (b == oldBuilder) {
+    				newList.set(i, newBuilder);
+    			}
+    		}
+        	try {
+        		builders.replaceBy(newList);
+        		return true;
+            } catch(java.io.IOException e) {
+            	System.err.println("IOException Thrown replacing builder list");
+            	return false;
+            }
+        }
+    }
+}
+
Property changes on: trunk/hudson/plugins/configurationslicing/src/main/java/configurationslicing/executeshell/AbstractBuildCommandSlicer.java
___________________________________________________________________

Added: svn:mime-type

Modified: trunk/hudson/plugins/configurationslicing/src/main/java/configurationslicing/executeshell/ExecuteShellSlicer.java (40575 => 40576)


--- trunk/hudson/plugins/configurationslicing/src/main/java/configurationslicing/executeshell/ExecuteShellSlicer.java	2012-05-18 20:09:52 UTC (rev 40575)
+++ trunk/hudson/plugins/configurationslicing/src/main/java/configurationslicing/executeshell/ExecuteShellSlicer.java	2012-05-18 20:10:20 UTC (rev 40576)
@@ -1,174 +1,52 @@
 package configurationslicing.executeshell;
 
 import hudson.Extension;
-import hudson.matrix.MatrixProject;
-import hudson.model.AbstractProject;
 import hudson.model.Descriptor;
-import hudson.model.Hudson;
-import hudson.model.Project;
 import hudson.tasks.Builder;
 import hudson.tasks.Shell;
 import hudson.util.DescribableList;
 
-import java.io.IOException;
-import java.util.ArrayList;
 import java.util.List;
 
-import configurationslicing.UnorderedStringSlicer;
-
 /**
  * Slicer for the shell builder
  *
- * @author Victor Garcia <bravejo...@gmail.com> <vic...@tuenti.com>
+ * @author Victor Garcia <bravejo...@gmail.com> <vic...@tuenti.com>, Jacob Robertson
  */
 @Extension
-public class ExecuteShellSlicer extends UnorderedStringSlicer<AbstractProject<?,?>>{
+public class ExecuteShellSlicer extends AbstractBuildCommandSlicer<Shell> {
 
     public ExecuteShellSlicer() {
         super(new ExecuteShellSliceSpec());
     }
 
-    public static class ExecuteShellSliceSpec extends UnorderedStringSlicerSpec<AbstractProject<?,?>> {
+    public static class ExecuteShellSliceSpec extends AbstractBuildCommandSliceSpec<Shell> {
 
-        public static final String NOTHING = "(nothing)";
-
-        public String getDefaultValueString() {
-            return NOTHING;
-        }
-
         public String getName() {
             return "Execute shell slicer";
         }
 
-        public String getName(AbstractProject<?, ?> item) {
-            return item.getName();
-        }
-
         public String getUrl() {
             return "executeshellslicestring";
         }
-
         @Override
-        public boolean isMultipleItemsAllowed() {
-        	return true;
+        public Shell createBuilder(String command) {
+        	return new Shell(command);
         }
-        
-        public List<String> getValues(AbstractProject<?, ?> item) {
-            List<String> shellContent = new ArrayList<String>();
-            DescribableList<Builder,Descriptor<Builder>> buildersList = getBuildersList(item);
-
-            List<Shell> shells = buildersList.getAll(Shell.class);
-            for (Shell shell: shells) {
-                shellContent.add(shell.getCommand());
-            }
-            if (shellContent.isEmpty()) {
-            	shellContent.add(NOTHING);
-            }
-
-            return shellContent;
+        @Override
+        public Shell[] createBuilderArray(int len) {
+        	return new Shell[len];
         }
-
-        @SuppressWarnings("unchecked")
-        public List<AbstractProject<?, ?>> getWorkDomain() {
-        	List<AbstractProject<?, ?>> list = new ArrayList<AbstractProject<?, ?>>();
-        	List<AbstractProject> temp = Hudson.getInstance().getItems(AbstractProject.class);
-        	for (AbstractProject p: temp) {
-        		if (p instanceof Project || p instanceof MatrixProject) {
-        			list.add(p);
-        		}
-        	}
-        	return list;
+        @Override
+        public String getCommand(Shell builder) {
+        	return builder.getCommand();
         }
-        
-        @SuppressWarnings("unchecked")
-		private DescribableList<Builder,Descriptor<Builder>> getBuildersList(AbstractProject<?, ?> item) {
-        	if (item instanceof Project) {
-        		return ((Project) item).getBuildersList();
-        	} else if (item instanceof MatrixProject) {
-        		return ((MatrixProject) item).getBuildersList();
-        	} else {
-        		return null;
-        	}
+        @Override
+        public List<Shell> getConcreteBuildersList(
+        		DescribableList<Builder, Descriptor<Builder>> buildersList) {
+            return buildersList.getAll(Shell.class);
         }
 
-        public boolean setValues(AbstractProject<?, ?> item, List<String> list) {
-            DescribableList<Builder,Descriptor<Builder>> buildersList = getBuildersList(item);
-            List<Shell> shells = buildersList.getAll(Shell.class);
-            
-            int maxLen = Math.max(list.size(), shells.size());
-            Shell[] oldShells = new Shell[maxLen];
-            Shell[] newShells = new Shell[maxLen];
-
-            for (int i = 0; i < shells.size(); i++) {
-	            oldShells[i] = shells.get(i);
-            }
-
-            for (int i = 0; i < list.size(); i++) {
-	            String command = list.get(i);
-	            if(!command.equals(NOTHING) && !command.equals("")) {
-	            	if (oldShells[i] != null && oldShells[i].getCommand().equals(command)) {
-	            		newShells[i] = oldShells[i];
-	            	} else {
-	            		newShells[i] = new Shell(command);
-	            	}
-	            }
-            }
-            
-            // perform any replacements
-            for (int i = 0; i < maxLen; i++) {
-				if (oldShells[i] != null && newShells[i] != null && oldShells[i] != newShells[i]) {
-					replaceBuilder(buildersList, oldShells[i], newShells[i]);
-				}
-			}
-            
-            // add any new ones (should always add to the end, but might not if the original command was empty)
-            for (int i = 0; i < maxLen; i++) {
-				if (oldShells[i] == null && newShells[i] != null) {
-	                try {
-	                    buildersList.add(newShells[i]);
-	                } catch(java.io.IOException e) {
-	                    System.err.println("IOException Thrown add builder value");
-	                    return false;
-	                }
-				}
-			}
-            
-            // delete any old ones
-            for (int i = 0; i < maxLen; i++) {
-				if (oldShells[i] != null && newShells[i] == null) {
-                    try {
-	                	// the remove command will persist the project
-	                    buildersList.remove(oldShells[i]);
-	                } catch(java.io.IOException e) {
-	                    System.err.println("IOException Thrown removing shell value");
-	                    return false;
-	                }
-				}
-			}
-            
-            return true;
-        }
-
-        /**
-         * If we do other builders, publishers, etc - this should be the pattern to use.
-         * @throws IOException 
-         */
-        private boolean replaceBuilder(DescribableList<Builder,Descriptor<Builder>> builders, Builder oldBuilder, Builder newBuilder) {
-        	List<Builder> newList = new ArrayList<Builder>(builders.toList());
-        	for (int i = 0; i < newList.size(); i++) {
-    			Builder b = newList.get(i);
-    			if (b == oldBuilder) {
-    				newList.set(i, newBuilder);
-    			}
-    		}
-        	try {
-        		builders.replaceBy(newList);
-        		return true;
-            } catch(java.io.IOException e) {
-            	System.err.println("IOException Thrown replacing builder list");
-            	return false;
-            }
-        }
     }
 }
 

Added: trunk/hudson/plugins/configurationslicing/src/main/java/configurationslicing/executeshell/ExecuteWindowsBatchSlicer.java (0 => 40576)


--- trunk/hudson/plugins/configurationslicing/src/main/java/configurationslicing/executeshell/ExecuteWindowsBatchSlicer.java	                        (rev 0)
+++ trunk/hudson/plugins/configurationslicing/src/main/java/configurationslicing/executeshell/ExecuteWindowsBatchSlicer.java	2012-05-18 20:10:20 UTC (rev 40576)
@@ -0,0 +1,52 @@
+package configurationslicing.executeshell;
+
+import hudson.Extension;
+import hudson.model.Descriptor;
+import hudson.tasks.BatchFile;
+import hudson.tasks.Builder;
+import hudson.util.DescribableList;
+
+import java.util.List;
+
+/**
+ * Slicer for the windows batch builder
+ *
+ * @author Jacob Robertson
+ */
+@Extension
+public class ExecuteWindowsBatchSlicer extends AbstractBuildCommandSlicer<BatchFile> {
+
+    public ExecuteWindowsBatchSlicer() {
+        super(new ExecuteWindowsBatchSliceSpec());
+    }
+
+    public static class ExecuteWindowsBatchSliceSpec extends AbstractBuildCommandSliceSpec<BatchFile> {
+
+        public String getName() {
+            return "Execute Windows batch command slicer";
+        }
+
+        public String getUrl() {
+            return "windowsbatchslice";
+        }
+        @Override
+        public BatchFile createBuilder(String command) {
+        	return new BatchFile(command);
+        }
+        @Override
+        public BatchFile[] createBuilderArray(int len) {
+        	return new BatchFile[len];
+        }
+        @Override
+        public String getCommand(BatchFile builder) {
+        	return builder.getCommand();
+        }
+        @Override
+        public List<BatchFile> getConcreteBuildersList(
+        		DescribableList<Builder, Descriptor<Builder>> buildersList) {
+            return buildersList.getAll(BatchFile.class);
+        }
+
+    }
+}
+
Property changes on: trunk/hudson/plugins/configurationslicing/src/main/java/configurationslicing/executeshell/ExecuteWindowsBatchSlicer.java
___________________________________________________________________

Added: svn:mime-type

Reply via email to