Remélem a címmel nem váltom ki a népharagot, de a nevezett közösségek nem tudják úgy összehúzgálni a portáljukat, mint a Javások. Ebben a posztban ezt a lehetőséget villantjuk fel a WebSynergy-OpenPortal-Web Space Server nyomon járva. (Kellemeset a hasznossal: s egyben segítséget adunk a gazdaság informatikusok Adatkezelés példájához, illetve a mérnök informatikusok is kaphatnak prog1-ből három trófeát ezért a "saját XSD alapú validáló, XSLT-s html transzformáló portlet reprója labormérésért").
PHP - barbár technológia
"Mindig van pár hallgató, aki tegnapra, tizedáron, doksi nélkül összedobja a garázsban" - bírom a LAMP-ot, kis PHP a PP-be is bekerült, de az elmúlt 10 évben kialakult, az a feltlételes verbális reflexem, hogy ha kimondom, hogy PHP, utána azonna jön a "barbarian tecnology" sztring...
Lássuk az "ős"-technológiát (*)
A Web Space Server-t fogjuk használni. Ez a korábban még a Sun-nál WebSynergy kódnéven futó Java EE portálmegoldás a szoftver törzsfejlődés korai szakaszában Sun Java System Portal Server néven futott. Oprendszerfüggetlenül MySQL, GlassFish és Liferay kombinációt takar ma.
Ez miért nem barbár? Nézzük például a logikailag most következő lépést, a telepítést és kapcsolódóan a hordozhatóságot, krémként a skálázhatóságot. Webes rendszereknél, legyen az akár egy integrált könyvtári rendszer vagy egy vállalati intranet, tipkusak a következő lépések:
- rendszergazdai közbenjárással adatbázis telepítés és előkészítés (mondjuk pg_hba.conf-ban, hogy hogy érjük el stb. hasonlóak)
- adatbázis felépítése (pl. mindenféle kapott szkriptek futtatása...)
- megintcsak rendszergazdai közbenjárással szerveroldali komponensek telepítése (pl. összehangolás az Apache-al...)
Mi a helyzet nálunk: lerántom a szoftvert, kicsomagolom és indítom az alkalmazésszervert (ez most csúnya lesz, mert a példában a GlassFish2-s verziót toljuk, így lesz egy telepítéses sor is...)
unzip webspace-10.1-gfv2-linux.zip
Jöhet is a böngésző: http://localhost:8080/ kis kattintgatás és a szó szoros értelmében (NO PROGRAMMING mellett) összehúzogatok egy olyan portált, amibe most például belehúzogattam Google Maps-t, valuta átváltót, tőzsdei figyelőt, RSS hírolvasót, portál nyelve váltó (portletet) stb. több száz ilyen közül lehet válogatni, s ebben a posztban nyilván mi is írunk egy saját portletet, nem is akármilyet: tudjon DocBook XML 5.0 doksit validálni és XSLT-vel tudja átkonvertálni HTML-be, ami konverziót aztán dobjon is ki a "webre"!
cd webspace-gfv2-linux/glassfish2/
ant -f setup.xml
cd bin/
./asadmin start-domain
Visszatérve még a nem barbársághoz: csak egy mezei júzer accountra volt szükségem, a portál könyvtárát akár betömöríthetem, áttehetem egy Windows-os laptopra, ott elindítom, szerkesztgetem és azt megint betömörítve visszaviszem az eredeti gépre és egy az egyben a könyvtár cseréjével beizzítom a portál új, a laptopon készített aktuális változatát... üdvözöllek a 21. században...
Fejlesztőként pedig az az élmény, hogy fejlesztgetem a NetBeans-ben (Java a téma és nem Android, így nyilván fel sem merül az Eclipse elindítása...) szóval programozgatsz a NetBeans-ben és a futó portálra deployolod fel automatikusan a progid... nem utolsó szempont hallgatóinknak sem, hogy Java EE tapasztalatokat szerezhetnek és akkor még nem is klaszteren nyomjuk...
*: Csillagkapu terminológia.
A saját portletért katt a továbbra!
Mivel a példát pár évig használhatjuk majd a bevezető oktatásban, így a most aktuális cuccokkal készítjük el, így a hozzávalók:
- NetBeans 7, a Portal Pack plugin telepítéshez kell Ruby, az ebből a verzióból kikerült, külön tedd fel.
- Portal Pack 3.0.4, letölteni, úgy telepíteni plaginként:
- Saxon, kell egy XSLT implementáció, de ez már csak amiatt, hogy a mi portletünk le tudja nyomni a transzfót.
- Azt felteszem, hogy a GlassFish 2 vagy 3 már beizzításra került a poszt elején felbuzdulva.
Pár lépésben létrehozzuk a projektet:
Megadjuk a projekt nevét, ilyen néven jön majd létre könyvtár a NetBeansProjects-ben:
Először nem lesz ott, így hozzáadjuk (Add) a futó portálunkat:
A "Java EE" szabvány jelszó az "adminadmin"
A GlassFish Home a futó Web Space szerverünk glassfish könyvtára legyen!
Portletet akarunk:
OK., nincs más hátra, mint a lényegi rész: a saját portlet beprogramozása. Most királyi utad lesz, mert adom a Java és a JSP forrást is. Előbbi egy DocBook6.java mutáns, utóbbi egyszerűen bekéri a DocBook 5.0 forrás URL címét:
Db2Html_view.jsp
1 <%@page contentType="text/html"%> 2 <%@page pageEncoding="UTF-8"%> 3 4 <%@ page import="javax.portlet.*"%> 5 <%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%> 6 7 <portlet:defineObjects /> 8 <%PortletPreferences prefs = renderRequest.getPreferences();%> 9 10 <%= prefs.getValue("docbook2HTML", "Add a bemenő fájlt!") %> 11 <br> 12 A DocBook XML 5.0 forrásfájl: 13 <form method="post" action="<portlet:actionURL/>"> 14 <input type="text" name="docbookFileURL"/> 15 <input type="submit"/> 16 </form>
Db2Html.java
1 public class Db2Html extends javax.portlet.GenericPortlet { 2 3 public void processAction(javax.portlet.ActionRequest request, javax.portlet.ActionResponse response) throws javax.portlet.PortletException, java.io.IOException { 4 javax.portlet.PortletPreferences prefs = request.getPreferences(); 5 6 String docbookFileURL = request.getParameter("docbookFileURL"); 7 System.out.println(docbookFileURL); 8 9 /* A Validation API-val dolgozunk. Melyik sémanyelvet akarjuk 10 használni, most a W3C XML sémát, de ez lehetne például a RELAX NG 11 is. */ 12 javax.xml.validation.SchemaFactory schemaFactory = 13 javax.xml.validation.SchemaFactory.newInstance( 14 javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI); 15 javax.xml.validation.Schema schema = null; 16 try { 17 /* Hol van a DocBook 5 e séma szerinti megadása? */ 18 schema = schemaFactory.newSchema( 19 new java.net.URL( 20 "http://www.docbook.org/xml/5.0/xsd/docbook.xsd")); 21 } catch (java.net.MalformedURLException muE) { 22 muE.printStackTrace(); 23 } catch (org.xml.sax.SAXException saxE) { 24 saxE.printStackTrace(); 25 } 26 javax.xml.validation.Validator validator = 27 schema.newValidator(); 28 validator.setErrorHandler(new Hibakezelo()); 29 javax.xml.transform.Source source = 30 new javax.xml.transform.stream.StreamSource(docbookFileURL); 31 /* Önálló kísérletezéshez az iménti sort bekommentezve, ezt meg 32 kikommentezve a fájlrendszerben lévő xml-el dolgozhatsz: */ 33 //"file:\\c:\\Documents and Settings\\Bátfai Norbert\\ 34 // Dokumentumok\\Letöltések\\ppmkonyv.xml"); 35 // (a fájlnév sora persze ne törjön el) 36 try { 37 validator.validate(source); 38 System.out.println("Érvényes."); 39 40 javax.xml.transform.TransformerFactory transformerFactory = 41 javax.xml.transform.TransformerFactory.newInstance(); 42 javax.xml.transform.Transformer transformer = 43 transformerFactory.newTransformer( 44 new javax.xml.transform.stream.StreamSource( 45 "http://docbook.sourceforge.net/release/xsl-ns/current/html/docbook.xsl")); 46 47 java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(); 48 transformer.transform(source, 49 new javax.xml.transform.stream.StreamResult(baos)); 50 51 prefs.setValue("docbook2HTML", baos.toString()); 52 53 } catch (javax.xml.transform.TransformerConfigurationException tcE) { 54 tcE.printStackTrace(); 55 } catch (javax.xml.transform.TransformerException tE) { 56 tE.printStackTrace(); 57 } catch (org.xml.sax.SAXException saxE) { 58 /* Ha valami komolyabb hiba lenne az elemzés során, itt 59 is visszahnozzuk. */ 60 System.out.println("Nem jól-formázott vagy nem érvényes."); 61 //saxE.getMessage(); 62 63 prefs.setValue("docbook2HTML", saxE.getMessage()); 64 65 66 } catch (java.io.IOException ioE) { 67 ioE.printStackTrace(); 68 } 69 70 prefs.store(); 71 72 73 } 74 75 public void doView(javax.portlet.RenderRequest request, javax.portlet.RenderResponse response) 76 throws javax.portlet.PortletException, java.io.IOException { 77 response.setContentType("text/html"); 78 javax.portlet.PortletRequestDispatcher dispatcher = 79 getPortletContext().getRequestDispatcher("/WEB-INF/jsp/Db2Html_view.jsp"); 80 dispatcher.include(request, response); 81 } 82 83 public void doEdit(javax.portlet.RenderRequest request, javax.portlet.RenderResponse response) 84 throws javax.portlet.PortletException, java.io.IOException { 85 response.setContentType("text/html"); 86 javax.portlet.PortletRequestDispatcher dispatcher = 87 getPortletContext().getRequestDispatcher("/WEB-INF/jsp/Db2Html_edit.jsp"); 88 dispatcher.include(request, response); 89 } 90 91 public void doHelp(javax.portlet.RenderRequest request, javax.portlet.RenderResponse response) 92 throws javax.portlet.PortletException, java.io.IOException { 93 94 response.setContentType("text/html"); 95 javax.portlet.PortletRequestDispatcher dispatcher = 96 getPortletContext().getRequestDispatcher("/WEB-INF/jsp/Db2Html_help.jsp"); 97 dispatcher.include(request, response); 98 } 99 } 100 101 class Hibakezelo extends org.xml.sax.helpers.DefaultHandler { 102 103 public void fatalError(org.xml.sax.SAXParseException e) 104 throws org.xml.sax.SAXException { 105 System.out.println("Hibakezelő> Fatal error, nem jól formázott, a hiba:"); 106 System.out.println(e.getMessage()); 107 } 108 109 public void error(org.xml.sax.SAXParseException e) 110 throws org.xml.sax.SAXException { 111 System.out.println("Hibakezelő> Error, nem érvényes, a hiba:"); 112 System.out.println(e.getMessage()); 113 /* Ha nem dobnánk, akkor az elemzés try blokkjában 114 szépen mehetne tovább a futás, mert ettől még bányászhatnánk 115 ki infókat az xml fájlból.*/ 116 throw new org.xml.sax.SAXException(e.getMessage()); 117 } 118 }
Fenti források lecserélése után (a Libraries alatt a Saxon jart nem elfelejtve beállítani) jöhet az F6, majd a User_Portlets alatt megjelenő új portletünket ráhúzzuk valahová a portálunkra:
mondjuk a Google Maps mellé (a Guest publikus lapjára)
Beadjuk a http://www.inf.unideb.hu/~nbatfai/ppmkonyv.xml forrást (kis idő kell a validáláshoz és a transzformációhoz, mert az xsd-t és a stílusfájlokat is a webről rántja le, immár a portlet)
Karakterkódoláson még lehetne finomítani, de a példa kész!
PS.: itt egy futó (régi, még) WS CB11 portál.