43
WebStore #maven JAX-WS SOAP WS, Stateful Session Bean, PMD, JavaDoc Óbudai Egyetem, Java Enterprise Edition Műszaki Informatika szak Labor 8 Bedők Dávid 2018-03-03 v1.0 Bedők Dávid (UNI-OBUDA) WebStore () 2018-03-03 v1.0 1 / 43

WebStore #maven - JAX-WS SOAP WS, Stateful Session Bean, … · 2018. 3. 3. · WebStore #maven JAX-WSSOAPWS,StatefulSessionBean,PMD,JavaDoc ÓbudaiEgyetem,JavaEnterpriseEdition MűszakiInformatikaszak

  • Upload
    others

  • View
    10

  • Download
    0

Embed Size (px)

Citation preview

  • WebStore #mavenJAX-WS SOAP WS, Stateful Session Bean, PMD, JavaDoc

    Óbudai Egyetem, Java Enterprise EditionMűszaki Informatika szakLabor 8

    Bedők Dávid2018-03-03v1.0

    Bedők Dávid (UNI-OBUDA) WebStore () 2018-03-03 v1.0 1 / 43

  • SOAP webszolgáltatások

    . 1998, 2000 (v1.1), 2003 (v1.2 W3C ajánlással)

    . Simple Object Access Protocol (SOAP), de 1.2 után "nemhasználjuk kibontva" mert nem túl találó a név

    . XML SOAP Request üzenetre XML SOAP Response üzenet érkezik(XSD írja le a típus információkat!)

    . Web Services Description Language (WSDL) írja le a kommunikációlehetőségeit és szabályait

    . Általában HTTP(S)-n keresztül küldjük (hasonlóan a RESTfulwebszolgáltatásokhoz), ám ez csupán egy gyakori opció jelen esetben

    . Rendkívül jól bővíthető, nagyszerű és kiforrott (és jelenleg is bővülő)szabványok vezérlik

    . Titkosítás és digitális aláírás(ok) támogatása - Web ServicesSecurity (WS-Security, WSS)

    . Universal Description Discovery and Integration (UDDI),webszolgáltatások regisztrálása szolgáltatások keresőkbe

    Bedők Dávid (UNI-OBUDA) WebStore (soap-ws.tex) 2018-03-03 v1.0 2 / 43

  • Top-Down vs. Bottom-Up megközelítés

    . Top-down megközelítés : WSDL-t készítünk, majd ebből gépi útonlegeneráljuk a szükséges Java osztályokat (stub-okat az XSD alapján,és service-t a WSDL többi része alapján)

    . Bottom-up megközelítés : Java kódot készítünk (stub-ok, service,számos annotáció), és ebből generáltatjuk le a WSDL-t

    Kliens vonatkozásábanKliens készítéshez csak és kizárólag a WSDL-re van szükség (ettől lesz atörténet programozási nyelvek között szabadon átjárható, mégis közel olyantípusos (és egyértelmű, gép és ember számára is), mint pl. a Java).

    Bedők Dávid (UNI-OBUDA) WebStore (topdown-vs-bottomup.tex) 2018-03-03 v1.0 3 / 43

  • KonfigurációSOAP üzenet formátuma vonatkozásában (négy kombináció)

    . Encoding Style/Communication Style (megnevezett tulajdonság a WSDL-ben)

    • Document/Message-Oriented : szabadon formázható XML tartalom(egyedül az XML formázás szabályainak kell megfelelni)

    • RPC : kötöttebb (sokszor bővebb, a művelet nevének és argumentumai-nak muszáj jelen lennie), ám gépi úton könnyebben automatizálható

    . Encoding Models (megnevezett tulajdonság a WSDL-ben)• Literal : a tartalomnak illeszkednie kell a WSDL-ben leírt, felhasználó ál-

    tal definiált XSD típus információkra (XSD validáció). További előny hogyXSLT segítségével az üzenet válasza könnyen és egyértelműen átalakítha-tó mássá (pl. XHTML dokumentummá egy weboldal/webalkalmazás szá-mára)

    • Encoded : csak és kizárólag előre definiált XSD típusok használhatóak(nehézkesebb validáció)

    Document style esetén lehetőség van a SOAP Response validálására, mígRPC esetén ez nagyon körülményes, bizonytalan. Az általunk választottkonfiguráció a Document/literal lesz.

    Bedők Dávid (UNI-OBUDA) WebStore (configuration-message.tex) 2018-03-03 v1.0 4 / 43

  • KonfigurációParameter Stlye

    . Parameter Style (a hivatkozások lesznek máshogy szervezve a WSDL-ben)

    • BARE : nem csomagol semmit a SOAP üzenetekbe, ha olvashatóeredményt szeretnénk, mi magunknak kell csomagoló osztályokatkészítenünk (mind paraméterként, mind visszatérési értékként). AWSDL szintjén az operation, message és element részek neveikülönbözőek lesznek/lehetnek ez esetben.

    • WRAPPED : a kérés és a válasz paramétereit becsomagolja a mű-velet köré (átláthatóbb, ám néhol hosszabb SOAP üzeneteket ered-ményezhet). A WSDL szintjén az operation, message és elementrészek nevei azonosak lesznek ez esetben.

    Az általunk választott konfiguráció a WRAPPED Parameter Style lesz.

    Bedők Dávid (UNI-OBUDA) WebStore (configuration-parameter.tex) 2018-03-03 v1.0 5 / 43

  • WSDL felépítéseA megvalósítandó feladat példája alapján� �1 2 3 [..]

    4 5 [..]6 7 8 9

    10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 � �

    Bedők Dávid (UNI-OBUDA) WebStore (wsdl-overview.tex) 2018-03-03 v1.0 6 / 43

    A WSDL egyes részei egymás elemeire vagyegészére hivatkoznak. A service hivatko-zik a binding-ra, a binding a portType-ra és az azon belül definiált operation-ökre, a portType operation-jei hivatkoz-nak a message-ekre, a message-ek pediga WSDL-ben megtalálható XSD schema ele-mekre (types rész).

  • SOAP üzenetek - Request és Response� �1 2 3 4 5 6 � �

    SOAP Request

    A http://schemas.xmlsoap.org/soap/envelope/ névtér határozza meg az alap elemeket ésattribútumokat (pl. Envelope, Header, Body, stb), míg a http://www.qwaevisz.hu/WebStorenévtér a saját alkalmazásunk névtere, amit majd definiálni fogunk (pl. ListAllProducts,ListAllProductsResponse).� �1 2 3 4 5 6 7 8 9

    10 11 12 � �

    SOAP ResponseBedők Dávid (UNI-OBUDA) WebStore (soap-messages.tex) 2018-03-03 v1.0 7 / 43

    http://schemas.xmlsoap.org/soap/envelope/http://www.qwaevisz.hu/WebStore

  • WebStoreSOAP webszolgáltatások

    Feladat : Készítsünk egy webáruház alkalmazást, melyben különféle márkájúTV készülékeket lehessen vásárolni. Az alkalmazás a raktáron lévő termékeketmemóriában tárolja, a vásárlók hitelesítésével ne foglalkozzunk.Készítsünk a raktárkészlet lekérdezésére szolgáló, illetve a webkosár ke-zelésére alkalmas SOAP webszolgáltatást !A webkosár az adott user-session idejére tartalmazzon termékeket (márka,megnevezés, egységár). Ha ugyanabból a termékből többet vásárol a felhasz-náló, csak a darabszámot növeljük a kosárban!

    [gradle|maven]\jboss\webstore

    Bedők Dávid (UNI-OBUDA) WebStore (webstore.tex) 2018-03-03 v1.0 8 / 43

  • WebStoreKövetelmények

    . A vásárló a kosárnak adhasson egy azonosítót/nevet, melyet beállításután vissza is kérhet (csupán demonstrációs cél). Ha névtelen kosárnevét kérjük le, a rendszer adjon SOAP Fault hibaüzenetet a felhasz-nálónak.

    . A webkosár tartalmát, állapotát Stateful Session Bean-ben tároljuk.

    . Kliens alkalmazásként SOAP-UI programot illetve saját készítésű Javakliens alkalmazást is készítsünk.

    Bedők Dávid (UNI-OBUDA) WebStore (requirements.tex) 2018-03-03 v1.0 9 / 43

  • Project felépítéseModule-ok elhelyezkedése

    Bedők Dávid (UNI-OBUDA) WebStore (webstore-overview.tex) 2018-03-03 v1.0 10 / 43

  • Persistence layerws-persistence project

    � �1 @Local2 public interface StoreHolder {3 void create(Product product);4 Product read(String name);5 List readAll(String nameTerm);6 List readAll(Brand brand);7 List readAll ();8 void delete(String name);9 }� �

    StoreHolder.java� �1 @Local2 public interface PersistenceService {3 void create(Product product) throws PersistenceException;4 Product read(String name) throws PersistenceException;5 List readAll(String nameTerm) throws PersistenceException;6 List readAll(Brand brand) throws PersistenceException;7 List readAll () throws PersistenceException;8 void delete(String name) throws PersistenceException;9 }� �

    PersistenceService.java

    Bedők Dávid (UNI-OBUDA) WebStore (persistence-services.tex) 2018-03-03 v1.0 11 / 43

    A StoreHolder Singleton Ses-sion Bean tárolja (és iniciali-zálja) a saját domain típuso-kat (Brand és Product), míga PersistenceService StatelessSession Bean ehhez biztosít hoz-záférést az EJB service réteg szol-gáltatásai számára.

  • Adatmodellws-persistence és ws-ejbservice project

    . Persistence layer• Brand : PHILIPS, SONY, PANASONIC• Product : brand (Brand), name (String), price (int)

    . EJB Service layer• BrandStub : PHILIPS, SONY, PANASONIC• ProductStub : brand (BrandStub), name (String), price (int)• BasketItem : product (ProductStub), quantity (int)• Basket : identifier (String), items (List)• ServiceError : code (int), message (String)

    XML annotációkA stub-ok XML Bind annotációkkal vannak gazdagítva, hiszen ezek részt vesznek aSOAP kommunikációban, a SOAP XML üzenetek szerver részét fogják képezni!@XmlAccessorType(XmlAccessType.FIELD) : Az annotációk a mezőkön vannakdefiniálva.@XmlAccessorType(XmlAccessType.PROPERTY) : Az annotációk a getter metódusokonvannak definiálva.

    Bedők Dávid (UNI-OBUDA) WebStore (domain.tex) 2018-03-03 v1.0 12 / 43

    A Basket osztály tartalmazüzleti metódusokat is a webko-sár kezeléséhez (increment(),decrement(), getSize(),getTotal()).

  • XML Binding� �

    1 @XmlAttribute(name = "productName")2 private String name;� �A FIELD alapú elérésre példa a termék neve, mely esetén a SOAP-banszereplő üzleti név eltér a forráskód szabályai szerint megadottól. Az@XmlAttribute annotáció értelemszerűen attribútum lesz, itt XML-ben acamelCase írásmód az elterjedt, illetve ez az annotáció nem alkalmazhatóösszetett típusokra.� �1 @XmlAttribute(name = "total")2 public int getTotalPrice () {..}� �A kosár teljes értékét egy számított mezővel tudjuk megjeleníteni az XMLüzenetekben, ez esetben kizárólag a PROPERTY alapú elérés használható.� �1 @XmlElement(name = "Items")2 public List getItems () {..}� �Listák, tömbök, halmazok esetén a megadott elem név (@XmlElementannotáció) a gyermek elemek csoportosító elem neve lesz. Element-ekesetén az elterjedt írásmód XML-ben a CamelCase, mely eltér a Javaelnevezés szabályaitól.

    Bedők Dávid (UNI-OBUDA) WebStore (stub-xml-bind.tex) 2018-03-03 v1.0 13 / 43

  • EJB Service - Hibakezelésws-ejbservice project

    A ServiceError tartalmából fogunk későbbiekben SOAP Fault customhibaüzenetet (XML) gyártani. Természetesen most is az EJB réteg kivé-telt fog dobni hiba esetén (ServiceException), melybe elcsomagolunk egyhibakódot (WebStoreError enum: IDENTIFIER, PERSISTENCE, PRODUCT,BASKET).

    Rétegek közötti függőségA nyilvános interface-ek felé (SOAP) az EJB szolgáltatások rétege a már meg-ismert minták alapján a Product és Brand példányokból stub-okat készít aProductConverter Stateless Session Bean segítségével. Vegyük észre, hogy at-tól függetlenül, hogy az adatokat memóriában tároljuk, az EJB service felépítéseazonos a korábban megismerttel. Bár jelen esetben overkill -nek tűnhet a konverzióés akár egészében a teljes persistence réteg, e megoldás segítségével később úgyvezethetjük be pl. a RDBMS-ben való tárolást, hogy a teljes szolgáltatás rétegérintetlen maradhat (nem függ a tárolási réteg a logikai rétegtől).

    Bedők Dávid (UNI-OBUDA) WebStore (ejbservice-error-handling.tex) 2018-03-03 v1.0 14 / 43

  • EJB Service - Szolgáltatásokws-ejbservice project� �1 @Local2 public interface WebBasketService {3 void setIdentifier(String identifier) throws ServiceException;4 String getIdentifier () throws ServiceException;5 int getBasketSize () throws ServiceException;6 void addItem(String productName) throws ServiceException;7 void removeItem(String productName) throws ServiceException;8 Basket getContent () throws ServiceException;9 }� �

    WebBasketService.java� �1 @Local2 public interface StoreService {3 void add(ProductStub product) throws ServiceException;4 ProductStub get(String name) throws ServiceException;5 List list(String nameTerm) throws ServiceException;6 List list(BrandStub brand) throws ServiceException;7 List getAll () throws ServiceException;8 void remove(String name) throws ServiceException;9 }� �

    StoreService.javaBedők Dávid (UNI-OBUDA) WebStore (ejbservice-services.tex) 2018-03-03 v1.0 15 / 43

    Stateful Session Bean

    Stateless Session Bean

  • Stateful Session Bean

    . Az implementációt tartalmazó osztály rendelkezik a @Statefulannotációval.

    . Az osztály tartalmazhat instance field-eket, melyek állapotasession-önként értelmezett. Ha ugyanaz a session ismét meghívja aSFSB egy másik metódusát, az EJB container olyan állapotú példánytad vissza kiszolgálásra, melyben megtalálhatóak a session állapotai(mező értékei).

    . @PostConstruct annotációval ellátott metódus akkor fog lefutni,amikor új session hív meg üzleti metódust a bean-en belül.

    . @Remove annotációval ellátott metódus akkor fog lefutni, amikor asession már invalid, nem elérhető (pl. timeout miatt).

    ÁllapotkezelésA Stateful Session Bean mellett a Singleton Session Bean is tárolhat állapotot, azéletciklusa utóbbinak mégis a Stateless Session Bean-hez hasonló, mivel itt nincs szükségún. aktiválásra és passziválásra.

    Bedők Dávid (UNI-OBUDA) WebStore (stateful-session-bean.tex) 2018-03-03 v1.0 16 / 43

  • Session BeanÁllapotok és életciklusok

    . Stateless és Singleton Session Bean-ek, illetve Message-DrivenBean-ek esetén

    • Does not exist állapot• Ready állapot (üzleti metódus hívásra kész proxy -n keresztül)

    . Stateful Session Bean-ek esetén• Does not exist állapot• Ready állapot (aktív, üzleti metódus hívásra kész)• Passive állapot

    ◦ Memóriából a "secondary storage"-re írja a container azállapotát, mert még szükség lehet rá, de most épp nemhasználja a user

    ◦ @PrePassivate és @PostActivate metódusok készíthetőek

    @PostConstruct és @PreDestroy metódus mindegyik típusú Session Bean-hezkészíthető.

    Bedők Dávid (UNI-OBUDA) WebStore (session-beans-lifecycle.tex) 2018-03-03 v1.0 17 / 43

  • WebStoreService - Keretws-webservice project

    WSDL : http://localhost:8080/webstore/WebStoreService?wsdl� �1 package hu.qwaevisz.webstore.webservice;2 [..]3 @WebService(name = "WebStore", serviceName = "WebStoreService", targetNamespace =

    "http :// www.qwaevisz.hu/WebStore")4 @SOAPBinding(style = Style.DOCUMENT , use = Use.LITERAL , parameterStyle =

    ParameterStyle.WRAPPED)5 public class WebStoreService {6 [..]7 @EJB8 private StoreService storeService;9

    10 @WebMethod(action = "http ://www.qwaevisz.hu/WebStore/getProduct", operationName ="GetProduct")

    11 @WebResult(name = "Product")12 public ProductStub getProduct(@WebParam(name = "Name") String name) throws

    WebStoreServiceException {13 try {14 return this.storeService.get(name);15 } catch (ServiceException e) {16 throw new WebStoreServiceException(e.getMessage (), e.getError ());17 }18 }19 [..]20 }� �

    WebStoreService.javaBedők Dávid (UNI-OBUDA) WebStore (webstoreservice-frame.tex) 2018-03-03 v1.0 18 / 43

    Névtér beállítások a @WebService annotáció,míg konfigurációs elemek a @SOAPBinding an-notáció segítségével valósíthatóak meg.

    http://localhost:8080/webstore/WebStoreService?wsdl

  • WebStoreService - GetProductws-webservice project

    A @WebMethod annotációval ellátott metódus lesz egy művelet/üzenet pár a web-szolgáltatásban. Az annotáció attribútumaival tudjuk részletesen konfigurálni, hogymilyen néven jelenik meg majd mindez a WSDL-ben (mindezekre kihatnak a kon-figurációs beállítások is). Ha az operation neve GetProduct (és ez element-kéntmegjelenik az SOAP Request-ben), akkor erre a válasz a SOAP Response-banGetProductResponse lesz.� �1 @WebMethod(action = "http ://www.qwaevisz.hu/WebStore/getProduct", operationName =

    "GetProduct")2 @WebResult(name = "Product")3 public ProductStub getProduct(@WebParam(name = "Name") String name) throws

    WebStoreServiceException {4 [..]5 }� �A @WebResult annotáció a visszatérési érték wrappere lesz. A ProductStub pél-dány egy Product elembe lesz visszaküldve a SOAP Response-ban. Ha nem defi-niáljuk a @WebResult-ot, akkor egy return elemben jelenik meg a ProductStubXML szerializációja (az @XmlRootElement annotáció jelen konfiguráció esetén nemszámít). A @WebParam annotáció a kérés (request) XML elem nevét tudja definiálni(egy Name elementben lehet megadni a keresett termék pontos megnevezését).

    Bedők Dávid (UNI-OBUDA) WebStore (webstoreservice-getproduct.tex) 2018-03-03 v1.0 19 / 43

  • SOAP üzenetek - GetProduct� �1 2 3 4 5 SD85 4K HDR6 7 8 � �

    SOAP Request� �1 2 3 4 5 6 7 � �

    SOAP Response

    Hibaesetek kezeléseHa a WebMethod kivételt dob, akkor ebből SOAP Fault válasz készül.Ellenkező esetben a visszatérési érték példánya XML szerializáláson esikkeresztül.Bedők Dávid (UNI-OBUDA) WebStore (soap-messages-getproduct.tex) 2018-03-03 v1.0 20 / 43

    A brand, productName és price attribútum nevek a ProductStubXML Bind annotációin keresztül konfigurálhatóak.

  • WSDL - Termék lekérdezéseTípus információk� �1 2 3 4 5 6 7 8 9

    10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 [..]29 � �

    Bedők Dávid (UNI-OBUDA) WebStore (wsdl-getproduct-types.tex) 2018-03-03 v1.0 21 / 43

    A típus információkhoz egyrészt a http://www.w3.org/2001/XMLSchema namespacealatti értékeket (pl. int, string), másrésztaz alkalmazás saját névtere (http://www.qwaevisz.hu/WebStore) által bevezetett tí-pusok használhatóak.

    http://www.w3.org/2001/XMLSchemahttp://www.w3.org/2001/XMLSchemahttp://www.qwaevisz.hu/WebStorehttp://www.qwaevisz.hu/WebStore

  • WSDL - Termék lekérdezéseÜzenetek definiálása� �1 2 3 4 5 6 7 8 9

    10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 [..]27 28 � �Bedők Dávid (UNI-OBUDA) WebStore (wsdl-getproduct-messages.tex) 2018-03-03 v1.0 22 / 43

    Hivatkoznak a típus definíciókra.

    A hibakezeléshez kapcsolódó típu-sokat és üzeneteket nem tartal-mazza a kivágott WSDL részlet azáttekinthetőség végett.

  • SOAP WebService - HibakezelésSOAP Fault

    Ha szerver oldalon hiba történik, SOAP Fault üzenetet illendő válaszkéntadni. A SOAP Fault jelzi a problémát (faultcode és faultstring), ésopcionálisan részleteket is közölhet (detail). Utóbbi egy Java kivételosztály XML szerializálásának eredménye lehet!� �1 2 3 4 soap:Server 5 Product does not exist in the catalog (name: lorem).6 7 8 209 Product does not exist in the catalog (name: lorem).

    10 11 12 13 14 � �

    Bedők Dávid (UNI-OBUDA) WebStore (soap-fault.tex) 2018-03-03 v1.0 23 / 43

  • ServiceError DTOws-ejbservice project� �1 package hu.qwaevisz.webstore.ejbservice.domain;2 [..]3 @XmlRootElement(name = "ServiceError")4 public class ServiceError implements Serializable {56 private final int code;7 private final String message;89 public ServiceError () { this(0, null); }

    1011 public ServiceError(final int code , final String message) { [..] }1213 @XmlElement(name = "code")14 public int getCode () {15 return this.code;16 }1718 @XmlElement(name = "message")19 public String getMessage () {20 return this.message;21 }2223 @Override24 public String toString () {25 return "ServiceError [code=" + this.code + ", message=" + this.message + "]";26 }27 }� �

    ServiceError.javaBedők Dávid (UNI-OBUDA) WebStore (service-error-dto.tex) 2018-03-03 v1.0 24 / 43

    JAX-B : Alapértelmezés szerint az XML szerializálás@XmlAccessorType(XmlAccessType.PROPERTY) kon-figuráció szerint történik, vagyis a getter metódusokhatározzák meg a kiírandó mezőket.

  • Egyedi SOAP Fault üzenetws-webservice project� �1 package hu.qwaevisz.webstore.webservice.exception;2 [..]3 @WebFault(name = "WebStoreServiceFault", targetNamespace =

    "http :// www.qwaevisz.hu/WebStore")4 public class WebStoreServiceException extends Exception {5 private final ServiceError faultInfo;6 public WebStoreServiceException(String message , ServiceError

    faultInfo) {7 super(message);8 this.faultInfo = faultInfo;9 }

    10 public WebStoreServiceException(String message , ServiceErrorfaultInfo , Throwable cause) {

    11 super(message , cause);12 this.faultInfo = faultInfo;13 }14 public ServiceError getFaultInfo () {15 return this.faultInfo;16 }17 }� �

    WebStoreServiceException.javaBedők Dávid (UNI-OBUDA) WebStore (custom-soap-fault.tex) 2018-03-03 v1.0 25 / 43

    A kivétel dobása a @WebMethod-ból fog-ja indikálni a SOAP Fault elkészítését,amennyiben a kivétel @WebFault anno-tációval rendelkezik.

    A kivétel message attribútuma kerül aSOAP Fault faultstring részébe. Deettől természetesen el lehet térni.

    A getFaultInfo() getter metódus (ametódust így kell elnevezni) által vissza-adott DTO példány XML szerializálássorán bekerül a SOAP Fault detail ré-szébe.

  • SmartBear: SoapUIFunction és End-to-End teszt alkalmazás/platform

    . https://www.soapui.org/

    . Verzió: v5.4.0

    . Telepítés: next-next-finish

    . Ingyenes, open-source, létezik fizetős Pro változat is

    . Function/End-to-End tesztelésre alkalmas eszköz• SOAP webszolgáltatások esetén• RESTful webszolgáltatások esetén• JMS támogatás (HermesJMS van integrálva)

    . magas szinten támogatja a security szabvány megoldásokat(titkosítás, digitális aláírás, stb.)

    Bedők Dávid (UNI-OBUDA) WebStore (soap-ui.tex) 2018-03-03 v1.0 26 / 43

    https://www.soapui.org/

  • SmartBear: SoapUISOAP client készítése WSDL alapján

    File | New SOAP project. Project name: WebStore. Initial WSDL:http://localhost:8080/webstore/WebStoreService?wsdl

    . Create sample requests for all operations

    . Creates a TestSuite for the imported WSDL

    Ennyi?Ennyi. A WSDL minden szükséges információt tartalmaz ahhoz, hogy egy tel-jes körű kliens alkalmazást tudjon a SOAP UI készíteni. Nincs ebben semmi"különleges", egyetlen CLI command végrehajtásával ugyanezt mi is meg-tesszük majd. A WSDL-t nem szükséges elérhető URL-ként megadni, egy offlineXML állomány is megteszi.

    Bedők Dávid (UNI-OBUDA) WebStore (soap-ui-create-client.tex) 2018-03-03 v1.0 27 / 43

    http://localhost:8080/webstore/WebStoreService?wsdl

  • WebStoreService - AddProductws-webservice project

    � �1 @WebMethod(action = "http ://www.qwaevisz.hu/WebStore/addProduct",

    operationName = "AddProduct")2 public void addProduct(@WebParam(name = "Product") ProductStub

    product) throws WebStoreServiceException {3 [..]4 }� �� �1 2 3 � �

    SOAP Request� �1 � �SOAP Response

    Bedők Dávid (UNI-OBUDA) WebStore (add-product.tex) 2018-03-03 v1.0 28 / 43

  • Webes vásárlás folyamata - I

    SOAP Request SOAP Response� �1 2 423 � �

    � �1 � �

    � �1 � �

    � �1 2 423 � �� �

    1 2 SD85 4K

    HDR3 � �

    � �1 � �

    A háttérben Stateful service → Pl. az Identifier megadása az egyes hívások kö-zött szükségtelen (ezt a viselkedést próbálja ez a kérés szimulálni), a szerver oldalona session szinten tárolunk állapotot, és ezáltal fognak a hívások azonos webkosárravonatkozni. Stateless esetén az adatokat pl. egy in-memory adatbázisban kelleneeltárolnunk, és minden kérésben szerepeltetni a kosár azonosítóját.

    Bedők Dávid (UNI-OBUDA) WebStore (purchase-step-1.tex) 2018-03-03 v1.0 29 / 43

    Az egyik TV-ből kettőt vásárolunk, ezért ezt az üzenetet 2xküldjük el, miközben egy másik TV-t is beteszünk a kosárba.

  • Webes vásárlás folyamata - II

    SOAP Request SOAP Response� �1 � �

    � �1 2 23 � �

    � �1 � �

    � �1 2 3 4

    5 6 7

    8 9

    10 � �Bedők Dávid (UNI-OBUDA) WebStore (purchase-step-2.tex) 2018-03-03 v1.0 30 / 43

  • Java WebService kliens alkalmazás

    Maga a WebService nyelvfüggetlen technológia, a WSDL birtokában bármilyennyelven készíthetünk klienst a Java nyelven írt szerverhez (a SoapUI -t isJava-ban írták, de a WSDL-en kívül semmit nem adtunk meg számára). Ettőlfüggetlenül természetesen írhatunk Java klienst mi magunk is, hiszen "csak"XML dokumentumokat kell egy adott endpoint-ra elküldenünk, tipikusanHTTP-n keresztül.De még ennél is egyszerűbb dolgunk van, ha megismerjük a wsimport nevűCLI alkalmazást, mely a Java JDK része.� �1 > cd ws-client2 > wsimport -s src/main/java -d bin -keep -p

    hu.qwaevisz.webstore.client.generatedhttp :// localhost :8080/ webstore/WebStoreService?wsdl� �

    A ws-client project lesz a kliens alkalmazás. Ennek src/main/java sour-ce könyvtárába, hu.qwaevisz.webstore.client.generated csomagnév-vel (és könyvtárstruktúrával) szeretnénk legenerálni a megadott URL-en elér-hető WSDL segítségével a kliens alkalmazásunkat.

    Bedők Dávid (UNI-OBUDA) WebStore (java-client.tex) 2018-03-03 v1.0 31 / 43

  • Kliens alkalmazásws-client project� �1 URL endpoint = new

    URL("http :// localhost :8080/ webstore/WebStoreService?wsdl");23 WebStoreService service = new WebStoreService(endpoint);4 WebStore webStore = service.getWebStorePort ();56 try {7 List products = webStore.listAllProducts ();89 for (ProductStub product : products) {

    10 System.out.println("Product: " + product.getBrand () + ":" +product.getProductName () + " ( price: " +product.getPrice () + " $ )");

    11 }12131415 } catch (WebStoreServiceException e) {16 e.printStackTrace ();17 }� �

    Application.javaBedők Dávid (UNI-OBUDA) WebStore (application.tex) 2018-03-03 v1.0 32 / 43

    A medadott URL jelen esetbennem lenne szükséges, hiszen azeredeti WSDL-ben is ez szerepel.Sokszor azonban a WSDL-ből kitör-lik a valós URL-t (security), ezérta kliensnek kell ezt megadnia. En-nek egyik legegyszerűbb módja abemutatott.

  • Kommunikáció megismert formái

    Bedők Dávid (UNI-OBUDA) WebStore (communication.tex) 2018-03-03 v1.0 33 / 43

  • WebLogic változatMódosítások

    Az alkalmazás gyakorlatban módosítás nélkül működik WebLogic alatt is.Az alábbi elemeket azonban figyelembe kell venni :

    . log4j helyett JDK logging használata

    . a weblogic elvárja hogy a Stateful Session Bean-ben lévő @Remoteéletciklus metódus business metódus is legyen, ezért fel kell venni azinterface-be� �

    1 [..]2 @Local3 public interface WebBasketService {4 [..]56 void remove ();7 }� �

    WebBasketService.java

    Bedők Dávid (UNI-OBUDA) WebStore (weblogic.tex) 2018-03-03 v1.0 34 / 43

  • PMDForráskód elemző

    . https://pmd.github.io/

    . Verzió: v6.1.0

    . Támogatott nyelvek: Java, JavaScript, PLSQL, Apache Velocity,XML, XSL

    . Dokumentáció: https://pmd.github.io/pmd-6.1.0/

    . Minden Rule egy RuleSet része.

    . Java-hoz léteznek előre definiált RuleSet-ek, de sajátot is készíthetünk.

    . Rule : név, leírás, prioritás, példa, implementáló osztály, illetveopcionális tulajdonságok halmaza (pl. CyclomaticComplexity ruleesetén a reportLevel egy Integer property).

    Bedők Dávid (UNI-OBUDA) WebStore (pmd.tex) 2018-03-03 v1.0 35 / 43

    https://pmd.github.io/https://pmd.github.io/pmd-6.1.0/

  • PMDPrioritások

    1. A változtatás mindenképpen szükséges. A jelenlegi viselkedés hibás,kritikus hibát jelez.

    2. A kód megváltoztatása erősen javallot. A jelenlegi megoldás nagyvalószínűséggel hibás.

    3. A változtatás javasolt. A megvalósítás zavaró, talán hibás, avagy ellentmond az standard -eknek ill. best practice-eknek.

    4. A változtatás opcionális. A jelenlegi kód valószínűleg nem hibás, csaknem követi a standard -eket, stílust, jó ízlést.

    5. A változtatás nem szükséges. Nem árt, de olyan apróságot javítcsupán mint pl. a csomag/osztály nevek konzisztenciája.

    Bedők Dávid (UNI-OBUDA) WebStore (pmd-priority.tex) 2018-03-03 v1.0 36 / 43

  • PMD és Maven integrációroot project� �1 2 3 3.84 5 6 7 8 9 org.apache.maven.plugins

    10 maven -pmd -plugin 11 ${ version.plugin.pmd}12 13 14 /rulesets/java/basic.xml15 /rulesets/java/braces.xml16 17 18 19 20 21 22 � �

    pom.xmlBedők Dávid (UNI-OBUDA) WebStore (pmd-maven.tex) 2018-03-03 v1.0 37 / 43

    Az itt megadott ruleset-eknek mindenprojektre (minden modulra) érvényesnekkell lennie! A pmd ellenőrzést a mvnclean package pmd:pmd parancs fut-tatásával végezhetjük el.

  • PMD Szabály halmazok leíróipmd-bin-[version].zip | pmd-bin-[version].zip | lib | pmd-java-6.1.0.jar |rulesets | java | *.xml� �1 2 The Basic ruleset ..3 [..]4

    10 Avoid jumbled ..11 312 13 14 15 16 17 18 19 � �

    basic.xmlBedők Dávid (UNI-OBUDA) WebStore (pmd-rulesets.tex) 2018-03-03 v1.0 38 / 43

    Ezeket az XML állományokatmásoljuk be pl. a root Gradleproject rulesets könyvtá-rába (pl. rulesets/basic.xml)

  • PMD finomhangolásaws-ejbservice project

    Saját ruleset állományt legegyszerűbben úgy készíthetünk, hogy meglévőszabály halmazokat válogatunk össze, és ezeket - igény esetén -finomhangoljuk, konfiguráljuk (megváltoztatjuk eredeti beállításaikat).� �1 2 78 Custom ruleset 9

    10 11 12 13 � �

    ruleset.xml

    Bedők Dávid (UNI-OBUDA) WebStore (pmd-finetuning-maven.tex) 2018-03-03 v1.0 39 / 43

  • PMD finomhangolásaSaját ruleset definiálása meglévők alapján� �1 23 45 6 7 89

    11 112 1314 15 16 17 18 � �

    ws-ejbservice | config | pmd | ruleset.xml

    Bedők Dávid (UNI-OBUDA) WebStore (pmd-custom-ruleset.tex) 2018-03-03 v1.0 40 / 43

  • javadoc

    A javadoc egy a JDK-val szállított ([JDK-HOME]/bin) dokumentum készítőeszköz. A forráskód helyét (-sourcepath) követően fel kell sorolni a csoma-got (hu.qwaevisz.webstore.dummy), amelyre a dokumentációt szeretnénkelkészíteni (alapértelmezetten HTML formátum, oracle java standard doclet).� �1 > javadoc -sourcepath ws -dummy/src/main/java

    hu.qwaevisz.webstore.dummy� �Ha a forráskód lefordításához külső források is szükségesek (pl. saját doclet-et készítünk), akkor meg kell adni ezt is paraméterben (-classpath).� �1 > javadoc -classpath ws-common/build/classes/main -sourcepath

    ws -dummy/src/main/java hu.qwaevisz.webstore.dummy� �

    Bedők Dávid (UNI-OBUDA) WebStore (javadoc.tex) 2018-03-03 v1.0 41 / 43

  • javadoc és Maven integrációjavadoc készítése Maven segítségével� �1 2 [..]3 4 2.10.4 5 6 [..]7 8 9

    10 11 org.apache.maven.plugins 12 maven -javadoc -plugin 13 ${ version.plugin.javadoc}14 15 16 17 18 � �

    pom.xml� �1 > mvn site� �

    Bedők Dávid (UNI-OBUDA) WebStore (javadoc-maven.tex) 2018-03-03 v1.0 42 / 43

  • Doclet

    . A doclet-ek Java nyelven írt programok, melyek a Doclet API-thasználják hogy definiálják a tartalmát és formátumát a javadocalkalmazásnak.

    . Alapértelmezés szerint a javadoc a standard oracle (sun) javadoclet-et használja (API dokumentáció létrehozása HTMLformátumban).

    . A javadoc igazi ereje a saját doclet készítésének lehetőségében rejlik.

    A docletpath a doclet-et tartalmazó forrás helye (megadható jar is1), míga doclet értéke az osztály full qualified neve lesz.� �1 > javadoc -classpath ws-common\build\classes\main -docletpath

    ws -doclet\build\classes\main -doclethu.qwaevisz.webstore.doclet.WebStoreDoclet -sourcepathws -dummy\src\main\java -ws -filename ws.xmlhu.qwaevisz.webstore.dummy� �

    1Ha több jar -t sorolunk fel a classpath vagy docletpath értékeiben, win esetén";", míg nix esetén ":" karaktert kell használni elválasztásra.

    Bedők Dávid (UNI-OBUDA) WebStore (doclet.tex) 2018-03-03 v1.0 43 / 43