Post on 06-Dec-2014
description
PC MOPWSRPWCI
IDM Clustering
ECM WEBuiConnettoriOpenSocial
IDMJCR
Novità
Non solo portletWCM e strumenti di amministrazione Il portale può essere interamente aggiornato dai web managerGestione avanzata dei gruppi e dei documenti privatiSemplicità di cooperazione tra componenti
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.
Licenze
JBoss – Gatein e JCR sono rilasciati con licenza LGPL 2.1Exo – Gli strumenti di amministrazione sono rilasciati con licenza AGPL 3Redhat - Rilascia la EPP 5 (Enterprise Portal Platform). Contiene JBoss + Gatein+ Portlet Bridge + eXo ECM
Architettura
Strumenti esterni
Il Kernel
ECM
ECM - Drive
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'utenzaPossibilità di esternalizzare la navigazione tramite import / exportLe preferenze sono configurabili in 4 Scope: Contesto globale, sito, pagina e finestra Le preferenze sono ereditabili
MOP (Model Object for Portal)
Relazione tra container, finestra e body. Il container crea una finestra tramite un meccanismo di template fornito da ExoLe pagine sono ereditabili, è possibile per una pagina ereditare le proprietà da un padre mantenendo comunque un diverso contenutoLayout gerarchico. Ogni parte del portale (finestra, pagina, sito, portale) ha la possibilità di ereditare un differente layoutIntroduce Chromattic, un framework opensource per il mapping tra oggetti e JCR
WCI (Web Container Integration)
Attualmente supporta JBoss , Tomcat e JettyAgisce durante il deploy per permettere una corretta installazione e durante ogni richiesta httpAnticipa alcune funzionalità descritte nelle servlet 3.0Verrà aggiunta la parte di integrazione di SSO
WCI (Login e Logout programmatica)
void login(java.lang.String username,java.lang.String password)throws ServletException void logout()throws ServletException
HttpServletRequest
PC (Portlet Container)
Integra le portlet 2.0 in Exo portal in modo trasparentePermette 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>
WSRP (Web Service Remote Portlet)
WSRP Producer
WSRP Consumer
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
<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>
<faces-config>
<application>
<view-handler>
org.jboss.portletbridge.application.PortletViewHandler
</view-handler>
<state-manager> org.jboss.portletbridge.application.PortletStateManager </state-manager>
</application>
...
<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>
JCROgni contenuto è condivisibile con RESTSupporta WebDav, FTP, RMI
RESTSERVLET
LOCALSESSIONPROVIDER
CURRENTIDENTITY
RESTENCODING
BROWSER
POSTGETDELETEPUT
WEBDAVFTP
JCRSupporta autorizzazione e ACLIntroduce lo scripting GroovyFunzioni di Import / ExportGestione degli eventiScript per inizializzare i repositoryClustering con JBoss Cache Tutti i documenti sono versionabiliSupporta l'internazionalizzazione
JCR
JCR - workspaceSuddividono le informazioni in gruppiPossono essere configurati su diversi databaseSono clusterizzabili
JCR - workspaceREPOSITORY(Gatein)
SYSTEM: Contiene i nodi e i namespace di base di JCRPORTAL-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.
JCR - workspaceREPOSITORY(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.
JCR
Identity Management - organization
User
Group
Membership Type
Membership
{ manager, member, validator }
{ Mary / users, root / administrators }
{ guests, management, users, administrators }
{ Mary, John, root, demo }
Identity Management - servizi
Hibernate LDAP
JDBC
ActiveDirectory
PicketLinkOrganization
Identity Management - gestione dei profiliI 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>
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 utilizzareXACML: Implementazione di Oasis XACMLv2.Negotiation: SPNego/Kerberos based Desktop SSO.
DatabaseGatein
IDM (Creato da PicketLink IDM)Portal (Creato da Exo JCR + MOP)
ECMIDM (Creato da PicketLink IDM)Portal (Creato da Exo JCR + MOP)
I Datasource sono configurabili tramite le common di ExoLa EPP 5 utilizza i datasource di JBoss
Database - Datasource# JCRgatein.jcr.config.type=localgatein.jcr.datasource.name=java:jdbcjcrgatein.jcr.datasource.dialect=autogatein.jcr.datasource.driver=org.hsqldb.jdbcDrivergatein.jcr.datasource.url=jdbc:hsqldb:file:${gatein.db.data.dir}/data/jdbcjcr_${name}gatein.jcr.datasource.username=sagatein.jcr.datasource.password=
gatein.jcr.data.dir=${gatein.data.dir}/jcrgatein.jcr.storage.data.dir=${gatein.jcr.data.dir}/valuesgatein.jcr.index.data.dir=${gatein.jcr.data.dir}/lucenegatein.jcr.index.changefilterclass= org.exoplatform.services.jcr.impl.core.query.DefaultChangesFilter
# IDMgatein.idm.datasource.name=java:jdbcidmgatein.idm.datasource.driver=org.hsqldb.jdbcDrivergatein.idm.datasource.url=jdbc:hsqldb:file:${gatein.db.data.dir}/data/jdbcidm_${name}gatein.idm.datasource.username=sagatein.idm.datasource.password=
Database
Database
Web UI - Groovy
Web UI - Groovy - Dashboard
UIGadgetPortlet /UIGadgetViewMode
UIDashboardPortlet
UITabPaneDashboardUITabbedDashboardPortlet
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>
Web UI - Skin
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%;}
Web UI - I18N
Web UI - I18N - Giapponese
UITabPaneDashboard.action.addNewDashboard=\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u3092\u8ffd\u52a0UITabPaneDashboard.action.switchShowRange=\u9818\u57df\u3092\u5207\u308a\u66ff\u3048UITabPaneDashboard.msg.deleteTab=\u672c\u5f53\u306b\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u3092\u524a\u9664\u3057\u307e\u3059\u304b\uff1f
UITabPaneDashboard.msg.cannotDeleteLastTab=\u30bf\u30d6\u3092\u524a\u9664\u51fa\u6765\u307e\u305b\u3093\u3002
UITabPaneDashboard.msg.wrongTabName=\u82f1\u6570\u5b57\u3001\u30fb\u3001-\u3001_\u306e\u307f\u304c\u8a31\u3055\u308c\u3066\u3044\u307e\u3059\u3002
Web UI - I18N - UITabPaneDashboard.java
import org.exoplatform.web.application.ApplicationMessage; ...... else { getAncestorOfType(UIApplication.class).addMessage( new ApplicationMessage("UITabPaneDashboard.msg.cannotDeleteLastTab", null)); return null; }
Web UI - Configurazione
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>
Web UI
Si possono organizzare le sottodirectory nell'applicazione usando un meccanismo di importLe configurazioni possono essere sovrascritte da un'applicazione che usa gli stessi pathLe 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
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)
Esempi - News - Portlet di lettura
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>
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>
.UICategoryNavigationPortlet .HorizontalLayout .UIFormInputSet { padding: 0;}
.UICategoryNavigationPortlet .HorizontalLayout .FormContainer { padding: 0;}
gatein-resources.xml
DefaultStylesheet.css
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>......
<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>
portlet.xml
configuration.xml
Esempi - News - PortletPortletPreferences 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");
Esempi - News - Portlet di lettura
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>
Esempi - News - tassonomia
acme-taxonomies-configuration.xml
Esempi - News - importazione dei dati
News.xml
Esempi - News - importazione dei dati
acme-deployment-configuration.xml
<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>
Esempi - News - Creazione della pagina
pages.xml
<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>.........
Esempi - News - Category Navigation
Esempi - News - Category Contents
Esempi - News - Category ContentsList<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
Esempi - News - Category by Url
Esempi - News - Inserimento
Fast Content Creation - permette di inserire un documento configurando lo spazio di destinazione, un template grafico e degli eventiDMS Console - è la console per la gestione dei documenti. Contiene la Fast Content Creation portletForm Generator - permette di creare graficamente una form di inserimento specificando i campi e una action per l'invio in post
Esempi - News - InserimentoFast Content Creation
Esempi - Contact Us
Esempi - Contact Us - Form Generator
Esempi - Contact Us - Form Generator
Esempi - Contact Us - Inserimento
Esempi - Contact Us - Risultato
Clustering - JBoss Cache
Clustering - PicketLink IDMGira su Hibernate (ehcache, JBoss Cache)Cache di primo e secondo livello entrambe con JBoss CacheUtilizzabile 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>
Clustering - Exo JCRLa configurazione è dipendente dal workspaceClustering su 4 canali:
DatiIndiciLock ManagerTransaction 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>
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>
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>
Clustering - JBoss Cache - Strategie
Clustering - JBoss Cache - Strategie
Clustering - JBoss Cache - StrategieDefault
Clustering - JBoss Cache - Strategie
Clustering - JBoss Cache - Strategie
Ciao!!
Luca Stancapiano ------------------------------------------ Jboss Forums project leaderGatein / Jboss Portal developerJBUG Rome member
------------------------------------------jedim@vige.it