W ramach tego krótkiego wpisu postaram się omówić tworzenie własnego zadania, wykorzystywanego w narzędziu Apache ANT. W internecie aż kipi od tutoriali omawiających tworzenie własnych tasków dla narzędzia ANT. Nie mniej jednak większość z nich jest nieaktualna, bądź mało szczegółowa, szczególnie jeśli chodzi o współpracę z API Eclipse.
1. Po co nam własne zadania.
Ant jako narzędzie do budowania definiuje serie tasków które odpowiadają za podstawowe zadania związane z budowaniem i wdrażaniem oprogramowania. Wśród dostępnych zadań możemy znaleźć te typowe, służące do kopiowania zasobów, czy kompilacji, podpisywania jarów itp. (lista taksów dostępna jest pod adresem ) Nie mniej jednak domyślny zasób tasków anta może być niewystarczający do bardziej zaawansowanych rozwiązań, takich jak np budowanie pluginów Eclipse. Z pomocą w tym wypadku przychodzi dodatkowa biblioteka o nazwie Ant contrib, która dostarcza dodatkowe taski, które znacząco ułatwiają tworzenie skryptów (np: Budowanie warunkowe z użyciem if, regexpy itp). Jeśli mimo tego twój skrypt zawiera pewne niedoskonałości lub uproszczenia to należało by rozważyć możliwość stworzenia własnego zadania.
2. Wymagania
Eclipse wraz z pluginem org.apache.ant.
(Testowane na dystrybucji Eclipse PDE 3.6.2)
3. Task formatujący lokalizacje
W tutorialu tworzymy task który sformatuje lokalizacje usuwając znaki przejścia do katalogów wyższych. Standardowo ant posiada taki mechanizm (http://ant.apache.org/manual/Tasks/property.html) jednak jest to dobry przykład wykorzystania tasków w połączeniu z platformą Eclipse.
Kod klasy obsługującej zadanie prezentuje się następująco:
import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; public class NormalizePath extends Task { AntLogAdapter fLogAdapter; private String fDir = ""; private String fSkipPoints="1"; protected String fResultProperty=""; /** * String represents dir locations for example C:/temp/data * @param baseDir */ public void setDir(String baseDir) { this.fDir = baseDir; } /** * Used to set return property. This property should have url like C:/temp/ * @param property */ public void setProperty(String property) { this.fResultProperty=property; } /** * Number of segments to skip * @param fSkipPoints */ public void setSegments(String fSkipPoints) { this.fSkipPoints = fSkipPoints; } public void execute() throws BuildException { try { fLogAdapter=new AntLogAdapter(this); validateAtributes(); generateResult(); fLogAdapter=new AntLogAdapter(null); } catch (Exception e) { throw new BuildException(e.getMessage().toString()); } } private void validateAtributes() { if(fDir.length()==0){ throw new BuildException("Dir must be specified using the dir attribute"); } else if(fResultProperty.length()==0){ throw new BuildException("Property must be specified using the property attribute."); } } public void generateResult() { IPath path=new Path(fDir); Integer segmentsToRemove = Integer.valueOf(fSkipPoints); IPath finalPath = path.removeLastSegments(segmentsToRemove); if(getProject() !=null){ getProject().setProperty(fResultProperty, finalPath.toOSString()); } } @Override public String getTaskType() { return "normalize.path"; } }
Zadanie ma na celu usunięcie części segmentów z adresu URI wprowadzonego jako paramter.
Pola typu string oznaczają parametry wejściowe. Najważniejszym elementem klasy jest funkcja execute, która waliduje oraz usuwa segmenty.
Parametry wejściowe zadania to:
lokalizacja - reprezentowana poprzez zmienną fDir.
ilość segmentów do usunięcia - fSkipPoints
nazwa zmiennej zwracającej wynik fResultProperty
Aby przetestować klasę musimy utworzyć obiekt pośredni który udostępni nam środowisko testowe przypominające wywołanie tasku poprzez anta:
import org.apache.tools.ant.Project; import pl.com.astec.mdt.ant.tasks.NormalizePath; public class NormalizePathMock extends NormalizePath{ private Project tempProject; @Override public Project getProject() { if(tempProject==null) tempProject = new Project(); return tempProject; } public String getResult() { if(tempProject!=null && fResultProperty!=null){ return tempProject.getProperty(fResultProperty); } return ""; } }
Na sam koniec prosta klasa testowa stanowiąca przykład wykorzystania zadania
public class NormalizePathTest { NormalizePathMock task=new NormalizePathMock(); @Test public void testGenerateResult() { String baseDir = "C://temp/testdir/removed_folder"; Path expected=new Path("C://temp/testdir"); task.setDir(baseDir); task.setProperty("test"); task.generateResult(); Path actual=new Path(task.getResult()); Assert.assertTrue(actual.equals(expected)); } }
Brak komentarzy:
Prześlij komentarz