niedziela, 17 kwietnia 2011

Ant Toolbox: Ant Task with Eclipse Api.


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));
 }
}

piątek, 25 lutego 2011

Ecliballs - Kulki w Eclipse

W ramach nauki biblioteki Eclipse EMF powstał projekt Ecliballs pozwalający na grę w uproszczoną wersje popularnych kulek. Plugin działa na wszystkich wersjach Eclipse z rodziny 3.x
Aby uruchomić grę należy przejść do dialogu Show view (alt+shift+q,q) i wybrać element Ecliballs umieszczony w kategorii Games. Komentarze mile widziane.



W przyszłości chciałbym wprowadzić:
  •  bardziej rozbudowaną logikę gry (blokowanie kulek, czas gry itp),
  •  nasłuchiwanie preferencji tak aby ustawienia były aktualizowane automatycznie,
  •  usprawnienie grafiki. (integracja z draw2d).
  • zapisywanie modelu po zamknięciu widoku/eclipse, 

Instalacja wymaga rozpakowania folderu oraz użycia standardowego mechanizmu instalacji Eclipse
(Help > Install new software).

Link: ecliballs.zip lub ecliballs.zip lub ecliballs.zip lub ecliballs.zip

Ustawienia kontekstu dla Apache Tomcat

  1. Wprowadzenie
  2. Poniższy post ma za zadanie objaśnić specyfikę działania kontekstów dla aplikacji uruchamianych w ramach kontenera Tomcat. Do zarządzania projektami wdrożonymi na serwer tomcat będziemy wykorzystywać niestandardowy plugin Eclipse o nazwie Sysdeo Eclipse Tomcat Launcher: http://www.eclipsetotale.com/tomcatPlugin.html. Pozwala on m.in. na automatyczne uruchamianie serwera w trybie debug oraz wdrażanie bez konieczności bezpośredniego kopiowania projektów.
  3. Czym jest kontekst aplikacji 
  4. Kontekst jest elementem reprezentującym aplikacje webową, która działa w ramach określonego wirtualnego hosta. Każda aplikacja wdrożona na serwer tomcat musi być rozpoznawana poprzez odpowiedni adres URL, którego końcówka przyjmuje zazwyczaj nazwę aplikacji np: http://localhost:8080/my_app

    Więcej informacji o kontekstach na stronie: http://tomcat.apache.org/tomcat-4.0-doc/config/context.html

    Apache Tomcat pozwala na dwa rodzaje wdrożeń aplikacji. Pierwszą z nich jest wdrożenie poprzez umieszczenie projektu w postaci pliku war do katalogu CATALINA_BASE/webapps. Po "wychwyceniu" nowego pliku tomcat rozpakuje jego zawartość do katalogu odpowiadającego nazwie pliku oraz tworzy kontekst wykorzystując element DefaultContext  (http://tomcat.apache.org/tomcat-4.0-doc/config/defaultcontext.html) w pliku server.xml. Standardowo Tomcat nie posiada elementu DefaultContex, a wszystkie wdrożone aplikacje przyjmują kontekst domyślny odpowiadający ich nazwie. Drugim sposobem na wdrożenie aplikacji jest jawne zdefiniowanie kontekstu przy pomocy pliku xml opisującego kontekst aplikacji. Plik powinien być umieszczony w katalogu CATALINA_BASE/webapps lub CATALINA_BASE\conf\Catalina\localhost. Przykładowo:
    
    
    W tym przypadku aplikacja będzie dostępna pod adresem. http://localhost:8080/test. Kod źródłowy nie będzie wdrażany bezpośrednio do katalogu serwera, lecz pobierany bezpośrednio z workspace Eclipse
  5. Metody pozwalające na usunięcie kontekstu
  6. Aby odwoływać się do aplikacji poprzez adres pozbawiony części odpowiadającej za kontekst należy zdefiniować kontekst aplikacji jako /ROOT.
    
    
    Dzięki temu wszystkie strony oraz serwlety będą dostępne bezpośrednio pod adresem http://localhost:8080. Definicja takiego kontekstu przysłoni standardową stronę serwera Tomcat. W przypadku gdy korzystamy z pluginu Eclipse Tomcat Launcher mamy możliwość podania nazwy kontekstu bezpośrednio w wizardzie nowego projektu. Zmiana ustawień dla istniejących projektów opiera się na edycji pliku .tomcatplugin znajdującego się w katalogu głównym.
    
        /
        false
        true
        false
        true
        
        
        /ROOT
    
    
    Po edycji pliku należy zaktualizować kontekst poprzez wywołanie komendy Tomcat Project >> Update this context definition w menu kontekstowym projektu. Wprowadzone zmiany wymagają restartu serwera. Ustawienia zostały przetestowane dla Tomcata w wersji 6.