package configurationslicing;
import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import hudson.Extension;
import hudson.ExtensionList;
import hudson.ExtensionPoint;
import hudson.model.Descriptor;
import hudson.model.Hudson;
import hudson.model.ManagementLink;
import hudson.model.Descriptor.FormException;
import hudson.tasks.Builder;
@Extension
public class ConfigurationSlicing extends ManagementLink {
@Override
public String getDescription() {
return "Configure a single aspect across a group of items, in contrast to the traditional configuration of all aspects of a single item";
}
@Override
public String getIconFileName() {
return "orange-square.gif";
}
@Override
public String getUrlName() {
return "slicing";
}
public String getDisplayName() {
return "Configuration Slicing";
}
public ExtensionList<Slicer> getAxes() {
return Hudson.getInstance().getExtensionList(Slicer.class);
}
public Object getDynamic(String token, StaplerRequest req, StaplerResponse rsp) {
Hudson.getInstance().checkPermission(Hudson.ADMINISTER);
for(Slicer s : getAxes()) {
if(s.getUrl().equals(token)) {
return new SliceExecutor(s);
}
}
return null;
}
public class SliceExecutor<T extends Slice,I> {
Slicer<T,I> slicer;
List<I> worklist;
List<I> changed;
T slice;
public SliceExecutor(Slicer<T, I> s) {
this.slicer = s;
execute();
}
private void execute() {
T accumulator = slicer.getInitialAccumulator();
worklist = slicer.getWorkDomain();
for(I item : worklist) {
accumulator = slicer.accumulate(accumulator, item);
}
slice= accumulator;
}
private List<I> transform(T newslice) {
List<I> ret = new ArrayList<I>();
worklist = slicer.getWorkDomain();
for(I item : worklist) {
if(slicer.transform(newslice, item))
ret.add(item);
}
return ret;
}
public ConfigurationSlicing getParent() {
return ConfigurationSlicing.this;
}
public T getSlice() {
return slice;
}
public List<I> getChanged() {
return changed;
}
public List<I> getWorklist() {
return worklist;
}
public void doSliceconfigSubmit( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException {
try {
T newslice = (T)slice.newInstance(req, req.getSubmittedForm());
transform(newslice);
this.slice = newslice;
rsp.forward(this, "changesummary", req);
} catch (FormException e) {
e.printStackTrace();
}
}
}
}