September 2010 - Gatein

2,079 views

Published on

Gatein - Luca Stancapiano
JugSardegna 04 September 2010

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,079
On SlideShare
0
From Embeds
0
Number of Embeds
166
Actions
Shares
0
Downloads
31
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

September 2010 - Gatein

  1. 1. PC IDM MOP Clustering WSRP WCI ECM IDM WEBui JCR Connettori OpenSocial
  2. 2. Novità Non solo portlet WCM e strumenti di amministrazione Il portale può essere interamente aggiornato dai web manager Gestione avanzata dei gruppi e dei documenti privati Semplicità di cooperazione tra componenti
  3. 3. Il Portale permette.... Di ridurre i costi associando siti web ad applicazioni. Permette agli sviluppatori di riutilizzare svariati tipi di applicazioni e comporle all'interno di uno stesso contesto. Le portlet 2.0 sono lo standard attuale. Sono pensate per ottenere il riutilizzo. Agli utenti finali di personalizzare ogni parte del sito in maniera sicura garantendo gli accessi. Scalabilità - I portali sono predisposti alla replicazione dei dati su macchine in cluster. Di limitare i bug alla singola applicazione anzichè a tutta la pagina o a tutto il portale. E' possibile continuare a lavorare nel portale pur essendoci applicazioni in crash.
  4. 4. Licenze JBoss – Gatein e JCR sono rilasciati con licenza LGPL 2.1 Exo – Gli strumenti di amministrazione sono rilasciati con licenza AGPL 3 Redhat - Rilascia la EPP 5 (Enterprise Portal Platform). Contiene JBoss + Gatein+ Portlet Bridge + eXo ECM
  5. 5. Architettura
  6. 6. Strumenti esterni
  7. 7. Il Kernel
  8. 8. ECM
  9. 9. ECM - Drive
  10. 10. MOP (Model Object for Portal) Permette l'assegnazione di una pagina o di un gruppo di pagine per utente o gruppo. La stessa pagina può avere diverse preferenze a seconda dell'utenza Possibilità di esternalizzare la navigazione tramite import / export Le preferenze sono configurabili in 4 Scope: Contesto globale, sito, pagina e finestra Le preferenze sono ereditabili
  11. 11. MOP (Model Object for Portal) Relazione tra container, finestra e body. Il container crea una finestra tramite un meccanismo di template fornito da Exo Le pagine sono ereditabili, è possibile per una pagina ereditare le proprietà da un padre mantenendo comunque un diverso contenuto Layout gerarchico. Ogni parte del portale (finestra, pagina, sito, portale) ha la possibilità di ereditare un differente layout Introduce Chromattic, un framework opensource per il mapping tra oggetti e JCR
  12. 12. WCI (Web Container Integration) Attualmente supporta JBoss , Tomcat e Jetty Agisce durante il deploy per permettere una corretta installazione e durante ogni richiesta http Anticipa alcune funzionalità descritte nelle servlet 3.0 Verrà aggiunta la parte di integrazione di SSO
  13. 13. WCI (Login e Logout programmatica) HttpServletRequest void login(java.lang.String username, java.lang.String password) throws ServletException void logout() throws ServletException
  14. 14. PC (Portlet Container) Integra le portlet 2.0 in Exo portal in modo trasparente Permette di deploiare le portlet all'interno del portale mantenendo l'architettura di gestione delle finestre di Exo <portlet> <portlet-name>HelloWorldPortlet</portlet-name> <portlet-class> org.SimplestHelloWorldPortlet </portlet-class> <supports> <mime-type>text/html</mime-type> </supports> <portlet-info> <title>Simplest Hello World Portlet</title> </portlet-info> </portlet>
  15. 15. WSRP (Web Service Remote Portlet)
  16. 16. WSRP Producer
  17. 17. WSRP Consumer
  18. 18. Implementa le JSR 301 e 329 (portlet 1.0 e 2.0) Permette di usare JSF 1.2 all'interno di un portlet container. Qualunque applicazione web basata su JSF può diventare parte di un portale Supporta Seam e RichFaces
  19. 19. <portlet> <portlet-name>yourPortletName</portlet-name> <portlet-class> javax.portlet.faces.GenericFacesPortlet </portlet-class> <init-param> <name>javax.portlet.faces.defaultViewId.view </name> <value>/welcome.xhtml</value> </init-param>
  20. 20. <faces-config> <application> <view-handler> org.jboss.portletbridge.application.PortletViewHandler </view-handler> <state-manager> org.jboss.portletbridge.application. PortletStateManager </state-manager> </application> ...
  21. 21. <Module> − <ModulePrefs title_url="http://www.amoreepsiche.it/index.php?idcat"> <Require feature="minimessage"/> </ModulePrefs> − <Content type="html"> <DIV > <TABLE width="100%"><TR><TD align=center> <DIV id="imgSRC__MODULE_ID__"></DIV> </TD></TR></TABLE> </DIV> </Content> </Module>
  22. 22. JCR Ogni contenuto è condivisibile con REST Supporta WebDav, FTP, RMI REST CURRENT LOCAL ENCODING IDENTITY SESSION REST PROVIDER SERVLET POST GET DELETE PUT FTP BROWSER WEBDAV
  23. 23. JCR Supporta autorizzazione e ACL Introduce lo scripting Groovy Funzioni di Import / Export Gestione degli eventi Script per inizializzare i repository Clustering con JBoss Cache Tutti i documenti sono versionabili Supporta l'internazionalizzazione
  24. 24. JCR
  25. 25. JCR - workspace Suddividono le informazioni in gruppi Possono essere configurati su diversi database Sono clusterizzabili
  26. 26. JCR - workspace REPOSITORY(Gatein) SYSTEM: Contiene i nodi e i namespace di base di JCR PORTAL-SYSTEM: Contiene le entità generate da MOP , tutte le informazioni generate dall'application registry (categorie, gadget, contenuti) e relativi permessi. PORTAL-WORK: Contiene i token per mantenere la sessione autenticata in caso di 'autologin' e 'ricorda password'. WSRP-SYSTEM:Contiene le informazioni dei producer e consumer WSRP. PC-SYSTEM: Contiene gli stati delle portlet.
  27. 27. JCR - workspace REPOSITORY(ECM) COLLABORATION: Contiene le informazioni e i contenuti delle applicazioni di collaboration (tags, relazioni). BACKUP: Mantiene i documenti scaduti e può essere usato per implementare un meccanismo di backup automatico. DMS-SYSTEM: Contiene le info su applicazini e contenuti del DMS. WCM-SYSTEM:Contiene le info su applicazini e contenuti del WCM.
  28. 28. JCR
  29. 29. Identity Management - organization Membership { manager, member, validator } Type Membership { Mary / users, root / administrators } Group { guests, management, users, administrators } User { Mary, John, root, demo }
  30. 30. Identity Management - servizi Hibernate LDAP JDBC PicketLink Organization Active Directory
  31. 31. Identity Management - gestione dei profili I campi degli utenti, gruppi e membership type sono dinamici e gestiti dai singoli servizi <object type="org.exoplatform.services.organization. OrganizationConfig$User"> <field name="userName"><string>mary</string></field> <field name="password"><string>gtn</string></field> <field name="firstName"><string>Mary</string></field> <field name="lastName"><string>Kelly</string></field> <field name="email"><string>mary@localhost</string></field> <field name="groups"> <string>member:/platform/users</string> </field> </object>
  32. 32. IDM: Fornisce un modello a oggetti per l'identità (Utenti/Gruppi/Ruoli) e si interfaccia con LDAP e RDBMS. Federated Identity: Supporta SAMLv2, WS-Trust e OpenID. AuthZ: Authorization framework semplice da utilizzare XACML: Implementazione di Oasis XACMLv2. Negotiation: SPNego/Kerberos based Desktop SSO.
  33. 33. Database Gatein IDM (Creato da PicketLink IDM) Portal (Creato da Exo JCR + MOP) ECM IDM (Creato da PicketLink IDM) Portal (Creato da Exo JCR + MOP) I Datasource sono configurabili tramite le common di Exo La EPP 5 utilizza i datasource di JBoss
  34. 34. Database - Datasource # JCR gatein.jcr.config.type=local gatein.jcr.datasource.name=java:jdbcjcr gatein.jcr.datasource.dialect=auto gatein.jcr.datasource.driver=org.hsqldb.jdbcDriver gatein.jcr.datasource.url=jdbc:hsqldb:file:${gatein.db.data.dir}/data/jdbcjcr_${name} gatein.jcr.datasource.username=sa gatein.jcr.datasource.password= gatein.jcr.data.dir=${gatein.data.dir}/jcr gatein.jcr.storage.data.dir=${gatein.jcr.data.dir}/values gatein.jcr.index.data.dir=${gatein.jcr.data.dir}/lucene gatein.jcr.index.changefilterclass= org.exoplatform.services.jcr.impl.core.query.DefaultChangesFilter # IDM gatein.idm.datasource.name=java:jdbcidm gatein.idm.datasource.driver=org.hsqldb.jdbcDriver gatein.idm.datasource.url=jdbc:hsqldb:file:${gatein.db.data.dir}/data/jdbcidm_${name} gatein.idm.datasource.username=sa gatein.idm.datasource.password=
  35. 35. Database
  36. 36. Database
  37. 37. Web UI - Groovy
  38. 38. Web UI - Groovy - Dashboard UITabPaneDashboard UITabbedDashboardPortlet UIDashboardPortlet UIGadgetPortlet / UIGadgetViewMode
  39. 39. Web UI - Groovy - UIDashboardPortlet <% import javax.portlet.PortletMode ; import org.exoplatform.dashboard.webui.component.DashboardParent ; import org.exoplatform.dashboard.webui.component.UIDashboard; import org.exoplatform.dashboard.webui.component.UIDashboardEditForm; def rcontext = _ctx.getRequestContext() ; def popupMsgs = uicomponent.getUIPopupMessages(); %> <div id="$uicomponent.id" class="UIDashboardPortlet"> <% if(rcontext.getApplicationMode() == PortletMode.VIEW) { uicomponent.renderChild(UIDashboard.class); } else { UIDashboardEditForm uiEditForm = uicomponent.getChild (UIDashboardEditForm.class); uiEditForm.getUIStringInput(UIDashboardEditForm.TOTAL_COLUMNS) .setValue(uicomponent.getNumberOfCols() + ""); uicomponent.renderUIComponent(uiEditForm) ; } if(popupMsgs != null) popupMsgs.processRender(rcontext); %> </div>
  40. 40. Web UI - Skin
  41. 41. Web UI - Skin - CSS .UIGadgetPortlet { padding: 1px; height: 100%; } .UIGadgetPortlet .UIGadgetViewMode { height: 100%; } .UIGadgetPortlet .gadgets-gadget-content { height: 100%; } .UIGadgetPortlet .UIGadgetContent { height: 100%; } .UIGadgetPortlet .gadgets-gadget { width: 100%; }
  42. 42. Web UI - I18N
  43. 43. Web UI - I18N - Giapponese UITabPaneDashboard.action. addNewDashboard=u30c0u30c3u30b7u30e5u30dcu30fcu30c9u3092u8ffdu52a0 UITabPaneDashboard.action. switchShowRange=u9818u57dfu3092u5207u308au66ffu3048 UITabPaneDashboard.msg. deleteTab=u672cu5f53u306bu30c0u30c3u30b7u30e5u30dcu30fcu30c9u3092u 524au9664u3057u307eu3059u304buff1f UITabPaneDashboard.msg. cannotDeleteLastTab=u30bfu30d6u3092u524au9664u51fau6765u307eu305bu3 093u3002 UITabPaneDashboard.msg.wrongTabName=u82f1u6570u5b57u3001u30fbu3001- u3001_u306eu307fu304cu8a31u3055u308cu3066u3044u307eu3059u3002
  44. 44. Web UI - I18N - UITabPaneDashboard.java import org.exoplatform.web.application. ApplicationMessage; ...... else { getAncestorOfType(UIApplication.class).addMessage( new ApplicationMessage( "UITabPaneDashboard.msg.cannotDeleteLastTab", null)); return null; }
  45. 45. Web UI - Configurazione
  46. 46. Web UI - gatein-resources.xml <gatein-resources xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.gatein. org/xml/ns/gatein_resources_1_0 http://www.gatein. org/xml/ns/gatein_resources_1_0" xmlns="http://www.gatein.org/xml/ns/gatein_resources_1_0"> <!-- GadgetPortlet skins --> <portlet-skin> <application-name>dashboard</application-name> <portlet-name>GadgetPortlet</portlet-name> <skin-name>Default</skin-name> <css- path>/skin/gadget/webui/component/UIGadgetPortlet/DefaultStylesheet. css</css-path> </portlet-skin> </gatein-resources>
  47. 47. Web UI Si possono organizzare le sottodirectory nell'applicazione usando un meccanismo di import Le configurazioni possono essere sovrascritte da un'applicazione che usa gli stessi path Le portlet sono inserite sotto forma di nodi jcr. Risulta così più facile ricercarle, catalogarle o eseguirle C'è uno stretto legame tra componenti webui e classi CSS per rendere più immediata la configurazione grafica
  48. 48. Esempi - News - Portlet di lettura Category Navigation - Ordina le news per categoria e permette di navigarle (/private/acme/news) Category Contents - Elenca le news a seconda della categoria scelta. Se la categoria non è selezionata le elenca tutte (/private/acme/news) Content by Url - Rappresenta l'esploso della news selezionata. La selezione di una news passa un URL da cui è possibile prelevare il contenuto (/private/acme/detail)
  49. 49. Esempi - News - Portlet di lettura
  50. 50. Esempi - News - Groovy <div id="$uicomponent.id" class="$uicomponent.id"> <% if (Utils.isShowQuickEdit()) { %> <a class="DocumentQuickEdit" href="<%= uicomponent.event("QuickEdit") %>" title="<%= _ctx.appRes("UICNContainer.title.QuickEdit") %>"><div class=" QuickEdit"><span></span></div></a> <% } uicomponent.buildTree(); uicomponent.renderChildren(); %> </div>
  51. 51. Esempi - News - Skin <portlet-skin> <application-name>presentation</application-name> <portlet-name>CategoryNavigationPortlet</portlet-name> <skin-name>Default</skin-name> <css-path>/skin/CategoryNavigation/DefaultStylesheet.css</css-path> </portlet-skin> gatein-resources.xml .UICategoryNavigationPortlet .HorizontalLayout .UIFormInputSet { padding: 0; } .UICategoryNavigationPortlet .HorizontalLayout .FormContainer { padding: 0; } DefaultStylesheet.css
  52. 52. Esempi - News - Portlet <portlet> <description xml:lang="EN">Category Navigation</description> <portlet-name>CategoryNavigationPortlet</portlet-name> <display-name xml:lang="EN">Category Navigation</display-name> <portlet-class>org.exoplatform.webui.application.portlet. PortletApplicationController</portlet-class> <init-param> ...... portlet.xml <webui-configuration> <annotation-classes></annotation-classes> <application> <ui-component-root>org.exoplatform.wcm.webui.category.UICategoryNavigationPortlet</ui-component- root> <state-manager>org.exoplatform.webui.application.portlet.ParentAppStateManager</state-manager> </application> </webui-configuration> configuration.xml
  53. 53. Esempi - News - Portlet PortletPreferences portletPreferences = UICategoryNavigationUtils.getPortletPreferences(); String preferenceRepository = portletPreferences.getValue(UICategoryNavigationConstant. PREFERENCE_REPOSITORY, ""); String preferenceTreeName = portletPreferences.getValue(UICategoryNavigationConstant. PREFERENCE_TREE_NAME, ""); TaxonomyService taxonomyService = getApplicationComponent(TaxonomyService.class); Node rootTreeNode = null; try { rootTreeNode = taxonomyService.getTaxonomyTree(preferenceRepository, preferenceTreeName); } catch (RepositoryException e) { //return; } setRootTreeNode(rootTreeNode); setAcceptedNodeTypes(new String[] {"nt:folder", "nt:unstructured", "nt:file", "exo:taxonomy"}); UITree tree = addChild(UICategoryNavigationTreeBase.class, null, null); tree.setBeanLabelField("name"); tree.setBeanIdField("path");
  54. 54. Esempi - News - Portlet di lettura
  55. 55. Esempi - News - configuration.xml <configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation="http://www.exoplaform.org/xml/ns/kernel_1_0.xsd http://www. exoplaform.org/xml/ns/kernel_1_0.xsd" xmlns="http://www.exoplaform.org/xml/ns/kernel_1_0.xsd"> <import>war:/conf/sample-portal/jcr/jcr-configuration.xml</import> <import>war:/conf/sample-portal/portal/portal-configuration.xml</import> <import>war:/conf/sample-portal/portal/application-registry-configuration.xml</import> <import>war:/conf/sample-portal/portal/resource-bundle-configuration.xml</import> <import>war:/conf/sample-portal/wcm/newsletter-configuration.xml</import> <import>war:/conf/sample-portal/wcm/deployment/acme-deployment-configuration. xml</import> <import>war:/conf/sample-portal/wcm/deployment/classic-deployment-configuration. xml</import> <import>war:/conf/sample-portal/wcm/deployment/template-deployment-configuration. xml</import> <import>war:/conf/sample-portal/wcm/taxonomy/acme-taxonomies-configuration. xml</import> <import>war:/conf/sample-portal/wcm/taxonomy/classic-taxonomies-configuration. xml</import> </configuration>
  56. 56. Esempi - News - tassonomia acme-taxonomies-configuration.xml
  57. 57. Esempi - News - importazione dei dati News.xml
  58. 58. Esempi - News - importazione dei dati <object-param> <name>ACME News data</name> <description>Deployment Descriptor</description> <object type="org.exoplatform.services.deployment.DeploymentDescriptor"> <field name="target"> <object type="org.exoplatform.services.deployment.DeploymentDescriptor$Target"> <field name="repository"> <string>repository</string> </field> <field name="workspace"> <string>collaboration</string> </field> <field name="nodePath"> <string>/sites content/live/acme/web contents/site artifacts</string> </field> </object> </field> <field name="sourcePath"> <string>war:/conf/sample-portal/wcm/artifacts/site-resources/acme/News.xml</string> </field> </object> acme-deployment-configuration.xml
  59. 59. Esempi - News - Creazione della pagina <page> <name>news</name> <title>News</title> <access-permissions>Everyone</access-permissions> <edit-permission>editor:/platform/web-contributors</edit-permission> <container id="ACMEBody" template="system: /groovy/portal/webui/container/UITableColumnContainer.gtmpl"> <access-permissions>Everyone</access-permissions> <container id="ACMECategories" template="system: /groovy/portal/webui/container/UIContainer.gtmpl"> <access-permissions>Everyone</access-permissions> <portlet-application> <portlet> <application-ref>presentation</application-ref> <portlet-ref>CategoryNavigationPortlet</portlet-ref> <preferences> ......... pages.xml
  60. 60. Esempi - News - Category Navigation
  61. 61. Esempi - News - Category Contents
  62. 62. Esempi - News - Category Contents List<SelectItemOption<String>> templates = new ArrayList<SelectItemOption<String>>(); RepositoryService repositoryService = getApplicationComponent(RepositoryService.class); ManageableRepository manageableRepository = repositoryService.getCurrentRepository(); ApplicationTemplateManagerService applicationTemplateManagerService = getApplicationComponent (ApplicationTemplateManagerService.class); String repository = manageableRepository.getConfiguration().getName(); List<Node> templateNodes = applicationTemplateManagerService.getTemplatesByCategory(repository, portletName, templateCategory, Utils.getSessionProvider()); for (Node templateNode : templateNodes) { String templateName = templateNode.getName(); String templatePath = templateNode.getPath(); templates.add(new SelectItemOption<String>(templateName, templatePath)); } return templates; Recupero dell'elenco dei template
  63. 63. Esempi - News - Category by Url
  64. 64. Esempi - News - Inserimento Fast Content Creation - permette di inserire un documento configurando lo spazio di destinazione, un template grafico e degli eventi DMS Console - è la console per la gestione dei documenti. Contiene la Fast Content Creation portlet Form Generator - permette di creare graficamente una form di inserimento specificando i campi e una action per l'invio in post
  65. 65. Esempi - News - Inserimento Fast Content Creation
  66. 66. Esempi - Contact Us
  67. 67. Esempi - Contact Us - Form Generator
  68. 68. Esempi - Contact Us - Form Generator
  69. 69. Esempi - Contact Us - Inserimento
  70. 70. Esempi - Contact Us - Risultato
  71. 71. Clustering - JBoss Cache
  72. 72. Clustering - PicketLink IDM Gira su Hibernate (ehcache, JBoss Cache) Cache di primo e secondo livello entrambe con JBoss Cache Utilizzabile su ogni piattaforma supportata da Gatein <value-param> <name>cacheConfig</name> <value>war:/conf/organization/picketlink-idm/jboss-cache.xml</value> </value-param> <value-param profiles="cluster"> <name>cacheConfig</name> <value>war:/conf/organization/picketlink-idm/jboss-cache-cluster.xml</value> </value-param>
  73. 73. Clustering - Exo JCR La configurazione è dipendente dal workspace Clustering su 4 canali: Dati Indici Lock Manager Transaction Manager (da configurare) Utilizzabile su ogni piattaforma <cache enabled="true" class= "org.exoplatform.services.jcr.impl.dataflow.persistent.jbosscache. JBossCacheWorkspaceStorageCache"> <properties> <property name="jbosscache-configuration" value="conf/jcr/jbosscache/${gatein.jcr.config. type}/config.xml" /> <property name="jgroups-configuration" value="jar:/conf/jcr/jbosscache/cluster/udp-mux. xml" /> <property name="jgroups-multiplexer-stack" value="true" /> <property name="jbosscache-cluster-name" value="jcr-${container.name.suffix}-wsrp- system" /> </properties> </cache>
  74. 74. Clustering - JBoss Cache <jbosscache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:jboss: jbosscache-core:config:3.1"> <locking useLockStriping="false" concurrencyLevel="50000" lockParentForChildInsertRemove=" false" lockAcquisitionTimeout="20000" /> <clustering mode="replication" clusterName="${jbosscache-cluster-name}"> <stateRetrieval timeout="20000" fetchInMemoryState="false" /> <jgroupsConfig multiplexerStack="jcr.stack" /> <sync /> </clustering> <!-- Eviction configuration --> <eviction wakeUpInterval="5000"> <default algorithmClass="org.jboss.cache.eviction.LRUAlgorithm" actionPolicyClass=" org.exoplatform.services.jcr.impl.dataflow.persistent.jbosscache.ParentNodeEvictionActionPolicy" eventQueueSize="1000000"> <property name="maxNodes" value="1000000" /> <property name="timeToLive" value="120000" /> </default> </eviction> </jbosscache>
  75. 75. Clustering - JBoss Cache - Rete <protocol_stacks> <stack name="jcr.stack"> <config> <UDP mcast_addr="228.10.10.10" mcast_port="45588" tos="8" ucast_recv_buf_size=" 20000000" ucast_send_buf_size="640000" mcast_recv_buf_size="25000000" /> ... <PING timeout="2000" num_initial_members="3" /> <pbcast.NAKACK use_stats_for_retransmission="false" exponential_backoff="150" use_mcast_xmit="true" gc_lag="0" retransmit_timeout="50,300,600,1200" discard_delivered_msgs="true" /> <UNICAST timeout="300,600,1200" /> <pbcast.STABLE stability_delay="1000" desired_avg_gossip="50000" max_bytes="1000000" /> .... <FC max_credits="500000" min_threshold="0.20" /> <FRAG2 frag_size="60000" /> </config> </stack> </protocol_stacks>
  76. 76. Clustering - JBoss Cache - Strategie
  77. 77. Clustering - JBoss Cache - Strategie
  78. 78. Clustering - JBoss Cache - Strategie Default
  79. 79. Clustering - JBoss Cache - Strategie
  80. 80. Clustering - JBoss Cache - Strategie
  81. 81. Ciao!! Luca Stancapiano ------------------------------------------ Jboss Forums project leader Gatein / Jboss Portal developer JBUG Rome member ------------------------------------------ jedim@vige.it

×