/** * <copyright> * * This program and the accompanying materials are made available under the * terms of the MIT license (X11 license) which accompanies this distribution. * * </copyright> */ package rtt.ant; import java.io.File; import java.util.LinkedList; import java.util.List; import java.util.Vector; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.Task; import org.apache.tools.ant.types.FileSet; import rtt.core.manager.Manager; import rtt.core.manager.Manager.TestCaseMode; import rtt.core.utils.RTTLogging; /** * This task is intended to update existing archives. <br> * An update can be adding, removing or changing tests and testsuites.<br> * No new results will be generated, if a testcase is changed.<br> * See {@link rtt.core.ant.UpdateTests} Task.<br> * <br> * Example:<br> * <br> * <pre> * <updateArchive * archive="path-to-archive"> * <testsuite name="name-of-testsuite" overwrite="false"> * <fileset dir="testfile-directory" casesensitive="yes"> * <include name="*.testcase"/> * </fileset> * </testsuite> * </updateArchive> * </pre> * * * @author Peter Mucha * */ public class UpdateArchive extends Task { public static class Testcase extends Task { private String testcase = null; private String testsuit = null; public Testcase() {} public String getTestsuit() {return testsuit;} public void setTestsuit(String testsuit) {this.testsuit = testsuit;} public String getTestcase() {return testcase;} public void setTestcase(String testcase) {this.testcase = testcase;} } public static class Testsuite extends Task { private String name; private boolean owrite = false; private Vector<FileSet> filesets = new Vector<FileSet>(); public Testsuite() {} public String getName() {return name;} public void setName(String name) {this.name = name;} public boolean isOverwrite() {return owrite;} public void setOverwrite(boolean owrite) {this.owrite = owrite;} public void addFileSet(FileSet fileset) { if (!filesets.contains(fileset)) filesets.add(fileset); } public List<File> getFiles() { List<File> result = new LinkedList<File>(); int filesProcessed = 0; DirectoryScanner ds; for (FileSet fileset : filesets) { ds = fileset.getDirectoryScanner(getProject()); File dir = ds.getBasedir(); String[] filesInSet = ds.getIncludedFiles(); for (String filename : filesInSet) { File file = new File(dir, filename); result.add(file); filesProcessed++; } } return result; } } private String archive = null; private List<Testsuite> toUpdate = new LinkedList<Testsuite>(); private List<Testcase> toRemove = new LinkedList<Testcase>(); private String log = null; public String getArchive() {return archive;} public void setArchive(String archive) {this.archive = archive;} public void addTestsuite(Testsuite ts) {toUpdate.add(ts);} public void addRemoveTest(Testcase tc) {toRemove.add(tc);} public String getLog() {return log;} public void setLog(String log) {this.log = log;} public void execute() throws BuildException { Manager m = null; File archiveFile = new File(archive); try { m = new Manager(archiveFile, true); m.loadArchive(archiveFile); RTTLogging.info("Archive loaded"); for (Testsuite t : toUpdate) { TestCaseMode mode = t.isOverwrite() ? TestCaseMode.OVERWRITE : TestCaseMode.SKIP; List<File> fs = t.getFiles(); // Create test suite, iff it does not exist yet: m.createTestSuite(t.name); // Add new or changed test cases: m.addAllFiles(fs, t.name, mode); } for (Testcase tc : toRemove) m.removeTest(tc.testsuit, tc.testcase); RTTLogging.info("Save archive to: "+ archive); m.saveArchive(new File(archive)); } catch (Exception e) { e.printStackTrace(); throw new BuildException(e); } finally { if (log != null) { try { m.exportLog(new File(log)); } catch (Exception e) { e.printStackTrace(); } } } } }