HTML

JIRA DEV

Az Atlassian termékek felhasználási területei, paraméterezésük és alkalmazásfejlesztési lehetőségeik. Esettanulmány és érdekességek a JIRA-ról, Confluence-ről, GreenHopper-ről és a hozzájuk kapcsolódó plugin fejlesztésről, egy kevés Scrum módszertannal fűszerezve.

Kérdéseket és észrevételeidet a lacimol kukatc gmail pont com címre tudod elküldeni.

Üdv:
lacimol ()

Legutóbbi bejegyzések

Nincs megjeleníthető elem

Címkék

JiraDevTutor

Nincs megjeleníthető elem

Friss topikok

17.
május

Jira plugin fejlesztés 5.

Active Objects - JIRA ORM |  lacimol

Az adatok kezelése a JIRA-ban

Az 5-ös verzió előtt a JIRA az OpenSymphony-tól átvett PropertySet interfészt használta az adatok tárolására, ami az adatokat kulcs/érték párok kapcsolatával írja le. Ez a megoldás jól használható rendszerbeállításoknál, de bonyolultabb szerkezeteknél (pl: entitiy) nagyon körülményes vele dolgozni. Az új tárolási elv az ORM, mellyel már valódi adatkapcsolatokat is könnyen le lehet írni OO módon, valamint egy esetleges adatbázis implementáció csere is egyszerűvé válik.

Active Objects

Az Active Objects egy új ORM (Objektum-relációs leképzés) réteg az Atlassian termékekben. Segítségével az eddigi PropertySet-es félmegoldás helyett valódi objektum alapú adatbázis leképzés alapján xml paraméterezéssel és annotációk megadásával tárolhatjuk és kezelhetjük adatainkat (hasonlóan a Hibernate-hez). Jelenlegi verziója a 0.22.1-es, de a korábbi verziók (pl: 0.19.7) is mennek JIRA 5 alatt.

Példák

Kezdeti lépésként a JIRA hivatalos AO oldalát és Matthew B. Doar által írt könyv a Practical JIRA Plugins egyik példáját vegyítettem. Így kerül a példába OneToMany adatbázis kapcsolat (egy Todo több Comment) és Webwork action a szervlet helyett. A fenti könyv és Atlassian tutorial részletesen leírja a szükséges lépéseket, így itt csak a fontosabbakat emelem ki.

ao.png

Paraméterezés

A pom.xml-ben és az atlassian-plugin.xml-ben a lenti kiegészítések után használható az ActiveObjects. Eclipse-ből érdemes az "atlas-mvn eclipse:eclipse" paranccsal frissíteni a függőségeket.

pom.xml részlet


	com.atlassian.activeobjects
    activeobjects-plugin
    0.19.7
    provided

atlassian-plugin.xml részlet


	The module configuring the Active Objects service used by this plugin
	hu.lacimol.tutorial.todo.Todo
	hu.lacimol.tutorial.todo.Comment



	Access to the Active Objects service

Implementáció

A vezérlést a TodoAction osztály végzi, melynek 3 lehetséges kimenete lehet: Todo lista (üres hívásnál), Todo létrehozás (Create hívásnál) és egyszerű keresés (Select hívásnál). A Todo / Comment osztály egy egyszerű bean (POJO), az adott adatbázis tábla mezőivel. Az Action osztály nem közvetlenül, hanem egy Service-en keresztül éri el az AO-t, amit a JIRA a konstruktoron keresztül automatikusan létrehoz. A OneToMany kapcsolat leírásához elég a collection-t tartalmazó osztályban (Todo) egy @OneToMany annotációt használnunk, és a kollekció elemeit alkotóban (Comment) egy getter-setter párost a Todo-ra.

TodoServiceImpl.java részlet

private final ActiveObjects ao;
public TodoServiceImpl(ActiveObjects ao) {
	this.ao = checkNotNull(ao);
}

@Override
public Todo create(String description) {
	final Todo todo = ao.create(Todo.class);
	todo.setDescription(description);
	todo.setComplete(false);
	todo.save();
	return todo;
}

@Override
public List<Todo> findAll() {
	return newArrayList(ao.find(Todo.class));
}

@Override
public List<Todo> find(String description) {
	return newArrayList(ao.find(Todo.class, Query.select().where("description = ?", description)));
}

@Override
public void addComment(Todo todo, String text) {
	Comment comment = ao.create(Comment.class);
	comment.setTodo(todo); // a OneToMany kapcsolat beállítása
	comment.setText(text);
	comment.save();
}

Teszt

A teszteléshez nem szükséges speciális adatbázis konfiguráció, csak néhány annotációt kell ott is megadnunk.

