package com.attask.jenkins.scaffolding;
import com.thoughtworks.xstream.XStream;
import hudson.Extension;
import hudson.XmlFile;
import hudson.model.AbstractDescribableImpl;
import hudson.model.Descriptor;
import hudson.model.Hudson;
import hudson.model.Items;
import hudson.model.Jobs;
import hudson.model.Saveable;
import hudson.model.TopLevelItem;
import hudson.model.listeners.SaveableListener;
import hudson.util.XStream2;
import org.apache.commons.io.FileUtils;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
/**
* User: Joel Johnson
* Date: 6/20/12
* Time: 9:45 AM
*/
@ExportedBean
public class Scaffold extends AbstractDescribableImpl<Scaffold> implements Saveable {
private String name;
private List<String> jobNames;
private List<String> variables;
private Map<String,List<String>> childJobs;
private static final XStream XSTREAM = new XStream2();
public Scaffold(String name, Collection<String> jobNames, Collection<String> variables) {
this.name = name;
this.jobNames = new ArrayList<String>(jobNames);
this.variables = new ArrayList<String>(variables);
this.childJobs = new TreeMap<String, List<String>>();
}
private Scaffold(String name) {
this(name, Collections.<String>emptyList(), Collections.<String>emptyList());
}
public static Scaffold find(String name) throws IOException {
Scaffold scaffold = new Scaffold(name);
if (!scaffold.load()) {
scaffold = null;
}
return scaffold;
}
@Exported
public String getName() {
return name;
}
@Exported
public List<String> getJobNames() {
return jobNames;
}
@Exported
public List<String> getVariables() {
return variables;
}
@Exported
public Map<String,List<String>> getChildJobs() {
return childJobs;
}
@Override
public String toString() {
return "Scaffold{" +
"name='" + name + '\'' +
", jobNames=" + jobNames +
", variables=" + variables +
'}';
}
public void save() throws IOException {
getConfigFile().write(this);
SaveableListener.fireOnChange(this, getConfigFile());
}
public synchronized boolean load() throws IOException {
XmlFile config = getConfigFile();
if (config != null && config.exists()) {
config.unmarshal(this);
return true;
}
return false;
}
protected final XmlFile getConfigFile() {
return new XmlFile(XSTREAM, new File(getRootDir(), name + "/config.xml"));
}
protected static File getRootDir() {
return new File(Hudson.getInstance().getRootDir(), "Scaffolding");
}
public static Set<String> getAllNames() {
Set<String> result = new HashSet<String>();
File rootDir = getRootDir();
File[] directories = rootDir.listFiles(new FileFilter() {
public boolean accept(File file) {
return file.isDirectory();
}
});
if(directories != null) {
for (File directory : directories) {
result.add(directory.getName());
}
}
return result;
}
public static void delete(String name) {
File file = new File(getRootDir(), name);
if (file.exists() && file.isDirectory()) {
try {
FileUtils.forceDelete(file);
} catch (IOException e) {
throw new RuntimeException("Could not delete " + name, e); //Todo: make better exception
}
}
}
public void addChildJob(String suffix, String name) {
List<String> jobs = childJobs.get(suffix);
if (jobs == null) {
jobs = new ArrayList<String>();
}
jobs.add(name);
childJobs.put(suffix, jobs);
}
@Extension
public static final class DescriptorImpl extends Descriptor<Scaffold> {
@Override
public String getDisplayName() {
return "Scaffolding";
}
}
}