Professional Documents
Culture Documents
Tervezői És Fejlesztői Környezetek (Maven, Ant, Gradle, GCP, OSGI, RCP)
Tervezői És Fejlesztői Környezetek (Maven, Ant, Gradle, GCP, OSGI, RCP)
környezetek
Jakab Hunor
Bevezetõ
Build rendszerek
Apache Ant
Repository
Management
Nexus
Jakab Hunor
Babeş–Bolyai Tudományegyetem
Matematika és Informatika Kar
1/42
Tematika
1
Meghatározás Jakab Hunor
Bevezetõ
Olyan programozási eszközök, könyvtárak és beállítások Fejlesztői környezetek
Repository
tesztelni. Management
Nexus
Főbb funkciók
I Szövegszerkesztés ( természetesen szintax
highlighting-gal )
I Help, context help, source code navigation
I Valamilyen build rendszer, sajátos projekt formátummal
I Hibakeresés ( debugging )
I Tesztelés
I Taszk és projekt menedzsment
8/42
Tervezői és fejlesztői
Fejlesztői környezetek fejlődése környezetek
1
Célkitűzések Jakab Hunor
Bevezetõ
I Kényelem, szoftver fejlesztési folyamat leegyszerűsítése Fejlesztői környezetek
I If you build something even an idiot can use, only an idiot Build rendszerek
Apache Ant
will use it.
Apache Maven
Repository
Korlátozó tényezők: Management
Nexus
I Számítógépek kapacitása
I Grafikus felületek hiánya
Néhány említésreméltó korai IDE
I 1983 Turbo Pascal
9/42
Tervezői és fejlesztői
Ms Visual Studio környezetek
Build rendszerek
service”-eken keresztül
Apache Ant
I Intellisense, beépített vizuális debugger, refactoring Apache Maven
Nexus
Kiegészítők
Visual assist ( Whole Tomato), Resharper stb.
Kiegészítők
I A Ms ökoszisztémán belüli fejlesztésre ösztönöz
I Verziókövetés, taszk menedzsment, hibajelentés és
javítás a Ms Team Foundation Service köré épül
I (Tight bounding) Visual Studio - TFS - Windows Server
10/42
Tervezői és fejlesztői
Közösségi projektek, Eclipse környezetek
1
Eclipse Jakab Hunor
Bevezetõ
I Nyílt forráskodú projekteken dolgozó közösség Fejlesztői környezetek
Apache Maven
I Eclipse projektek legismertebb tagja az Eclipse fejlesztői Repository
környezet Management
Nexus
Repository
I Automatikus kódformázás Management
átnevezések, áthelyezések)
I Automatikus kódgenerálás (getter/setter-ek,
konstruktorok, absztrakt metódusok, try-catch blokkok)
I Forrás részletek elrejtése, megjelenítése (folding)
I Java dokumentáció megmutatás popup ablakban
I Hívási fa és fordított hívási fa megjelenítése (melyik
metódust honnan hívják)
I Potenciális programozási problémák jelzése,
csoportosítása
I JUnit teszt futtatási lehetőségek
I Ant, Maven, Git támogatás (Kepler)
12/42
Tervezői és fejlesztői
Plugin szerkezet környezetek
1
Eclipse Jakab Hunor
Bevezetõ
I Nincs telepítője, nem tartalmazza a Java futási Fejlesztői környezetek
Apache Ant
I Plug-in-ek letöltésével és telepítésével bővíthető
Apache Maven
I Moduláris szerkezetű Repository
Management
Nexus
Sajátos build rendszerrel rendelkezik, viszont támogatja az
Ant, Maven és Gradle alapú fordítást is.
13/42
Tervezői és fejlesztői
NetBeans platform környezetek
1
Története Jakab Hunor
Bevezetõ
I Sun Microsystems tulajdona 1999-től, nyílt forráskódú Fejlesztői környezetek
Apache Maven
I Eredetileg Romanik Stanek Charles Uiversity diák Repository
fejlesztette egy projekt keretén belül Management
Nexus
I Teljes egészében java-ban íródott, a JavaBeans koncepció
köré épül
Főbb funkcionalitások:
I Ant-alapú projekt rendszer
I Maven támogatás
I Verziókövetés (CVS, Subversion, Mercurial Clearcase).
I Java SE (JavaFX), Java ME, web, EJB mobil
alkalmazások fejlesztése
I Szabadon bővíthető, platform független
I Java, Php, C/C++, HTML5 támogatás
14/42
Tervezői és fejlesztői
Code::Blocks környezetek
1
Története Jakab Hunor
Bevezetõ
I Ingyenes, nyílt forráskódú c/c++ ide, c++ es wxWidgets Fejlesztői környezetek
Apache Ant
I Fejlesztői csapat: The Code::Blocks team
Apache Maven
I 2008-ba jelent meg az első stabil kiadása Repository
Management
I Számos c++ compilert támogat. Nexus
Főbb tulajdonságai:
I Jól megtervezett kód szerkesztő
I Vizuális debugger
I wxSmith Gui designer
I Saját build rendszer és projekt állományok
I Makefile projekteket is képes kezelni
15/42
Tervezői és fejlesztői
Egyéb fejlesztői környezetek környezetek
1
I IntelliJ IDEA Jakab Hunor
I QTCreator Bevezetõ
Fejlesztői környezetek
I CodeLite Build rendszerek
Apache Maven
I KDevelop Repository
Management
I MonoDevelop
Nexus
I Rational Software Architect
I Xcode (Apple)
I Anjuta
I etc.
I webstorm
I android studio
I aptana studio (Ruby on rails)
16/42
Tervezői és fejlesztői
Build automatizáló eszközök környezetek
1
Build automation tool Jakab Hunor
Bevezetõ
A „fordítási”, „futáskész állapotba helyezés”-i folyamatok
Build rendszerek
automatizálását szolgálja Apache Ant
Apache Maven
Egy build rendszer által ellátott leggyakoribb feladatok: Repository
Management
I Erőforrások feldolgozása
Nexus
I Fordítás
I Csomagolás
I Tesztelés (teszt esetek végrehajtása, statisztikák
készítése)
I Telepítés ( deployment )
17/42
Tervezői és fejlesztői
Build automatizáló eszközök környezetek
1
Make alapú eszközök Jakab Hunor
Bevezetõ
I make, build,mk, nmake Microsoftstb. Build rendszerek
I Platform függőség ( platform specifikus utasítások Apache Ant
Repository
I Hatalmas méretű, nehezen karban tartható állományok, Management
18/42
Tervezői és fejlesztői
Apache Ant(Another neat tool) környezetek
Tulajdonságok:
1
Jakab Hunor
I Java-ban implementált build automation tool (hasonlít a
Bevezetõ
make-hez)
Build rendszerek
I Platform független
Apache Ant
I Open Source (Apache Software License) Apache Maven
Konfiguráció:
I Xml alapú leíró állomány build.xml
19/42
Tervezői és fejlesztői
Apache Ant(Another neat tool) környezetek
Apache Ant
I extension point (kiterjesztési pont)
Apache Maven
Repository
Feladat ( task ) Management
Nexus
Egy végrehajtási egység, vamilyen elemi feladatot hajt végre pl
( fordítás, teszt futtatás stb. ). A teljes rendelkezésre álló task
listát megnézhetjük itt: Lista
Pl1:
<javac srcdir="${src}" destdir="${build}" classpath="xyz.jar"
debug="on" source="1.4" />
Pl2:
<echo>This is a longer message </echo>
20/42
Tervezői és fejlesztői
Apache Ant(Another neat tool) környezetek
Apache Ant
I extension point (kiterjesztési pont)
Apache Maven
Repository
Target (cél) Management
Nexus
A feladatokat célokba csoportosíthatjuk, melyeket ant
segítségével futtathatunk. A különböző célokat külön is lehet
futtatni, vagy egymástól függővé tenni.
Pl:
<target name="compile">
<mkdir dir="build/classes"/>
<javac srcdir="src" destdir="build/classes"/>
</target>
21/42
Tervezői és fejlesztői
Apache Ant(Another neat tool) környezetek
Apache Ant
I extension point (kiterjesztési pont)
Apache Maven
Repository
Kiterjesztési Pont Management
Nexus
Hasonló egy cél-hoz, egy fázist képvisel a build folyamatból.
Nem tartalmaz feladatleírást, csupán célok csoportosítását
szolgálja
Pl:
<extension-point name="ready-to-compile"
depends="create-directory-layout"/>
<target name="generate-sources"
extensionOf="ready-to-compile"> ... </target>
22/42
Tervezői és fejlesztői
Apache Ant(Another neat tool) környezetek
Példa:
1
Jakab Hunor
Build rendszerek
<property name="src.dir" value="src"/>
Apache Ant
<property name="build.dir" value="build"/>
Apache Maven
<property name="classes.dir" value="${build.dir}/classes"/>
Repository
<property name="jar.dir" value="${build.dir}/jar"/> Management
<property name="main-class" value="oata.HelloWorld"/>
Nexus
<target name="clean">
<delete dir="${build.dir}"/>
</target>
<target name="compile">
<mkdir dir="${classes.dir}"/>
<javac srcdir="${src.dir}" destdir="${classes.dir}"/>
</target>
</project>
23/42
Tervezői és fejlesztői
Apache Maven környezetek
1
Maven koncepció Jakab Hunor
Bevezetõ
I Elsősorban Java alkalmazások fejlesztésénél használt Build rendszerek
„projekt menedzsment eszköz”, de számos más nyelvet is Apache Ant
támogat különböző plugin-eken keresztül: C#,Ruby Apache Maven
,Scala, C++ stb Repository
Management
I A Project Object Model koncepciója köré épül Nexus
24/42
Tervezői és fejlesztői
Apache Maven környezetek
1
Project Object Model Jakab Hunor
Bevezetõ
Egy szoftver project körülírása, egyértelmű azonosítókkal való Build rendszerek
ellátása. (kik a fejlesztői, milyen függőségei vannak, milyen Apache Ant
licensz alapján használható stb.). Apache Maven
A projekt tulajdonságainak leírását is magába foglalja. Repository
Management
Nexus
Ez a definíció a következő funkcionalitásokat teszi lehetővé:
I Dependency management
I Távoli szoftware komponens gyűjtemények használata
I Általánosan újrahasznosítható fordítási munkamenet
I Hordozhatóság, integrálhatóság ( pl. Eclipse, NetBeans,
IntelliJ projektek egységesítése)
I Szoftver komponensek egyszerű keresése, szűrése
25/42
Tervezői és fejlesztői
Apache Maven környezetek
Repository
I Előre meghatározott projekt szerkezetek ( konvenció Management
alapján) Nexus
26/42
Tervezői és fejlesztői
Példa környezetek
mvn archetype:generate
Bevezetõ
Apache Ant
I mvn: a maven parancs
Apache Maven
I archetype:generate: a maven cél (goal)
Repository
Management
I archetype: a maven plugin
Nexus
Archetype
Egy eredeti model vagy típus mely alapján hasonló
szoftveregységeket mintázhatunk. Egy úgynevezett prototípus
$ mvn archetype:generate -DgroupId=org.sonatype.mavenbook.simple \
-DartifactId=simple \
-Dpackage=org.sonatype.mavenbook
...
[INFO] [archetype:generate]
[INFO] artifact org.apache.maven.archetypes:maven-archetype-quickstart: \
checking for updates from central
27/42
Tervezői és fejlesztői
Példa környezetek
28/42
Tervezői és fejlesztői
Pluginok és célok környezetek
1
Plugin Jakab Hunor
Bevezetõ
Különböző célok kollekciója, ahol egy cél hasonlít egy ANT Build rendszerek
taszk-hoz. pl. jar, compile, surfire stb. Apache Ant
Apache Maven
Repository
Cél (goal) Management
Nexus
Egy specifikus feladat amelyet önállóan vagy más feladatokkal
együtt hajthatunk végre egy komplexebb build részeként.
29/42
Tervezői és fejlesztői
Maven életciklus környezetek
Apache Ant
30/42
Tervezői és fejlesztői
Maven alapértelmezett életciklus főbb fázisai környezetek
1
I validate - ellenőrzi a projekt helyességét és az összes Jakab Hunor
Apache Ant
I test - a lefordított forráskód tesztelése egy megfelelő teszt Apache Maven
keretrendszer segítségével Repository
Management
I package - a fordított kód becsomagolása a projektnek Nexus
megfelelő formátumú hordozható állományba
I integration-test - a csomag feldolgozása és egy olyan
környezetbe való helyezése ahol integrációs tesztek
futtathatóak
I verify - a csomag érvényességének ellenőrzése
I install - a csomag lokális repositoryba való telepítése
I deploy - a csomag távoli tárhelyre történő másolása
megosztás vagy üzembehelyezés céljából
31/42
Tervezői és fejlesztői
Maven életciklus környezetek
1
Jakab Hunor
Bevezetõ
Build rendszerek
Apache Ant
Apache Maven
Repository
Management
Nexus
32/42
Tervezői és fejlesztői
Maven életciklus környezetek
1
Jakab Hunor
Bevezetõ
Build rendszerek
Apache Ant
Apache Maven
Repository
Management
Nexus
33/42
Tervezői és fejlesztői
Függőség management környezetek
Kategóriák Bevezetõ
Build rendszerek
I Direkt függőségek Apache Ant
Repository
Management
Nexus
Függőségek kezelésének menete:
I függőség kikeresése:
junit:junit:3.8.1 → maven <dependency>
repo:/junit/junit/3.8.1/junit- <groupId>junit</groupId>
3.8.1.jar <artifactId>junit</artifactId>
<version>3.8.1</version>
I a függőség .jar letöltése <scope>test</scope>
I A tranzitív függőségek </dependency>
kikeresése letöltése a
POM alapján
34/42
Tervezői és fejlesztői
Maven függőségek környezetek
1
Felmerülő kérdések Jakab Hunor
Bevezetõ
I Honnan töltődnek le a függőségek ?
Build rendszerek
I Hol lesznek ezek lokálisan tárolva ? Apache Ant
hogyan? Repository
Management
Nexus
35/42
Tervezői és fejlesztői
Függőségek hatóköre környezetek
1
A lokális gyűjtemény (local repository) Jakab Hunor
Bevezetõ
Függőségeket általában csak a build egy adott fázisában van Build rendszerek
szükség Apache Ant
Apache Maven
Hatókörök jelentősége: Repository
Management
I test</scope> Nexus
36/42
Tervezői és fejlesztői
Maven függőségek környezetek
1
Jakab Hunor
Listing 1: pom.xml
Bevezetõ
37/42
Tervezői és fejlesztői
Maven repository management környezetek
1
A gyűjtemény fogalma Jakab Hunor
Bevezetõ
A collection of binary software artifacts and metadata stored in Build rendszerek
a defined directory structure which is used by clients such as Apache Ant
Apache Ivy or Maven to retrieve binaries during a build Apache Maven
process. Repository
Management
Nexus
Tulajdonságok:
I Végleges(RELEASE) és ideiglenes(SNAPSHOT) állapotú
állományokat tárolhat (Artifact)
I struktúrált elrendezést biztosít amely alapján a kliensek
hatékonyan tudnak benne keresni
I az elsődleges "artifact" típus a jar
I Bármilyen más típust tárolhat (dokumentációt, forráskódot
tartalmazó archívumok, könyvtárak stb)
I Egy tárolási, elérési és menedzselési platformot kínál (
artifact + metadata)
38/42
Tervezői és fejlesztői
Maven repository management környezetek
1
GAV koordináták Jakab Hunor
Bevezetõ
GAV) Group, ArtifactId, Version coordinate
Build rendszerek
Apache Ant
I groupId: logikai csoportokba szervezi a szoftver Apache Maven
39/42
Tervezői és fejlesztői
Gyűjtemény típusok környezetek
1
A központi gyűjtemény (RELEASE) Jakab Hunor
Bevezetõ
egy szoftverkomponens specifikus verziószámmal ellátott stabil Build rendszerek
kiadása. Egy release artifact és a hozzá tartozó POM statikus Apache Ant
objektumok a repositoryban, soha nem változnak. Apache Maven
Repository
Management
40/42
Tervezői és fejlesztői
Nexus repository manager környezetek
1
Előnyei Jakab Hunor
Bevezetõ
Lehetőséget ad saját repository létrehozására, külső Build rendszerek
reposiroty-k tükrözésére, cache-elésére, statisztikák Apache Ant
készítésére, projekt site-ok hosztolására stb. Jelentősen Apache Maven
Nexus
BBTE Nexus belső repository managere:
I http://pdae.cs.ubbcluj.ro/nexus
<mirror>
<id>Nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://pdae.cs.ubbcluj.ro/nexus/content/groups/public</url>
</mirror>
</mirrors>
41/42
DAO, Abstract DAO factory
Tervezői és fejlesztői
Data Access Object környezetek
4
Szerepe Jakab Hunor
Kapcsolódó fogalmak:
I Business object: adathozzáférést használó kódrészlet
“kliens”
I Data Source: az adathozzáférés alacsony szintű
implementációja pl: DriverManager
I Transfer object: Egy adat-egység átvitelére használt
model objektum (pl. Entity Bean)
3/9
Tervezői és fejlesztői
Data Access Object környezetek
4
Jakab Hunor
Problémák:
I Kliens direkt módon ismeri az implementáció részleteit
I Nincs egységesítve a különböző implementációkhoz való
hozzáférés
4/9
Tervezői és fejlesztői
Data Access Object környezetek
4
Jakab Hunor
5/9
Tervezői és fejlesztői
Data Access Object környezetek
4
Jakab Hunor
6/9
Tervezői és fejlesztői
DAO factory környezetek
4
Jakab Hunor
4
Jakab Hunor
Jakab Hunor
Lokalizáció és
nemzetköziesítés
ResourceBundle
Erőforrások
Maven-ben
Szerializáció
Babeş–Bolyai Tudományegyetem
Matematika és Informatika Kar
1/37
Tervezői és fejlesztői
Fogalmak környezetek
2
Nemzetköziesítés: Jakab Hunor
Java erőforrások
betöltése
Lokalizáció Erőforrások
Maven-ben
Az a folyamat melynek során egy nemzetköziesített Szerializáció
Locale
java.util.Locale egy földrajzi, politikai vagy kulturális régiót
azonosít. Három információdarab azonosít egyértelműen egy
"locale"-t:
I nyelv
I ország
I változat (opcionális)
Pl: fr (Francia), de_CH (Svájci német), en_US_POSIX (Angol). 2/37
Tervezői és fejlesztői
Fogalmak környezetek
2
Nemzetköziesítés: Jakab Hunor
Java erőforrások
betöltése
Lokalizáció Erőforrások
Maven-ben
Az a folyamat melynek során egy nemzetköziesített Szerializáció
Locale
java.util.Locale egy földrajzi, politikai vagy kulturális régiót
azonosít. Három információdarab azonosít egyértelműen egy
"locale"-t:
I nyelv
I ország
I változat (opcionális)
Pl: fr (Francia), de_CH (Svájci német), en_US_POSIX (Angol). 2/37
Tervezői és fejlesztői
Példák környezetek
Szerializáció
I dátum és pénznem formátum
Java Reflection API
Motiváció
Kiemelt jelentösége van Web-alkalmazások esetében, a web
globális természetéből adódóan.
Példa
I Web: http://www.cs.ubbcluj.ro
I Standalone: http://www.libreoffice.org
3/37
Tervezői és fejlesztői
Locale környezetek
https://www.iso.org/obp/ui/#search ResourceBundle
Java erőforrások
Locale l1 = new Locale("en","US"); betöltése
Maven-ben
Szerializáció
Java Reflection API
/** Listing all the available locales on the System
*/
import java.util.*;
import java.text.*;
public class Available {
static public void main(String[] args) {
Locale list[] = DateFormat.getAvailableLocales();
for (int i = 0; i < list.length; i++) {
System.out.println(list[i].getLanguage() + " "
+list[i].getCountry());
}
}
}
4/37
Tervezői és fejlesztői
Locale környezetek
2
Alapértelmezett érték megadása: Jakab Hunor
Lokalizáció és
a user.language és user.region rendszer tulajdonságok nemzetköziesítés
Java erőforrások
betöltése
Erőforrások
Maven-ben
/** Setting the default locale */
import java.util.*; Szerializáció
5/37
Tervezői és fejlesztői
Resource bundle környezetek
2
tárolás Jakab Hunor
Lokalizáció és
regionális adatok tárolása egy ResourceBundle nemzetköziesítés
Java erőforrások
betöltése
I Kulcs-érték párokat tárol Erőforrások
Maven-ben
I Properties file properties resource bundle Szerializáció
6/37
Tervezői és fejlesztői
Resource bundle környezetek
2
Jakab Hunor
if (args.length != 2) { Erőforrások
Maven-ben
language = new String("en");
country = new String("US"); Szerializáció
7/37
Tervezői és fejlesztői
Resource bundle propertiesbundle környezetek
2
Jakab Hunor
MessagesBundle.properties Lokalizáció és
greetings = Hello. nemzetköziesítés
farewell = Goodbye. ResourceBundle
inquiry = How are you?
Java erőforrások
betöltése
Erőforrások
MessagesBundle_de_DE.properties Maven-ben
greetings = Hallo. Szerializáció
farewell = Tschuss.
Java Reflection API
inquiry = Wie geht’s?
MessagesBundle_en_US.properties
greetings = Hello.
farewell = Goodbye.
inquiry = How are you?
MessagesBundle_fr_FR.properties
greetings = Bonjour.
farewell = Au revoir.
inquiry = Comment allez-vous?
8/37
Tervezői és fejlesztői
Resource bundle listresourcebundle környezetek
2
Jakab Hunor
Listing 2: "MessageBundle_fr_FR.class"
import java.util.*;
public class MessageBundle_fr_FR extends ListResourceBundle {
public Object[][] getContents() {
return contents; }
private Object[][] contents = {
{ "greetings", new String("Bonjour.") },
{ "farewell", new String("Au revoir.") },
{ "inquiry", new String("Comment allez-vous?") },
}; }
9/37
Tervezői és fejlesztői
List vs. property resourcebundle környezetek
ListResourceBundle Pro
2
Jakab Hunor
I bármilyen lokalizálható objektumot tartalmazhat
Lokalizáció és
nemzetköziesítés
I gyorsabban betöltődik mivel előre fordítva van
ResourceBundle
I megírható úgy, hogy bárhonnan betöltsön erőforrásokat, Java erőforrások
betöltése
akár adatbázisokból is
Erőforrások
I bármilyen krakterkészletet használhatunk benne Maven-ben
Szerializáció
ListResourceBundle Contra Java Reflection API
I Meg kell írni a java forrást nehézkes nem-programozók
számára
Propertyresource Pro
I Könnyen szerkeszthető
I Könnyen lokalizálható
Propertyresource Contra
I Csak karakterláncokkal használható
I Korlátozott karakterkészlet
10/37
Tervezői és fejlesztői
Erőforrások megtalálása környezetek
2
Keresés Jakab Hunor
11/37
Tervezői és fejlesztői
Erőforrások betöltése környezetek
2
Class vs. ClassLoader Jakab Hunor
Lokalizáció és
I Class.getResource() nemzetköziesítés
Java erőforrások
abszolút/relatív átalakítást betöltése
Erőforrások
Maven-ben
Szerializáció
}
12/37
Tervezői és fejlesztői
ResourceBundle vs. Properties környezetek
2
Használati esetek Jakab Hunor
Lokalizáció és
I ResourceBundle: i18, lehetővé teszi egy adott nemzetköziesítés
Megjegyzések:
I A betöltendő erőforrások általában be vannak ágyazva
bizonyos .jar állományokba
I A szükséges .jar állományok bekerülnek a classpath-ba
I Itt keresés csak a class vagy classloader metódusain
keresztül lehetséges
13/37
Tervezői és fejlesztői
Maven standard könyvtárstruktúra környezetek
2
src/main/java Application/Library sources Jakab Hunor
Erőforrások
Egyéb erőforrásokat tartalmazó könyvtárak hozzáadhatóak a
build-hez a maven resources plugin segítségével
14/37
Tervezői és fejlesztői
Resource könyvtárak hozzáadása környezetek
2
Jakab Hunor
Maven-ben
Szerializáció
<project>
...
<build>
...
<resources>
<resource>
<directory>src/my-resources</directory>
</resource>
</resources>
...
</build>
...
</project>
15/37
Tervezői és fejlesztői
Szerializáció környezetek
2
I Standard eljárás az objektumok állapotának adatfolyamba Jakab Hunor
Erőforrások
szerializáció, a codebase elmentésével) Maven-ben
16/37
Tervezői és fejlesztői
Szerializáció környezetek
2
I Standard eljárás az objektumok állapotának adatfolyamba Jakab Hunor
Erőforrások
szerializáció, a codebase elmentésével) Maven-ben
17/37
Tervezői és fejlesztői
A Serializable interface környezetek
Szerializáció
stb. (de attól, hogy egy osztály tartalmaz pl. egy thread
Java Reflection API
példányt, a többi része még lehet szerializálható →
transient típusmódosító alkalmazása)
import java.io.Serializable;
import java.util.Date;
import java.util.Calendar;
public class PersistentTime implements Serializable {
private Date time;
public PersistentTime() {
time = Calendar.getInstance().getTime();
}
public Date getTime(){
return time;
}}
18/37
Tervezői és fejlesztői
Transient módosító környezetek
2
Azokat az adattagokat, amelyeket nem lehet szerializálni, vagy Jakab Hunor
Erőforrások
Maven-ben
19/37
Tervezői és fejlesztői
A szerializációs protokoll testreszabása környezetek
2
Példa Jakab Hunor
Lokalizáció és
az animáció esetében, ha elmentünk, majd beolvasunk egy nemzetköziesítés
PersistentAnimation példányt, a konstruktor nem kerül ResourceBundle
Az újradefiniált metódusok első sorai:
out.defaultWriteObject();
in.defaultReadObject();
20/37
Tervezői és fejlesztői
A szerializációs protokoll testreszabása környezetek
2
Jakab Hunor
while(true){
// do animation here
}
}
private void writeObject(ObjectOutputStream out) throws IOException{
out.defaultWriteObject();
}
private void readObject(ObjectInputStream in)
throws IOException, ClassNotFoundException {
in.defaultReadObject();
startAnimation();
}
private void startAnimation() {
animator = new Thread(this);
animator.start(); 21/37
Tervezői és fejlesztői
Szerializáció letiltása környezetek
2
Jakab Hunor
Amennyiben nem szeretnénk, hogy az osztályunk példányai
szerializálhatóak legyenek (bár az alaposztály implementálja Lokalizáció és
nemzetköziesítés
az interfészt, és mi nem „unimplementálhatjuk”): ResourceBundle
Java erőforrások
betöltése
Erőforrások
Maven-ben
private void writeObject(ObjectOutputStream out)
Szerializáció
throws IOException {
Java Reflection API
throw new NotSerializableException("Not today!");
}
private void readObject(ObjectInputStream in)
throws IOException {
throw new NotSerializableException("Not today!");
}
22/37
Tervezői és fejlesztői
Version controll környezetek
2
InvalidClassException Jakab Hunor
Lokalizáció és
(mindenik szerializálható osztályhoz egy egyedi azonosító nemzetköziesítés
rendelődik hozzá, ha ez nem talál, kivételt kapunk) ResourceBundle
Java erőforrások
betöltése
Probléma Erőforrások
Maven-ben
Ha például csak egy adattagot adtunk hozzá → szeretnénk, Szerializáció
2
Jakab Hunor
Az ObjectOutputStream alapértelmezetten fent tart egy a
beléje írt objektumra mutató referenciát → ha kiírjuk az Lokalizáció és
nemzetköziesítés
objektumot, majd megváltoztatjuk és újra kiírjuk, az új állapot ResourceBundle
nem lesz lementve Java erőforrások
betöltése
Erőforrások
Maven-ben
Szerializáció
Listing 8: "Példa"
Java Reflection API
ObjectOutputStream out = new ObjectOutputStream(...);
MyObject obj = new MyObject(); // must be Serializable
obj.setState(100);
out.writeObject(obj); // saves object with state = 100
obj.setState(200);
out.writeObject(obj); // does not save new object state
Megoldások:
I Mindig zárjuk a streamet írás után
I Használjuk az ObjectOutputStream.reset() metódust
(vigyázat: a metódus az összes tárolt referenciát
felszabadítja, törli a cache-t)
24/37
Java Reflection API
Tervezői és fejlesztői
Bevezetés környezetek
2
Mire használják? Jakab Hunor
Lokalizáció és
Java virtuális gép alatt futó alkalmazások viselkedésének nemzetköziesítés
Java erőforrások
betöltése
Néhány alkalmazási terület: Erőforrások
Maven-ben
I Osztály böngészők és vizuális fejlesztői környezetek:
Szerializáció
helyes kód írásának elősegítése Java Reflection API
I Debuggolási és tesztelési eszközök : privát mezők
vizsgálata, code coverage javítása
Hátrányok:
I Performance overhead
I Biztonsági megszorítások
I Az absztrakció elrontása (hozzáférés védett
komponensekhez)
26/37
Tervezői és fejlesztői
Osztályok környezetek
2
Objektumok Jakab Hunor
Lokalizáció és
Két féle objektumot különböztetünk meg: nemzetköziesítés
I primitív típusú: boolean, byte, short, int, long, char, float ResourceBundle
Java erőforrások
I referencia típusú: java.lang.Object -ből van származtatva betöltése
Erőforrások
A virtuális gép minden objektumhoz létrehoz egy Maven-ben
Leggyakoribb műveletek:
I Class objektumok lekérdezése
I Osztály módosítók és típusok vizsgálata
I Osztály mezők felfedezése
27/37
Tervezői és fejlesztői
java.lang.Class környezetek
2
osztály példányból Jakab Hunor
Lokalizáció és
Object.getClass() - csak referencia típusok esetében működik nemzetköziesítés
ResourceBundle
Java erőforrások
betöltése
Erőforrások
Listing 11: "pl." Maven-ben
Szerializáció
* Class c = "valami".getClass();
* Class c = System.console().getClass(); Java Reflection API
típusból
típusnév.class - ezt használjuk a primitív típusok esetében is
boolean b;
Class c = boolean.class;
Class c = java.io.PrintStream.class;
28/37
Tervezői és fejlesztői
java.lang.Class környezetek
2
Fully-qualified name-ből Jakab Hunor
Lokalizáció és
A Class osztály Class.forName() statikus metódusát nemzetköziesítés
Java erőforrások
betöltése
Erőforrások
Maven-ben
29/37
Tervezői és fejlesztői
Osztályok szerkezetének feltárása környezetek
2
Feltárható elemek Jakab Hunor
I mezők Lokalizáció és
nemzetköziesítés
I metódusok ResourceBundle
Java erőforrások
I konstruktorok betöltése
Erőforrások
Maven-ben
Két féle metódus áll rendelkezésre ezek feltárására: Szerializáció
I Kereső metódusok Java Reflection API
I Felsoroló metódusok
Mezők feltárása java.lang.reflect.Field
getDeclaredField(String name) A paraméter által
meghatározott attribútum
getField(String name) A paraméter által meghatározott
publikus attribútum
getDeclaredFields() Minden attribútum (a nem publikusak is)
getFields() A publikus attribútumok (öröklöttek is)
visszafordítása
30/37
Tervezői és fejlesztői
java.lang.reflect.Field példa környezetek
2
Mezők feltárása java.lang.reflect.Field Jakab Hunor
Lokalizáció és
getDeclaredField(String name) A paraméter által nemzetköziesítés
Java erőforrások
getField(String name) A paraméter által meghatározott betöltése
publikus attribútum Erőforrások
Maven-ben
getDeclaredFields() Minden attribútum (a nem publikusak is) Szerializáció
visszafordítása
import java.lang.reflect.Field;
...
StringBuilder fields = new StringBuilder();
Field[] fieldContainer = persistentClass.getDeclaredFields();
for ( int i=0;i<fieldContainer.length; i++){
if ( i> 0) {
fields.append(",");
}
fields.append(fieldContainer[i].getName());
}; 31/37
Tervezői és fejlesztői
Osztályok szerkezetének feltárása környezetek
2
Feltárható elemek Jakab Hunor
I mezők Lokalizáció és
nemzetköziesítés
I metódusok ResourceBundle
Java erőforrások
I konstruktorok betöltése
Erőforrások
Maven-ben
Két féle metódus áll rendelkezésre ezek feltárására: Szerializáció
I Kereső metódusok Java Reflection API
I Felsoroló metódusok
32/37
Tervezői és fejlesztői
java.lang.reflect.Method Példa környezetek
2
Jakab Hunor
33/37
Tervezői és fejlesztői
Osztályok szerkezetének feltárása környezetek
2
Feltárható elemek Jakab Hunor
I mezők Lokalizáció és
nemzetköziesítés
I metódusok ResourceBundle
Java erőforrások
I konstruktorok betöltése
Erőforrások
Maven-ben
Két féle metódus áll rendelkezésre ezek feltárására: Szerializáció
I Kereső metódusok Java Reflection API
I Felsoroló metódusok
34/37
Tervezői és fejlesztői
java.lang.reflect.Constructor Példa környezetek
2
Jakab Hunor
try{ Lokalizáció és
Constructor c = Date.class.getConstructor( new Class[] { String.class } );
nemzetköziesítés
Maven-ben
Szerializáció
35/37
ososztaly mezoinek lekerdese: Tervezői és fejlesztői
környezetek
Class.getSuperClass().getDeclaredFields
2
Jakab Hunor
Lokalizáció és
nemzetköziesítés
ResourceBundle
Java erőforrások
betöltése
Erőforrások
Maven-ben
Szerializáció
36/37
Tervezői és fejlesztői
Ősosztály és mezőire való hivatkozás környezetek
2
I Class.getSuperClass() ősosztály lekérdezése Jakab Hunor
ResourceBundle
Java erőforrások
betöltése
Erőforrások
Maven-ben
Szerializáció
36/37
Tervezői és fejlesztői
környezetek
Jakab Hunor
Annotációk
Perzisztencia
ORM
Jakab Hunor
Babeş–Bolyai Tudományegyetem
Matematika és Informatika Kar
1/36
Tervezői és fejlesztői
Programszöveg elemeihez rendelhető környezetek
Perzisztencia
2/36
Tervezői és fejlesztői
Programszöveg elemeihez rendelhető környezetek
Perzisztencia
I Strukturált kommentek ( osztályokról, ezek metódusairól és
ORM
attribútumairól szolgáltatnak struktúrált információt )
JPA
I Jól meghatározott szintaxissal rendelkeznek
I Különböző módon feldolgozhatóak ( parserek )
/**
* A mock class that extends the
* javax.swing.Jframe class
* @author jakabh */
public class MockFrame extends JFrame { }
3/36
Tervezői és fejlesztői
Java Annotációk - java.lang.annotation.* környezetek
3
Magyarázó jegyzet (Annotation) Jakab Hunor
Annotációk
A programszöveg elemeihez rendelhető metainformáció mely Perzisztencia
átvihető futási időbe. ORM
JPA
Tulajdonságok:
I Módosítószavak bővítése
I Nem befolyásolják direkt módon a program szemantikáját
I Csomagokhoz, típusokhoz, metódusokhoz,
attribútumokhoz, konstruktorokhoz, lokális változókhoz
rendelhetők
I Plusz információt hordoznak mely felhasználható a Java
fordító a JVM és más speciális eszközök által
I Konvenció alapján a magyarázó jegyzetek az egyéb
módosítószavak előtt szerepelnek
4/36
Tervezői és fejlesztői
Hol találkoztunk annotációkkal az eddigiek környezetek
során ? 3
Jakab Hunor
Perzisztencia
public class Example extends MouseAdapter {
ORM
@Override
JPA
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
super.mouseClicked(e);
}}
II. gyakori példa: @deprecated
public void elavultmetodus(){
...
}
@Deprecated
public void <@\st{elavultmetodus}@>(){
...
}
5/36
Tervezői és fejlesztői
Annotációk definíciója és használata környezetek
3
Bejelentés Jakab Hunor
Annotációk
Interfacekhez hasonlóan történik @-előtaggal @interface Perzisztencia
ORM
/** JPA
Részei
I megnevezés: RequestForEnhancement
I elemek pl. String synopsis
6/36
Tervezői és fejlesztői
Annotációk definíciója és használata környezetek
Megszorítások:
3
Jakab Hunor
I nem lehet típusparaméterezni Annotációk
I az annotáció metódusainak nem lehetnek paraméterei Perzisztencia
JPA
I metódusok típusai: primitív, String, Class, enum, array
Példa használatra:
@RequestForEnhancement(
id = 2868724,
synopsis = "Enable time-travel",
engineer = "Mr. Peabody",
date = "4/1/3007"
)
public static void travelThroughTime() { ... }
7/36
Tervezői és fejlesztői
Annotáció típusok környezetek
3
marker annotáció: Jakab Hunor
Annotációk
Elemek nélküli annotáció. Pl:
Perzisztencia
JPA
Konvenció
Egyetlen elemmel rendelkező annotációk esetén az elem neve
value:
public @interface OneElementAnnotation {
String value(); }
@OneElementAnnotation("A random string")
public class ExampleClass { ... }
8/36
Tervezői és fejlesztői
Beépített annotációk környezetek
JPA
I @SafeVarargs I @Inherited
I @FunctionalInterface I @Repeatable
Meta annotációk
I Annotációkhoz rendelt metainformációt hordoznak.
I Megadhatjuk segítségükkel:
I egy annotáció céltípusát,
I az általa hordozott információ létezési idejét
I hogy bekerüljön-e a dokumentációba
I illetve öröklődést
9/36
Tervezői és fejlesztői
Meta annotációk: Példa környezetek
Pl:
3
Jakab Hunor
10/36
Tervezői és fejlesztői
@Target{ElementType} környezetek
3
Theorem Jakab Hunor
alkalmazható Perzisztencia
ORM
JPA
11/36
Tervezői és fejlesztői
@Retention{RetentionPolicy} környezetek
3
Theorem Jakab Hunor
Perzisztencia
mikor és ki által legyen elérhető. Pl. futási időben reflection
ORM
API-n keresztül. JPA
12/36
Tervezői és fejlesztői
Annotációk használata futási időben. Példa! környezetek
3
I Szeretnénk annotációk segítségével megjelölni egy Jakab Hunor
JPA
és végrehajtja a teszteket
I Szükségünk lesz:
I egy új @Test annotációra megfelelő tulajdonságokkal
I egy tesztelő rutinra: RunTests.main
I a tesztelendő metódusokat definiáló osztályra: FOO
13/36
Tervezői és fejlesztői
@Test környezetek
3
package idde.jakabh.Annotations; Jakab Hunor
Annotációk
import java.lang.annotation.*;
Perzisztencia
/**
ORM
* @author jakabh
*/ JPA
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test {
}
@Test
Minden olyan metódust amelyet szeretnénk tesztelni
megjelölünk a @Test annotációval
14/36
Tervezői és fejlesztői
A tesztelő osztály környezetek
3
import idde.jakabh.Annotations.Test; Jakab Hunor
import java.lang.reflect.*;
Annotációk
public class RunTests {
public static void main(String[] args) throws Exception { Perzisztencia
/** ORM
* @see Test
*/
int passed = 0, failed = 0;
for (Method m : Class.forName(args[0]).getMethods()) {
if (m.isAnnotationPresent(Test.class)) {
try {
m.invoke(null);
passed++;
} catch (Throwable ex) {
System.out.printf("Test %s failed: ...
%s %n", m, ex.getCause());
failed++;
}
}
}
System.out.printf("Passed: %d, Failed %d%n", passed, failed);
}
}
15/36
Tervezői és fejlesztői
A tesztelendő osztály környezetek
3
import idde.jakabh.Annotations.Test; Jakab Hunor
16/36
Perzisztencia: Java
Persistence API
Tervezői és fejlesztői
Perzisztencia Java környezetben környezetek
3
Perzisztencia Jakab Hunor
Perzisztencia
folyamat befejezte után is léteznek.
ORM
I Az angol "to persist" (továbbra is fennáll, létezik) JPA
kiefejezésből ered.
I Bármilyen típusú információ "perzisztens" tárolása
lehetséges a java programozási nyelv segítségével.
Megjegyzés
A perzisztencia megvalósításának leggyakoribb módja a
relációs adatbázisok alkalmazása
18/36
Tervezői és fejlesztői
JAXB környezetek
3
Java Architecture for XML Binding Jakab Hunor
Annotációk
I Marshalling - java objektum XML állományba történő Perzisztencia
átalakítása ORM
19/36
Tervezői és fejlesztői
OOP vs. RDB környezetek
3
Object relational impedance mismatch Jakab Hunor
Annotációk
Technikai nehézségek, melyek abban az esetben lépnek fel
Perzisztencia
amikor egy relációs adatbáziskezelő rendszert használunk egy
ORM
objektum-orientált programozási nyelvből. JPA
Forrásai:
I Kettős séma (dual-schema problem)
I Adatrejtés (encapsulation)
I Öröklődés (inheritance)
I Adattípusok (pl. referencia típusok, karakterláncok stb. )
I Tranzakciók (Unit of work, méretbeli különbségek)
I stb.
Megoldási lehetőségek
I Object relational mapping
I Object oriented database management systems
(OODBMS)
20/36
Tervezői és fejlesztői
ORM környezetek
21/36
Tervezői és fejlesztői
ORM architecture környezetek
3
Jakab Hunor
Annotációk
Perzisztencia
ORM
JPA
22/36
Tervezői és fejlesztői
Java Persistence API (JPA) környezetek
3
Meghatározás Jakab Hunor
Annotációk
Egy specifikáció amely egy standardot definiál adatok Perzisztencia
átvitelére, perzisztenciájára és menedzsmentjére java ORM
objektumok/osztályok és relációs adatbázisok között. JPA
Állapot
I Az EJB 3.0 specifikáció részeként jött létre, jelenlegi
verzió: JPA 2.1 (2013 április).
I Ezt tekintik a standard iparban használt ORM
megközelítésnek Java környezetben.
I Referencia implementáció: EclipseLink
23/36
Tervezői és fejlesztői
Motiváció környezetek
3
Motiváció JPA használatára. Jakab Hunor
Annotációk
I Standardizált, az EJB3 valamint Java EE része
Perzisztencia
I Számos ingyenes, nyílt forráskódú implementációja van ORM
I Hordozhatóság JPA
24/36
Tervezői és fejlesztői
Architecture környezetek
3
Jakab Hunor
Annotációk
Perzisztencia
ORM
JPA
3
Jakab Hunor
Annotációk
Perzisztencia
ORM
JPA
I Entity Az adatmodell
I EntityTransaction műveleteket ezen keresztül
végezhetünk
26/36
Tervezői és fejlesztői
Architecture környezetek
3
Jakab Hunor
Annotációk
Perzisztencia
ORM
JPA
27/36
Tervezői és fejlesztői
Adatmodell környezetek
3
Entity osztályok Jakab Hunor
Annotációk
I Speciális annotációkkal ellátott POJO-k Perzisztencia
I Egy Entity osztály egy táblát reprezentál az adatbázisból ORM
JPA
I Egy példánya megfelel az adott tábla egy sorának!
I Sajátos életciklussal rendelkezik amelyet az
EntityManager befolyásol
További összetevők
I Persistence context (Entity manager határozza meg)
I Container managed
I Application managed
I Persistence unit ( különböző Entity-k összessége, a
persistence.xml-ben van definiálva)
28/36
Tervezői és fejlesztői
@Entity, @Table környezetek
ORM
I Annotálva legyen: @Entity JPA
29/36
Tervezői és fejlesztői
Entity osztályok környezetek
3
Példa Jakab Hunor
Annotációk
Perzisztencia
@Entity ORM
public class Party implements Serializable { JPA
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String helyszin;
...
//bi-directional many-to-one association to Felhasznalok
@OneToMany(mappedBy="party")
private List<Felhasznalok> felhasznaloks;
public Party() { }
...
//getter and setter methods
}
I
30/36
Tervezői és fejlesztői
JPA annotációk környezetek
3
javax.persistence.* Jakab Hunor
Annotációk
Perzisztencia
Legfontosabb elemei: ORM
31/36
Tervezői és fejlesztői
@Entity, @Table környezetek
3
Jakab Hunor
annotated class
Annotációk
@Entity
Perzisztencia
@Table( name = "EVENTS" )
public class Event { ORM
... JPA
}
Tulajdonságok:
I A @Table megadása nélkül az alapértelmezett táblanév
EVENT lenne ( convention over configuration ).
I
32/36
Tervezői és fejlesztői
@Id környezetek
3
Jakab Hunor
annotated class
Annotációk
@Id
Perzisztencia
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy = "increment") ORM
return id;
}
hbm.xml
<id name="id" column="EVENT_ID">
<generator class="increment"/>
</id>
A @GeneratedValue es a @GenericGenerator határozzák
meg a kulcs generálási stratégiáját
33/36
Tervezői és fejlesztői
@Column - egyszerû mezők mappelése környezetek
3
Jakab Hunor
annotated class
Annotációk
public String getTitle() {
Perzisztencia
return title;
} ORM
JPA
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "EVENT_DATE")
public Date getDate() {
return date;
}
hbm.xml
<property name="date" type="timestamp" column="EVENT_DATE"/>
<property name="title"/>
A megfeleltetés megadása nem kötelező csupán akkor ha a
név egy fenntartott kulcsszó, vagy a property neve nem
egyezik meg az oszlop nevével
34/36
Tervezői és fejlesztői
Entity állapotok környezetek
3
Jakab Hunor
Annotációk
Perzisztencia
ORM
JPA
Pl:
Car newcar = new Car();
try {
entityManager.getTransaction().begin();
entityManager.persist(newcar);
entityManager.getTransaction().commit();
} catch (Exception e) {
entityManager.getTransaction().rollback();
}
35/36
Tervezői és fejlesztői
Java persistence API környezetek
4
JPA gyakorlatban Jakab Hunor
JPA
Legfőbb tulajdonságok:
I persistence.xml - persistence Unit
I EntityManager - persistence context
I transaction - atomi műveletek csoportosítása
2/12
Tervezői és fejlesztői
Persistence.xml környezetek
4
<?xml version="1.0" encoding="UTF-8"?> Jakab Hunor
3/12
Tervezői és fejlesztői
javax.Persistence.EntityManagerFactory környezetek
4
EntityManagerFactory Jakab Hunor
JPA
Az EntityManagerFactory példányosítására és a példány
visszatérítésére egy segédosztályt hozunk létre az alábbiak
alapján:
public class JpaUtil {
private static EntityManagerFactory entityManagerFctory;
static {
try {
// Create from (persistence.xml)
entityManagerFctory =
Persistence.createEntityManagerFactory("idde.eclipseLinkJpa");
} catch (Throwable ex) {
// Log the exception.
}
}
public static EntityManagerFactory getEntityManagerFactory() {
return entityManagerFctory;
}
4/12
Tervezői és fejlesztői
Különbségek EclipseLink és Hibernate környezetek
esetén 4
Jakab Hunor
JPA
PersistenceProvider a persistence.xml-ben
I EclipseLink:
org.eclipse.persistence.jpa.PersistenceProvider
I Hibernate: org.hibernate.ejb.HibernatePersistence
Elengedhetetlen beállítások:
<property name="javax.persistence.jdbc.url"
value="jdbc:mysql://localhost:3306/idde"/>
<property name="javax.persistence.jdbc.user"
value="newidde"/>
<property name="javax.persistence.jdbc.password"
value="newidde"/>
<property name="javax.persistence.jdbc.driver"
value="com.mysql.jdbc.Driver"/>
Mindekét implementáció rendelkezik sajátos beállításokkal is!
5/12
Példák:
Tervezői és fejlesztői
JPA példák elemi műveletekre környezetek
4
transaction, exceptions Jakab Hunor
JPA
I Új tranzakció elkezdése a Entitymanager segítségével
I Try-catch blokk, kivétel esetén rollback
I Session bezárása a finally ágban
Entitymanager em = JpaUtil.getEntityManagerFactory().createEntityManager();
EntityTransaction tx = em.getTransaction();
try {
tx = em.begin();
//muveletek
tx.commit();
} catch (Exception e) {
if (tx != null) {
tx.rollback();
}
} finally {
em.close(); //Attention!
}
7/12
Tervezői és fejlesztői
Mentés: EntityManager.persist környezetek
4
Entity osztályok: Jakab Hunor
JPA
I Predator
I Prey
em.getTransaction().begin();
Predator farkas = new Predator();
farkas.setName("Farkas");
farkas.setPopulation(125);
farkas.setLivesInEurope(true);
Prey malac = new Prey();
malac.setName("malac");
malac.setPrey_average_weight(112.5);
em.persist(csirke);
em.persist(farkas);
em.getTransaction().commit();
Figyeljünk az entity példányok állapot változásaira: New →
Managed
8/12
Tervezői és fejlesztői
További metódusok: környezetek
4
Entity manager fontos metódusai: Jakab Hunor
JPA
I void remove(java.lang.Object entity) törli a
paraméterként megadott bejegyzést
I <T> T find(java.lang.Class<T> entityClass,
java.lang.Object primaryKey) visszatéríti a
bejegyzést elsődleges kulcs alapján
em.getTransaction().begin();
Prey thePray = em.find(Prey.class,prayName);
if ( thePray != null ){
em.remove(thePray);
}
em.getTransaction().commit();
9/12
Tervezői és fejlesztői
Tetszőleges lekérdezések: környezetek
4
SELECT Jakab Hunor
JPA
JPQL:
I SELECT p FROM Person as p
I SELECT p.firstName FROM Person as p where
p.lastName = “karcsi”
Az EntityManager.createQuery metódussal hozható létre
List<Prey> prayanimals = em.createQuery("select p from Prey p").getResultList
for ( Prey pr : prayanimals){
System.out.println(pr.getName());
}
10/12
Tervezői és fejlesztői
Kapcsolatok: környezetek
4
One-to-One Jakab Hunor
JPA
Inner Join
I @OneToOne(optional=false)
I @JoinColumn(name = "PREY_ID")
Outer Join Az EntityManager.createQuery metódussal
hozható létre
List<Prey> prayanimals =
em.createQuery("select p from Prey p").getResultList();
for ( Prey pr : prayanimals){
System.out.println(pr.getName());
}
11/12
Tervezői és fejlesztői
környezetek
Jakab Hunor
Jakab Hunor
Babeş–Bolyai Tudományegyetem
Matematika és Informatika Kar
1/52
Tervezői és fejlesztői
Tartalom: környezetek
2/52
Tervezői és fejlesztői
Dinamikus moduláris fejlesztés, OSGI környezetek
5
Jakab Hunor
Meghatározás
OSGI (Open Services
Gateway Initiative)-
dinamikus, moduláris
rendszer a Java számára
3/52
Tervezői és fejlesztői
OSGI specifikáció! környezetek
Megjegyzés
Működőképességét és létjogosultságát bizonyítja széleskörû
elterjedtsége és olyan népszerû alkalmazások esetében
történõ használata mint amilyen az Eclipse, Spring,
IBMWebsphere , Oracle/BEA Weblogic, Jonas, JBoss
4/52
Tervezői és fejlesztői
OSGI rétegelt architektúrája környezetek
5
Jakab Hunor
Meghatározás
Bundle(Batyu): programozó által elkészített OSGI komponens
5/52
Tervezői és fejlesztői
OSGI rétegelt architektúrája környezetek
5
Jakab Hunor
Meghatározás
Services(Szolgáltatás réteg): dinamikusan összeköti a
batyukat
5/52
Tervezői és fejlesztői
OSGI rétegelt architektúrája környezetek
5
Jakab Hunor
Meghatározás
LifeCycle(Életciklus): Az API amelyen keresztül batyukat
tudunk telepíteni, elindítani, megállítani, frissíteni
5/52
Tervezői és fejlesztői
OSGI rétegelt architektúrája környezetek
5
Jakab Hunor
Meghatározás
Modules : Ez a réteg határozza meg azt, hogy egy batyu
hogyan tud kódot importálni vagy exportálni
5/52
Tervezői és fejlesztői
OSGI rétegelt architektúrája környezetek
5
Jakab Hunor
Meghatározás
Security(Biztonsági réteg): Biztonsági feladatokat lát el, a java
2 security architecture kiterjesztése
5/52
Tervezői és fejlesztői
OSGI rétegelt architektúrája környezetek
5
Jakab Hunor
Meghatározás
Execution Environment (végrehajtási környezet):
Meghatározza, hogy milyen metódusok és osztályok állnak
rendelkezésre egy konkrét platformon belül.
5/52
Tervezői és fejlesztői
Rétegelt architektúra környezetek
5
Jakab Hunor
A rétegek közötti interakció a következőképpen ábrázolható
6/52
Tervezői és fejlesztői
OSGI Container környezetek
5
Meghatározás Jakab Hunor
Apache Karaf
(pehelysúlyú/lightweight)
7/52
Tervezői és fejlesztői
Elõnyök környezetek
Example (1)
Pl: Home Server ( háztartási elektronikai eszközök
menedzselése )
8/52
Tervezői és fejlesztői
Elõnyök környezetek
5
Example (2) Jakab Hunor
9/52
Tervezői és fejlesztői
OSGI batyu (Bundle) környezetek
5
Jakab Hunor
Batyu (Programegység): a modularitás alapegysége OSGI
frameworkon belül.
10/52
Tervezői és fejlesztői
OSGI batyu: szimbolikus név és verziózás környezetek
11/52
Tervezői és fejlesztői
OSGI batyu: szimbolikus név és verziózás környezetek
11/52
Tervezői és fejlesztői
OSGI MANIFEST azonosítók: környezetek
5
Jakab Hunor
12/52
Tervezői és fejlesztői
OSGI MANIFEST: További tulajdonságok környezetek
5
Jakab Hunor
13/52
Tervezői és fejlesztői
OSGI batyu: életciklus környezetek
5
Jakab Hunor
I Installed
I Resolved
I Uninstalled
I Starting
I Active
I Stopping
14/52
Tervezői és fejlesztői
OSGI batyu: állapotok környezetek
5
Jakab Hunor
15/52
Tervezői és fejlesztői
OSGI batyu környezetek
5
Jakab Hunor
16/52
Tervezői és fejlesztői
BundleActivator interface környezetek
5
Jakab Hunor
17/52
Tervezői és fejlesztői
BundleContext objektum környezetek
5
Jakab Hunor
18/52
Tervezői és fejlesztői
export-import mechanizmus környezetek
5
Jakab Hunor
MANIFEST.MF
Export-Package: com.myosgiapp.mypackage;version="1.0.0"
Improt-Package: com.myosgiapp.mypackage;version="
[1.0.0,2.0.0)"
19/52
Tervezői és fejlesztői
szolgáltatások környezetek
5
Meghatározás Jakab Hunor
5
Jakab Hunor
public interface ServiceInterface {
public String message();
public void setMessage( String message);
}
public class ServiceObject implements ServiceInterface {
public String message() {
//code
}
public void setMessage(String message) {
//code
}
}
21/52
Tervezői és fejlesztői
OSGI szolgáltatások környezetek
5
Jakab Hunor
22/52
Tervezői és fejlesztői
szolgáltatások regisztrálása környezetek
5
Jakab Hunor
23/52
Tervezői és fejlesztői
szolgáltatások lekérdezése környezetek
5
Jakab Hunor
Két lépésbõl áll:
I szolgáltatás referencia lekérdezése getServiceReference
I szolgáltatás objektum lekérdezése a referencia
segítségével getService
24/52
Tervezői és fejlesztői
szolgáltatás követõ (Service Tracker) környezetek
5
Jakab Hunor
Lépések:
I ServiceTrackerCustomizer interface-t implementáló
osztály létrehozása a megfelelõ metódusok felülírásával:
I addingService
I modifiedService
I removedService
25/52
Tervezői és fejlesztői
szolgáltatás követõ (Service Tracker) környezetek
5
Jakab Hunor
public class MyServiceTrackerCustomizer implements
ServiceTrackerCustomizer {
private final BundleContext context;
public Object addingService(ServiceReference reference) {
// TODO Auto-generated method stub
return service;
}
public void modifiedService(ServiceReference reference,
Object service) {
// TODO Auto-generated method stub }
public void removedService(ServiceReference reference,
Object service) {
// TODO Auto-generated method stub
context.ungetService(reference);}
26/52
Tervezői és fejlesztői
szolgáltatás követõ (Service Tracker) környezetek
5
Jakab Hunor
Lépések:
I ServiceTracker létrehozása (a ServiceTrackerCustomizer
segítségével ) az Activator osztályban és menyitása!
MyQuoteServiceTrackerCustomizer customer = new
MyQuoteServiceTrackerCustomizer(
context);
serviceTracker = new ServiceTracker(context, IQuoteService.
class
.getName(), customer);
serviceTracker.open();
27/52
Tervezői és fejlesztői
fejlesztés az OSGI keretrendszerben környezetek
5
Jakab Hunor
Lépések
I felépítjük a programegységeket (batyukat ) az OSGI API
segítségével
I összerakosgatjuk/elhelyezzük ezeket egy OSGI
konténerben
Szükséges eszközök:
I egy OSGI implementáció (equinox, felix stb. )
I fejlesztõi környezet
I build rendszer (Maven v. Eclipse PDE )
I külsõ OSGI konténer ( Apache Karaf )
28/52
Tervezői és fejlesztői
fejlesztés az OSGI keretrendszerben környezetek
5
Jakab Hunor
Példaprogramok
I https://pdae.cs.ubbcluj.ro/git/jakabh/IDDEE XAMPLES
I IDDE/OSGI
Szükséges eszközök:
I karaf osgi container
I Maven bundle plugin vagy Gradle osgi plugin
I build rendszer (Maven v. Gradle )
29/52
Tervezői és fejlesztői
Tartalom: környezetek
30/52
Tervezői és fejlesztői
fejlesztés az OSGI keretrendszerben környezetek
6
Jakab Hunor
Lépések
I felépítjük a programegységeket (batyukat ) az OSGI API
segítségével
I összerakosgatjuk/elhelyezzük ezeket egy OSGI
konténerben
Szükséges eszközök:
I egy OSGI implementáció (equinox, felix stb. )
I fejlesztõi környezet
I build rendszer (Maven v. Eclipse PDE )
I OSGI container ( Apache Karaf )
31/52
Tervezői és fejlesztői
Dinamikus moduláris fejlesztés, OSGI környezetek
6
Jakab Hunor
Környezet
OSGI moduláris
alkalmazások
futtatásához a
következőkre van
szükségünk:
I OSGI container
I elkészített batyuk
I kiegészítő batyuk
I dinamikus telepítés
32/52
Tervezői és fejlesztői
OSGI runtime környezetek
6
Futási környezet Jakab Hunor
33/52
Tervezői és fejlesztői
fejlesztés az OSGI keretrendszerben: környezetek
Eclipse 6
Jakab Hunor
Run configuration
OSGI framework, szükséges batyuk:
I org.eclipsel.osgi
I org.eclipse.equinox.console
I org.apache.felix.gogo.command
I org.apache.felix.gogo.runtime
I org.apache.felix.gogo.shell
34/52
Tervezői és fejlesztői
Fejlesztés különálló containerrel környezetek
6
Apache Karaf Jakab Hunor
35/52
Tervezői és fejlesztői
karaf bundle környezetek
6
archetype Jakab Hunor
MANIFEST.MF
A létrejött projekt esetében a MANIFEST.MF tartalmát a
maven-bundle-plugin beállításai eredményezik
36/52
Tervezői és fejlesztői
maven-bundle-plugin környezetek
6
<plugin> Jakab Hunor
<groupid>org.apache.felix</groupid>
<artifactid>maven-bundle-plugin</artifactid>
<version>${maven-bundle-plugin.version}</version>
<extensions>true</extensions>
<configuration>
<instructions>
<bundle-symbolicname>${project.artifactid}</bundle-symbolicname>
<bundle-version>${project.version}</bundle-version>
<bundle-activator>idde.karafproba.activator</bundle-activator>
<export-package>
idde.karafproba*;version=${project.version}
</export-package>
<import-package>
*
</import-package>
</instructions>
</configuration>
</plugin>>>
37/52
Tervezői és fejlesztői
OSGI megjegyzések környezetek
6
Jakab Hunor
Telepítés
Maven bundle projekt: target/ *.jar állomány automatikus
telepítése a Karaf deploy könyvtárába: antrun plugin:
<artifactId>maven-antrun-plugin</artifactId>
<version>1.4</version>
<executions> <execution>
<phase>package</phase>
<configuration> <tasks>
<copy todir="${karaf-dir}">
<fileset dir="${basedir}/target"
includes="*.jar" /> </copy>
</tasks> </configuration>
<goals> <goal>run</goal> </goals>
</execution> </executions>
38/52
Tervezői és fejlesztői
OSGI megjegyzések környezetek
6
Jakab Hunor
Maven properties
A karaf deploy könyvtárra a következõképpen hivatkoztunk:
${karaf-dir}
"pom.xml"
<properties>
<maven-bundle-plugin.version>2.3.7</maven-bundle-plugin.version>
<osgi.version>4.3.1</osgi.version>
< karaf-dir >c:\Users\jakabh\SRC\Karaf\deploy< /karaf-dir>
</properties>
39/52
Tervezői és fejlesztői
OSGI deklaratív szolgáltatások környezetek
6
DS Jakab Hunor
40/52
Tervezői és fejlesztői
DS példa környezetek
6
Szolgáltatás Jakab Hunor
@Override
public void servicemethod() {
System.out.println("This is a service method");
}
}
41/52
Tervezői és fejlesztői
DS példa környezetek
6
Szolgáltatás leíró Jakab Hunor
Listing 1: "service.xml"
Elhelyezés
Konvenció szerint a szolgáltatásokat definiáló .xml
állományokat az OSGI-INF könyvtárba helyezzük.
42/52
Tervezői és fejlesztői
DS példa környezetek
6
MANIFEST.MF Jakab Hunor
maven bundle
Maven projektek esetén ezt az maven-scr(service component
runtime) plugin segítségével valósíthatjuk meg. 43/52
Tervezői és fejlesztői
Bemutató témák környezetek
44/52
Tervezői és fejlesztői
Tartalom: környezetek
8
I Eclipse RCP ( Rich Client Platform) bevezetés Jakab Hunor
2/37
Tervezői és fejlesztői
Miért alkalmas "Rich client" alkalmazások környezetek
fejlesztésére az eclipse ? 8
Jakab Hunor
3/37
Tervezői és fejlesztői
Néhány példa RCP használatára környezetek
8
I IBM lotus project Jakab Hunor
4/37
Tervezői és fejlesztői
Kiterjesztési pontok környezetek
8
Jakab Hunor
5/37
Tervezői és fejlesztői
Kiterjesztési pontok környezetek
8
Jakab Hunor
actionSets
" Plug-ins can contribute actionSets extensions that define
actions with an ID, a label, an icon , and a class that
implements the interface IActionDelegate. The UI will present
that label and icon to the user, and when the user clicks on the
item, the UI will instantiate the given action class and call its
run() method.
5/37
Tervezői és fejlesztői
Kiterjesztési pontok környezetek
8
Jakab Hunor
plugin.xml
A különböző kiterjesztési pontokat a plugin.xml állományban
adjuk meg
"org.eclipsercp.hyperbola/plugin.xml"
<extension point="org.eclipse.ui.actionSets">
<actionSet id="org.eclipsercp.hyperbola.debugActionSet">
<action
id="org.eclipsercp.hyperbola.debug"
class="org.eclipsercp.hyperbola.DebugAction"
icon="icons/debug.gif"
label="Debug Chats"/>
</actionSet>
</extension>
6/37
Tervezői és fejlesztői
Kiterjesztési pontok környezetek
8
"org.eclipsercp.hyperbola/plugin.xml"
Jakab Hunor
<extension point="org.eclipse.ui.actionSets">
<actionSet id="org.eclipsercp.hyperbola.debugActionSet">
<action
id="org.eclipsercp.hyperbola.debug"
class="org.eclipsercp.hyperbola.DebugAction"
icon="icons/debug.gif"
label="Debug Chats"/>
</actionSet>
</extension>
"org.eclipse.ui/plugin.xml"
Lépések:
a UI közzéteszi a "Debug Chats" címkét egy menüben vagy
toolbarban, a debug.gif ikonnal együtt. Ha a user rákattint a
DebugAction osztály példányosítódik és meghívódik a run()
metódusa.
7/37
Tervezői és fejlesztői
Kiterjesztési pontok tulajdonságai környezetek
8
Jakab Hunor
Tulajdonság
Az előző példában az UI plugin lehetővé teszi a
menürendszere bővítését más plug-ineken keresztül.
8/37
Tervezői és fejlesztői
Eclipse RCP alkalmazások környezetek
8
Jakab Hunor
Megjegyzés
Eclipse platform újrahasznosítása önálló alkalmazások
készítésére azon technológiák felhasználásával melyekkel már
az Eclipse IDE esetében is találkoztunk
Főbb összetevői
I org.eclipse.core.runtime, org.eclipse.ui pluginok
I Fő program: IApplication interfacet implementáló osztály
I Perspektíva : az alkalmazás elrendezését definiálja ( egy
kiterjesztési ponton keresztül kell megadni )
I Workbench Advisor: láthatatlan komponens amely a
különböző kontrollok megjelenését illetve viselkedését
szabá lyozza ( menü, eszköztár, perspektíva stb. )
9/37
Tervezői és fejlesztői
RCP alkalmazások felépítése környezetek
8
Jakab Hunor
10/37
Tervezői és fejlesztői
RCP alkalmazások felépítése környezetek
8
Jakab Hunor
"plugin.xml"
<plugin>
<extension
id="application"
point="org.eclipse.core.runtime.applications">
<application>
<run
class="hiperbola2.Application">
</run>
</application>
</extension>
...
11/37
Tervezői és fejlesztői
RCP alkalmazások életciklusa környezetek
8
Jakab Hunor
12/37
Tervezői és fejlesztői
RCP Workbench környezetek
8
Jakab Hunor
Workbench
Ahogy JFace struktúrálja az SWT elemeit, hasonlóan a
Workbench struktúrát és irányítást kölcsönöz a JFace-nek. A
felhasználó mindebből nézetek(view) és szerkesztők(editor)
különböző elrendezéseit látja.
Tuajdonságai:
1. UI építő elemeit taratalmazza/teszi elérhetővé.
2. Lehetővé teszi a felhasználói felület hozzájárulás alapú
bővítését
3. Skálázhatóság, teljesítmény és komplexitás
4. Egy sajátos UI paradigmát határoz meg: ablakok
(windows), perspektívák (perspectives), nézetek és
műveletek (actions)
5. Több mint 50 kiterjesztési pontból és 350 API osztályból áll
13/37
Tervezői és fejlesztői
RCP Workbench Advisor; advisor = környezetek
"tanácsadó" 8
Jakab Hunor
Megjegyzés
Az alkalmazás indulásakor egyike a fő lépéseknek a
workbench létrehozása a workbenchAdvisor segítségével:
PlatformUI.createAndRunWorkbench(Display,
workbenchAdvisor) amely az alkalmazás ablakainak
létrehozását, konfigurációját és megnyitását szolgálja.
Pl.
egy ablak megnyitásakor a Workbench lekérdezi egy
advisor-tól, hogy az illető ablak tartalmazzon-e menüt vagy
sem: workbenchWindowAdvisor.preWindowOpen()
14/37
Tervezői és fejlesztői
RCP Workbench Advisor környezetek
8
Jakab Hunor
Típusok
Három fő advisor típust különböztetünk meg egy RCP
alkalmazáson belül, azon workbench jellemzőknek
megfelelően amelyeket tanácsokkal látnak el RCP - structure
15/37
Tervezői és fejlesztői
RCP Workbench Advisor környezetek
8
Jakab Hunor
Megjegyzés
Minden advisor rendelkezik egy konfigurálóval: configurer
amely hozzáférést biztosít a Workbench, WorkbenchWindow,
menü, toolbar vagy status line-hoz.
I IWorkbenchConfigurer:
I IWorkbenchWindowConfigurer:
I IActionBarConfigurer:
16/37
Tervezői és fejlesztői
RCP Workbench Advisor környezetek
8
Jakab Hunor
Megjegyzés
Minden advisor rendelkezik egy konfigurálóval: configurer
amely hozzáférést biztosít a Workbench, WorkbenchWindow,
menü, toolbar vagy status line-hoz.
I IWorkbenchConfigurer:
I IWorkbenchWindowConfigurer:
I IActionBarConfigurer:
16/37
Tervezői és fejlesztői
WorkbenchWindow configurer környezetek
8
Jakab Hunor
Megjegyzés
IWorkbenchConfigurer
public class ApplicationWorkbenchWindowAdvisor extends
WorkbenchWindowAdvisor {
...
public void preWindowOpen() {
IWorkbenchWindowConfigurer configurer =
getWindowConfigurer();
configurer.setInitialSize(new Point(400, 300));
configurer.setShowCoolBar(false);
configurer.setShowStatusLine(false);
configurer.setTitle("Hello RCP"); }
17/37
Tervezői és fejlesztői
ActionBar configurer környezetek
8
Jakab Hunor
Megjegyzés
IActionBarConfigurer
public ApplicationActionBarAdvisor(IActionBarConfigurer
configurer) {
super(configurer);
}
18/37
Tervezői és fejlesztői
A Workbench életciklusa környezetek
8
Jakab Hunor
Megjegyzés
PlatformUI.createAndRunWorkbench()
19/37
Tervezői és fejlesztői
A Workbench advisor API környezetek
8
Jakab Hunor
Megjegyzés
Az API metódusai a következő három kategóriába tartoznak:
20/37
Tervezői és fejlesztői
Perspektívák környezetek
8
Jakab Hunor
Megjegyzés
A perspektíva rendszerezi és csoportosítja azon UI elemeket
amelyek egy specifikus munkamenethez vagy feladathoz
tartoznak. Pl. Eclipse Java, Java EE, Debug, PDE
perspektívák. Egy ablakhoz lehet több különböző perspektíva
hozzárendelve amely lehetővé teszi a taszkok közötti egyszerű
váltást ablakváltás nélkül.
21/37
Tervezői és fejlesztői
Perspektívák: elrendezés kialakítása az környezetek
22/37
Tervezői és fejlesztői
PerspectiveBar láthatóvá tétele környezetek
8
Jakab Hunor
Megjegyzés
Perspektíva váltást a perspektíva toolbaron keresztül tudjuk
előidézni, ennek láthatóságát explicite meg kell adnunk a
WorkbenchAdvisor ban az IWorkbenchWindowConfigurer
preWindowOpen() metóusában:
public void preWindowOpen() {
IWorkbenchWindowConfigurer configurer = getWindowConfigurer()
;
configurer.setInitialSize(new Point(600, 500));
configurer.setShowCoolBar(true);
configurer.setShowMenuBar(true);
configurer.setShowStatusLine(true);
configurer.setShowPerspectiveBar(true);
...
}
23/37
Tervezői és fejlesztői
IPageLayoutInterface környezetek
8
Jakab Hunor
24/37
Tervezői és fejlesztői
Nézetek és szerkesztők környezetek
8
Jakab Hunor
Megjegyzés
Az alkalmazás tartalmát nézetek és szerkesztők teszik közzé.
A felhasználó ezeken keresztül lép interakcióba az
alkalmazással.
Editors vs Views:
I Általában egy view-nek csak egy példánya létezik egy
workbench oldalon belül, míg ugyanazon típusú editor
több példánya is jelen lehet
I Editorok csupán az oldal egy bizonyos részén jelenhetnek
meg, view megjelenhet bárhol és mozgatható fastview
I Minden view rendelkezik egy lokális toolbar-al, az editorok
a globális toolbarhoz járulnak hozzá
I Editorok lehetnek dirty állapotban
I View tartalma magától mentődik, míg az editor-é csak
explicit utasítás hatására
25/37
Tervezői és fejlesztői
Nézetek ( views ) környezetek
8
Jakab Hunor
Megjegyzés
Nézetek létrehozása két lépésből áll:
I A view osztály létrehozása ViewPart -osztály
leszármazottja
I org.eclipse.ui.views kiterjesztési pontban egy új view
deklaratív bejelentése
public class ViewPart1 extends ViewPart {
public ViewPart1() {
}
@Override
public void createPartControl(Composite parent) {
//a nezet tartalmanak felepitese }
@Override
public void setFocus() {
}}
26/37
Tervezői és fejlesztői
Nézetek hozzáadása egy perspektívához környezetek
8
Jakab Hunor
pl.
27/37
Tervezői és fejlesztői
Műveletek definiálása (Command) környezetek
8
Jakab Hunor
Megjegyzés
Egy komponens(művelet) deklaratív leírása, független az
implementáció részleteitől. A command frameworkon keresztül
tudunk műveleteket hozzárendelni a UI elemeihez.
Kiterjesztési pontok használatával történik
28/37
Tervezői és fejlesztői
Command handler környezetek
8
Jakab Hunor
Megjegyzés
Az org.eclipse.ui.handler kiterjesztési pont teremt kapcsolatot
egy "command" és egy "handler" osztály között, amely
végrehajtódik a parancs hívásakor
Tulajdonságok:
I A Handler osztálynak implementálnia kell az IHandler
interface-t.
I Az execute metódus hívódik meg a parancs
végrehajtásakor
I Az isEnabled metódus visszatérítési értéke határozza
meg a parancs elérhetőségét a UI-ról
I A leggyakrabban használt programelemeket a HandlerUtil
osztály segítségével érhetjük el.
29/37
Tervezői és fejlesztői
Command handler környezetek
8
Jakab Hunor
30/37
Tervezői és fejlesztői
Command hozzáadása a UI-hez környezetek
8
Jakab Hunor
Megjegyzés
Az org.eclipse.ui.menu kiterjesztési ponton keresztül történik
egy új menuContribution megadásával. A menuContribution
locationURI attribútuma határozza meg, hogy hol jelenjen meg
az illető parancs a felületen
31/37
Tervezői és fejlesztői
Szerkesztők (editors) környezetek
8
Jakab Hunor
Megjegyzés
Minden editor a workbench ugyanazon részén jelenik meg.
Elhelyezésüket nem tudjuk befolyásolni
32/37
Tervezői és fejlesztői
Az editor area láthatóvá tétele a környezetek
perspektíván belül 8
Jakab Hunor
public class Perspective implements IPerspectiveFactory {
33/37
Tervezői és fejlesztői
Egy EditorInput osztály létrehozása környezetek
8
Jakab Hunor
public class MyPersonEditorInput implements IEditorInput {
private final int id;
public MyPersonEditorInput(int id) {
this.id = id; }
public int getId() {
return id; }
@Override public boolean exists() {}
@Override public ImageDescriptor getImageDescriptor()
{ }
@Override public String getName() {}
@Override public IPersistableElement getPersistable()
{ }
......
}
34/37
Tervezői és fejlesztői
Az editor osztály létrehozása környezetek
8
Jakab Hunor
public class PersonEditor extends EditorPart {
public static final String ID = "MyEditorID"
public PersonEditor() {
}
@Override
public void createPartControl(Composite parent) {
}
...
}
Megjegyzés
Az editorhoz tartozó ID-t érdemes statikus adattagként
elmenteni: public static final String ID = "MyEditorID"
35/37
Tervezői és fejlesztői
Editor megjelenítése "Command" környezetek
segítségével 8
Jakab Hunor
Megjegyzés
Létrehozunk egy parancsot és a hozzá tartozó handler
osztályt. A handler osztály execute metódusában egy
IWorkbenchPage objektumon keresztül nyitjuk meg a
szerkesztőt az openEditor metódus segítségével:
public class CallEditor extends AbstractHandler {
public Object execute(ExecutionEvent event) throws
ExecutionException {
IWorkbenchWindow window = HandlerUtil.
getActiveWorkbenchWindow(event);
IWorkbenchPage page = window.getActivePage();
MyPersonEditorInput input = new ..
try {
page.openEditor(input, MyPersonEditor.ID);
} catch (PartInitException e) {
throw new RuntimeException(e);
}
...
36/37
Dependency injection in Java
With Guice
Jakab Hunor
Lecturer @ Babes-Bolyai University, Faculty of Mathematics and Computer Science
IOC and DI
Inversion of Control: basic techniques
Template method
Factory pa ern
Service locator pa ern
Strategy pa ern
Dependency injection
@Inject
public RealBillingService(CreditCardProcessor processorProvider,
TransactionLog transactionLogProvider) {
this.processorProvider = processorProvider;
this.transactionLogProvider = transactionLogProvider;
}
@Inject
public void setApiKey(@Named("PayPal API key") String apiKey) {
this.apiKey = apiKey;
}
Main comoponents:
Injector
Module
Binder
Identification:
compile 'com.google.inject:guice:3.0'
Guice configuration
Configurations are placed inside so-called modules.
Each module serves a different purpose
}
We can have arbitrary number of separate modules.
Guice configuration
The injector is configured by passing the desired
module upon creation
singletonInjector = Guice.createInjector(new ServiceModule());
Guice persistence
Guice has an extension for accomplishing persistence
according to JPA 2.1 standard
Steps
Persistence unit creation upon configurint the injector
Persistence service, that needs to be started
singletonInjector = Guice.createInjector(new ServiceModule(), new JpaPersistModule("MyP
singletonInjector.getInstance(PersistService.class).start();
DI in webapps
Servlet-based web applications require a different
container creation mechanism
Pl:
public class MyServletModule extends ServletModule {
@Override
protected void configureServlets() {
serve("/hello").with(HelloAppEngine.class);
filter("/*").through(MyFilter.class);
}
}
ServletContextListener
Injector should be created before any H p calls are
received.
public class MyGuiceServletConfig extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
Injector myinjector = Guice.createInjector(new MyServletModule(),
new ServiceModule(),
new JpaPersistModule("MyPersistenceUnit"));
myinjector.getInstance(PersistService.class).start();
return myinjector;
}
}
GuiceFilter
All requests need to go through GuiceFilter in order
to properly set up request and session scopes
web.xml
<filter>
<filter-name>guiceFilter</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>guiceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>guice.MyGuiceServletConfig</listener-class>
</listener>
Guice in App Engine
Requires the use of Guice v > 2.0 and the servlet
extension
Steps to perform:
Create web.xml, register Guice filter, reroute requests
Create a ServletModule
Create a class to extend GuiceServletContextListener
Register it in web.xml as a listener
Write code for Injector creation
Important considerations
Every servlet (or filter) is required to be a @Singleton
or you must bind it using
bind(..).in(Singleton.class)
Example code :
API with pure servlets
API with Apache Jersey
Cloud applications
GCP and App Engine basics
Jakab Hunor
Lecturer @ Babes-Bolyai University, Faculty of Mathematics and Computer Science
Cloud computing trends
Shared pools of configurable system resources and high
level services.
Timeline:
2006 - Amazon Elastic Compute Cloud
2008 - Google App Egine
2009 - Heroku
2010 - Microsoft Azure
computers
hard disk drives
virtual machines
These resources are accessed through GCP services. Applications are a
mix of available GCP services
GCP - resource regions and zones
GCP - resource regions and zones
Geographical distribution is well thought out
Main features:
No upfront costs
Pay-as-you-go
No termination fees
Free services with limited quotas
Google App Engine
Google App Engine is Cloud Platform's platform as a
service (PaaS)
Properties:
Fully managed (hosting, scaling, monitoring, infrastructure)
Supports many different languages:
standard environment: java7, java8, Python, PhP, Go
flexible environment: Python 3.4, Go, Node.js, Ruby
Free apps have to be deployed to the standard environment
Google Container Engine
Create and manage clusters of containerized
applications.
Microservice architecture
A deployed service behaves like a microservice
An application is a set of microservices
App Engine overview
Application
App Engine services
Microservices allow a large application to be
decomposed into independent constituent parts, with
each part having its own realm of responsibility
Properties:
full isolation of code
independent deployment cycles
autoscaling, loadbalanding
Multiple versions can be deployed at the same time
Code in one service can't directly call code in another
Service stack
App Engine applications
App Engine services consist of source code and
configuration files.
Service properties:
Has a unique name
Can have multiple versions ( determined by its source )
Can run on one or multiple instances at the same time
Communication between services
Services are logically separated components of the
application, each running in a secure sandbox
environment
Consequences:
Each service is reachable through HTTP requests
Services within the same app share certain resources:
Memcache
Datastore
Task Queues
Custom APIs and endpoints can be easily defined using Cloud
endpoints
App Engine instance handling
Instances are the computing units that App Engine
uses to automatically scale your application
Instance properties:
provide resources for the application
language runtime
App Engine APIs
Application code and memory
has its own security layer
Autoscaling se ings determine the number of instances for a service
Anathomy of an App Engine
Application
<application root>/
WEB-INF/ WEB-INF/
appengine-web.xml properties:
xml file with a root element <appengine-web-app>
Can be different when using cloud-sdk and appengine-java-sdk
tooling
Information within is used when deploying the app to the cloud
All configuration options can be found here
Google Cloud SQL
A fully-managed database service for relational
databases on Google Cloud Platform (MySQL and
PostgreSQL).
MySQL
Support mysql 5.6 or 5.7
Instances created and managed in the GCP console
Data replication between multiple zones
Regional locations
Cloud SQL
Requires google specific mysql driver and auto loading
se ing in appengine-web.xml
Driver coordinates:
<groupId>com.google.cloud.sql</groupId>
<artifactId>mysql-socket-factory-connector-j-6</artifactId>
<version>1.0.4</version>
Appengine-web.xml:
<use-google-connector-j>true</use-google-connector-j>
Cloud SQL sample
persistence.xml
Driver class and database url need to be specified
correctly:
<property name="javax.persistence.jdbc.url"
value="jdbc:google:mysql://idde-191204:europe-west3:idde/idde"/>
<property name="javax.persistence.jdbc.driver"
value="com.mysql.jdbc.GoogleDriver"/>