TodoServiceImpl annotáció

@RunWith(ActiveObjectsJUnitRunner.class)
@Jdbc(DynamicJdbcConfiguration.class)
@Data(TodoServiceImplTest.TodoServiceImplTestDatabaseUpdater.class)
public class TodoServiceImplTest {
...
}

TodoServiceImplTest log

--- Create test data ---
DEBUG - net.java.ao.sql                - CREATE TABLE PUBLIC.AO_000000_TODO (
    COMPLETE BOOLEAN,
    DESCRIPTION VARCHAR(255),
    ID INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
    PRIMARY KEY(ID)
)
DEBUG - net.java.ao.sql                - CREATE TABLE PUBLIC.AO_000000_COMMENT (
    ID INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
    TEXT VARCHAR(255),
    TODO_ID INTEGER,
    CONSTRAINT fk_ao_000000_comment_todo_id FOREIGN KEY (TODO_ID) REFERENCES PUBLIC.AO_000000_TODO(ID),
    PRIMARY KEY(ID)
)
DEBUG - net.java.ao.sql                - CREATE INDEX PUBLIC.index_ao_000000_comment_todo_id ON PUBLIC.AO_000000_COMMENT(TODO_ID)
DEBUG - net.java.ao.sql                - INSERT INTO AO_000000_TODO (ID) VALUES (NULL)
DEBUG - net.java.ao.sql                - UPDATE PUBLIC.AO_000000_TODO SET DESCRIPTION = ? WHERE ID = ?
DEBUG - net.java.ao.sql                - INSERT INTO AO_000000_COMMENT (ID) VALUES (NULL)
DEBUG - net.java.ao.sql                - UPDATE PUBLIC.AO_000000_COMMENT SET TEXT = ?,TODO_ID = ? WHERE ID = ?
DEBUG - net.java.ao.sql                - INSERT INTO AO_000000_COMMENT (ID) VALUES (NULL)
DEBUG - net.java.ao.sql                - UPDATE PUBLIC.AO_000000_COMMENT SET TEXT = ?,TODO_ID = ? WHERE ID = ?
--- Do test ---
DEBUG - net.java.ao.sql                - SELECT * FROM PUBLIC.AO_000000_COMMENT
DEBUG - net.java.ao.sql                - SELECT * FROM PUBLIC.AO_000000_TODO
DEBUG - net.java.ao.sql                - SELECT * FROM PUBLIC.AO_000000_COMMENT WHERE TODO_ID = ?
--- Do test ---
DEBUG - net.java.ao.sql                - SELECT * FROM PUBLIC.AO_000000_TODO
DEBUG - net.java.ao.sql                - INSERT INTO AO_000000_TODO (ID) VALUES (NULL)
DEBUG - net.java.ao.sql                - UPDATE PUBLIC.AO_000000_TODO SET DESCRIPTION = ?,COMPLETE = ? WHERE ID = ?
DEBUG - net.java.ao.sql                - SELECT * FROM PUBLIC.AO_000000_TODO
--- Do test ---
DEBUG - net.java.ao.sql                - SELECT * FROM PUBLIC.AO_000000_TODO
DEBUG - net.java.ao.sql                - INSERT INTO AO_000000_TODO (ID) VALUES (NULL)
DEBUG - net.java.ao.sql                - UPDATE PUBLIC.AO_000000_TODO SET DESCRIPTION = ? WHERE ID = ?
DEBUG - net.java.ao.sql                - INSERT INTO AO_000000_COMMENT (ID) VALUES (NULL)
DEBUG - net.java.ao.sql                - UPDATE PUBLIC.AO_000000_COMMENT SET TEXT = ?,TODO_ID = ? WHERE ID = ?
DEBUG - net.java.ao.sql                - INSERT INTO AO_000000_COMMENT (ID) VALUES (NULL)
DEBUG - net.java.ao.sql                - UPDATE PUBLIC.AO_000000_COMMENT SET TEXT = ?,TODO_ID = ? WHERE ID = ?
DEBUG - net.java.ao.sql                - SELECT * FROM PUBLIC.AO_000000_TODO
DEBUG - net.java.ao.sql                - SELECT * FROM PUBLIC.AO_000000_COMMENT WHERE TODO_ID = ?

Az ActiveObjects interfészen keresztül létrehozhatunk (create), lekérdezhetjük (get és find), megszámolhatjuk (count) és törölhetjük (delete) az adott rekordokat. A fenti módosítások letölthetők SVN-en keresztül és becsomagolva a blog GoogleCode oldaláról a JiraDevTutor projektből.

Címkék: jira plugin programozás orm

komment

süti beállítások módosítása