gwusermanual:migration_to_4_7_x

Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

Prossima revisione
Revisione precedente
gwusermanual:migration_to_4_7_x [2024/06/27 17:46]
francesco.peverini creata
gwusermanual:migration_to_4_7_x [2024/06/27 17:50] (versione attuale)
francesco.peverini
Linea 50: Linea 50:
 ==== SharePoint ==== ==== SharePoint ====
  
-===== Passaggi da seguire ===== 
-  * Creare un repository ex-novo ex-novo o modificare quello esistente intervenendo su tutti i file necessari come descritto nella parte [[gwusermanual:​migration_to_4_6_x#​Migrazione repository|Migrazione repository]] 
-  * Apportare le opportune modifiche nello schema dei metadati, come descritto nella parte [[gwusermanual:​migration_to_4_6_x#​Migrazione metadati|Migrazione metadati]] 
-  * leggere le [[gwusermanual:​migration_to_4_6_x#​Note Migrazione|Note Migrazione]] 
  
-===== Migrazione ​repository ​=====+===== Migrazione ​sdf da Layout a Drawing ​=====
  
-==== Repository git nuovi ==== +Il passaggio ​di Geowebframework dalla versione ​4.6 alla 4.7 porta con sé grandi cambiamenti per quanto riguarda la visualizzazione delle planimetrieLo sfondo, o sdf, non sarà più collegato all’intero layout ma semplicemente al drawing, cioè non sarà più visualizzato un unico sfondo che fa riferimento a tutti i drawing che sono presenti nel layout (o piano) selezionato,​ ma saranno visualizzati tanti sfondi sovrapposti quanti sono i drawing.
-I nuovi repository git, di progetto o di commessa, dovrebbero utilizzare fin da subito il nuovo template di progetto **gw-webapp-template**. +
-La prima cosa da fare per creare un progetto di base nel proprio pc cliccare sul seguente link e avviare il download della cartella ZIP {{ :​custom:​makegproj-4.6.x.zip |}}.+
  
-==== Repository git preesistenti ​==== +==== Modifica Modello Dati ==== 
-Per tutti i progetti git in corso: +La modifica al modello dati consiste nello spostamento della colonna SDF dalla tabella gwd_layout alla tabella gwd_drawingSi trovano gli script ​di migrazione nella cartella apposita S:\Rilasci GW4\4.7\script migrazione ​da 4.6.X
-  * va adeguato il [[gwusermanual:​migration_to_4_6_x#​pom.xml|pom.xml]]. +
-  * vanno sostituiti specifici file nel vecchio template ​di progetto. file interessati: +
-    * [[gwusermanual:​migration_to_4_6_x#​spring-security.xml|spring-security.xml]] +
-    * [[gwusermanual:​migration_to_4_6_x#​dispatcher-servlet.xml|dispatcher-servlet.xml]] +
-    * [[gwusermanual:​migration_to_4_6_x#​web.xml|web.xml]] +
-    * [[gwusermanual:​migration_to_4_6_x#​configuration.properties|configuration.properties]] +
-    * log4j.properties,​ sostituito ​da [[gwusermanual:​migration_to_4_6_x#​log4j2.properties|log4j2.properties]]+
  
-Questi file potrebbero comunque necessitare ​di ulteriori integrazioni dovute ​personalizzazioni a suo tempo seguite ​sul cliente.+==== Caricamento Planimetrie ==== 
 +Il caso d’uso ​di caricamento di una planimetria da Upload Manager o da Client Cad non cambia per l’utente finale. I cambiamenti ci sono solamente nei processi lato server. L’sdf non dovrà essere più aggiornato all’interno della tabella gwd_layout, ma dovrà andare ​lavorare sulla gwd_drawing. 
 +A livello tecnologico questo comporterà una velocizzazione della procedura di inserimento SDF nel database in quanto la procedura più onerosa (cancellazione degli oggetti dall’SDF) sarà bypassata poiché ad ogni caricamento l’sdf ​sul drawing sarà ricreato da zero.
  
-=== Note === +==== Visualizzazione Planimetrie e Mapguide ​==== 
-log4j.properties va proprio eliminato. Se configurato male può causare la non partenza del server, con errore sul log standard error del server. +La visualizzazione delle planimetrie sarà il ramo che subirà ​il cambiamento più grandeFino a questo momento la visualizzazione ​di una planimetria era effettuata ​per layout ​(o piani) e al suo interno erano rappresentati ​più drawing facenti parte di unità tecnologiche differentiIl caso duso deve rimanere uguale a livello funzionale
- +Questo ​è possibile poiché all’interno ​di Mapguide Maestro ​è configurato ​un datasource fittizio chiamato SDF che è usata come fonte dati per tutti layer di sfondoQuesto datasource viene sostituito dinamicamente in fase di apertura della mappa con l’sdf ​che viene preso dal record della tabella gwd_layout corrispondente
-<​code>​ +La modifica alle tabelle presentate precedentemente ​va ad inficiare pesantemente ​questa logica:
-log4j:ERROR Could not find value for key log4j.appender.access +
-log4j:ERROR Could not instantiate appender named "​access"​. +
-</​code>​ +
-==== pom.xml ​==== +
-Per le versioni 4.6.X è stato creato un apposito template **gw-webapp-template 1.0.0**, ​che sostituisce ​il vecchio template **gw-webapp-template 1.0.0**. Il template va generato tramite {{ :​custom:​makegproj-4.6.x.zip |}}. +
- +
-Al contempo sono state fatti vari refactor ​di vario genere sui maven module del framework:​ +
-  * refactor nome dei moduli +
-    * tutti i moduli ora partono ​per '​gw-'​  +
-    * tutti name in minuscolo  +
-    * key-word staccate con '​-'​ +
-    * niente parole ridondanti nei name dei moduli maven: //plugin, service, utils// +
-  * //​artifactId// ​(//non il groupId//del pom generale geowebframework passa da //<​artifactId>​com.geowebframework</​artifactId>//​ a //<​artifactId>​geowebframework</​artifactId>//​ (interessa solo gli sviluppatori che devono generare nuovi maven plugin) +
-  * moduli integrati nel repository git di //​geowebframework//​ +
-  * moduli tirati fuori dal repository git di //​geowebframework//,​ in quanto di prodotto/​commessa  +
- +
-Per i progetti preesistenti modificare il pom.xml utilizzando i nuovi //​artifactId//, ​lasciando inalterato il //​groupId//​. +
- +
-=== Tabella riepilogativa === +
- +
-^ NOME MODULO MAVEN (artifactId) ^^ spostato da git geowebframework ^ MOVED/​DELETED ^ Deprecated ^ NOTE ^ +
-^ VECCHIO ^ NUOVO  ^ ^ ^ ^ ^  +
-|calendar | gw-advanced |||||  +
-|cde | gw-cde | SI | (git CDE) ||specifico CDE, da spostare su repo di prodotto | +
-|classificationplugin | gw-classification |||||  +
-|gwApproval | gw-approvals |||||  +
-|furnitureplugin | gw-furnitures | SI | (git SPACE) | | specifico SPACE, da spostare su repo di prodotto | +
-|googleStreetView | gw-google-street-view |||||  +
-|dataservice | gw-data ||||| +
-|- | gw-cms ||||versione 1.0.0. Aggiunto per ospitare i servizi cms rest| +
-|gwCsvConnector| gw-csv-connector | | MOVED | | integrato in git geowebframework,​ versionamento corrente 2.0.0 |  +
-|gwindex | gw-index | | | SI | pagine di accesso specifiche per il cde, da spostare su repo di prodotto | +
-|gwMnemonicCode | gw-mnemonic-code |||||  +
-|gwProvisioning | gw-provisioning | | | | usato solo da Università Padova, ma generale (provisioning dei loro utenti, copiati sul nostro DB)| +
-|gwRabbitApi | gw-rabbit-api |||||  +
-|gwRabbitConsumer | gw-rabbit-consumer |||||  +
-|gwRabbitPublisher | gw-rabbit-publisher |||||  +
-|gwScenari | gw-scenarios |||||  +
-|gwXktVisualizer | gw-xkt-visualizer |||||  +
-|hierarchicalFilterMenu||| MOVED || integrato in git geowebframework,​ ora senza versionamento specifico | +
-|indexPortal | gw-index-portal | | | SI | pagine di accesso specifiche per vecchie commesse | +
-|keycloak-userspi | gw-keycloak-userspi | | | | intesa Cloud, rimane in comune per ora ma non più usato con il nuovo KEYCLOACK | +
-|metadataservice ​ | gw-metadata |||||  +
-|portalApi | gw-portal-api |||SI|| +
-|portalObjects | gw-portal-commons |||SI|| +
-|printMapFlow | - | | MOVED | | usato solo in SPACE (Intesa) per ora, ma di carattere generale: accorpato in gw-print-map-legend,​ senza versionamento sprcifico | +
-|printMapLegend | gw-print-map-legend |||||  +
-|restapi | gw-rest-api | SI | | | rimosse chiamate del modulo EQUIPMENT (@Deprecated),​ tenuto per spostare servizi interoperabilità | +
-|smartplatformplugin | gw-smartplatform | SI | MOVED | SI | widget (indicatori in mappa auto aggiornanti,​ serie storiche, etc..) e funzionalità per integrazione dati sensori provenienti dalla smartplatform |  +
-|thematism | gw-thematism |||||  +
-|ThreeDVisualizer | gw-3d-visualizer |||||  +
-|transfer-objects | gw-commons + gw-commons-web |||| splittato in due moduli gw-commons + gw-commons-web |  +
-|umplugin | gw-upload-manager |||||  +
-|webadmin | gw-webadmin |||||  +
-|webclient | gw-webclient |||||  +
-|workflowservice | gw-workflow |||||  +
-|xeokitUtils | gw-xeokit |SI |DELETED |SI |cancellato,​ mai usato nel CDE (sostituito da rabbit-consumer) | +
-|webclientTemplate | gw-webapp-template ||||nuovo template 1.0.0 | +
- +
-excel censimento moduli: [[https://​docs.google.com/​spreadsheets/​d/​1kqvL8uERY4FJDFaPrl44kl7L1QYpds4pR55I1MhUGv8/​edit#​gid=0]] +
- +
-=== Esempi === +
-Esempio 1: +
-<code xml> +
-<​dependency>​ +
- <​groupId>​com.geowebframework</​groupId>​ +
- <​artifactId>​calendar</​artifactId>​ +
- <​version>​${com.geowebframework.version}</​version>​ +
-</​dependency>​ +
-... +
-<​dependency>​ +
- <​groupId>​com.geowebframework</​groupId>​ +
- <​artifactId>​ThreeDVisualizer</​artifactId>​ +
- <​version>​${com.geowebframework.version}</​version>​ +
-</​dependency>​ +
-... +
-<​dependency>​ +
- <​groupId>​com.geowebframework</​groupId>​ +
- <​artifactId>​umplugin</​artifactId>​ +
- <​version>​${com.geowebframework.version}</​version>​ +
-</​dependency>​ +
- +
-</​code>​ +
-diventa: +
-<code xml> +
-<​dependency>​ +
- <​groupId>​com.geowebframework</​groupId>​ +
- <​artifactId>​gw-advanced</​artifactId>​ +
- <​version>​${com.geowebframework.version}</​version>​ +
-</​dependency>​ +
-... +
-<​dependency>​ +
- <​groupId>​com.geowebframework</​groupId>​ +
- <​artifactId>​gw-3d-visualizer</​artifactId>​ +
- <​version>​${com.geowebframework.version}</​version>​ +
-</​dependency>​ +
-... +
-<​dependency>​ +
- <​groupId>​com.geowebframework</​groupId>​ +
- <​artifactId>​gw-upload-manager</​artifactId>​ +
- <​version>​${com.geowebframework.version}</​version>​ +
-</​dependency>​ +
-</​code>​ +
- +
-Esempio 2, da rimuovere:​ +
-<code xml> +
-<​dependency>​ +
- <​groupId>​com.geowebframework</​groupId>​ +
- <​artifactId>​printMapFlow</​artifactId>​ +
- <​version>​${com.geowebframework.version}</​version>​ +
-</​dependency>​ +
-... +
-<​dependency>​ +
- <​groupId>​com.geowebframework</​groupId>​ +
- <​artifactId>​hierarchicalFilterMenu</​artifactId>​ +
- <​version>​${com.geowebframework.version}</​version>​ +
-</​dependency>​ +
-</​code>​ +
- +
-==== spring-security.xml ==== +
- +
-Localizzazione:​ //​WEB-INF/​spring-security.xml//​ +
- +
-Nel nuovo template di progetto **gw-webapp-template**,​ sono resi disponibili i seguenti template di //​spring-security*.xml//:​ +
-  * [[gwusermanual:​migration_to_4_6_x#​spring-security-base.xml|spring-security.xml-base]] - NO KEYCLOAK +
-  * [[gwusermanual:​migration_to_4_6_x#​spring-security-keycloak.xml|spring-security-keycloak.xml]] - KEYCLOAK +
-  * [[gwusermanual:​migration_to_4_6_x#​spring-security-deprecated.xml|spring-security-deprecated.xml]] - NO KEYCLOAK, ma con altri tag http, meccanismi di autenticazione,​ ora deprecati, o di uso particolare:​ +
-    * <​code><​http pattern="/​oauth/​*"</​code>​ usati dalle app e servizi rest, legati alla parte oauth2 +
-    * <​code><​http pattern="/​services/​**"</​code>​ usati dalle app e servizi rest, legati alla parte oauth2 +
-    * preAuthFilter <​code><​beans:​bean id="​preAuthFilter"</​code>​ +
-    * preAuthAuthenticationProviderExt <​code><​beans:​bean id="​preAuthAuthenticationProviderExt"</​code>​ +
-    * oauth2 <​code><​beans:​bean id="​oauthAuthenticationEntryPoint"​ class="​org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint"></​code>​ +
-    * LDAP <​code><​beans:​bean id="​adAuthenticationProvider"​ class="​org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider"></​code>​ +
- +
-=== Quando usare uno specifico template === +
-  * [[gwusermanual:​migration_to_4_6_x#​spring-security-base.xml|spring-security.xml]] Nei casi **dove c'è un ID (Identity Provider)** esterno o comunque messo a diposizione dal cliente (i cui //​bean// ​di configurazione dovranno eventualmente essere integrati) +
-  * [[gwusermanual:​migration_to_4_6_x#​spring-security-keycloak.xml|spring-security-keycloak.xml]] Nei casi **dove non c'è un ID (Identity Provider)** del cliente, o nei nostri ambienti interni, dove l'ID scelto ​è per l'​appunto //​keycloak//​ +
-  *[[gwusermanual:​migration_to_4_6_x#​spring-security-deprecated.xml|spring-security-deprecated.xml]] **MAI**, usarlo solo come riferimento ​per integrare negli altri due template solo la parte eventualmente necessaria +
- +
- +
-=== spring-security-base.xml === +
-<code xml spring-security.xml>​ +
-<?xml version="​1.0"​ encoding="​UTF-8"?>​ +
-<​beans:​beans +
- xmlns="​http://​www.springframework.org/​schema/​security"​ +
- xmlns:​beans="​http://​www.springframework.org/​schema/​beans"​ +
- xmlns:​context="​http://​www.springframework.org/​schema/​context"​ +
- xmlns:​oauth="​http://​www.springframework.org/​schema/​security/​oauth2"​ +
- xmlns:​xsi="​http://​www.w3.org/​2001/​XMLSchema-instance"​ +
- xsi:​schemaLocation="​ +
- http://​www.springframework.org/​schema/​security http://​www.springframework.org/​schema/​security/​spring-security.xsd +
- http://​www.springframework.org/​schema/​beans http://​www.springframework.org/​schema/​beans/​spring-beans.xsd +
- http://​www.springframework.org/​schema/​context http://​www.springframework.org/​schema/​context/​spring-context.xsd +
- http://​www.springframework.org/​schema/​security/​oauth2 http://​www.springframework.org/​schema/​security/​spring-security-oauth2.xsd +
-+
-+
-  +
- <​context:​component-scan base-package="​com.geowebframework.webclient.security"​ />  +
-  +
- <​beans:​import resource="​classpath:​metadata-config-spring-security.xml"​ /> +
-  +
- <​beans:​import resource="​classpath*:​META-INF/​*.beandef-security.xml"​ /> +
-  +
- <​beans:​bean id="​messageSource"​ class="​com.geowebframework.metadataservice.messagesource.GwReloadableResourceBundleMessageSource">​ +
- <​beans:​property name="​basenames">​ +
- <​beans:​list>​ +
- <​beans:​value>​classpath*:​locale/​messages*</​beans:​value>​ <!-- load all .properties files contained under folder locale, which name starts with '​messages'​. Works even for plug-in --> +
- </​beans:​list>​ +
- </​beans:​property>​ +
- <​beans:​property name="​defaultEncoding"​ value="​UTF-8"/>​ +
- <​beans:​property name="​useCodeAsDefaultMessage"​ value="​false"/><​!-- Set whether to use the message code as default message instead ​ of throwing a NoSuchMessageException. Useful for development and debugging. Default is "​false"​. ​ -->  +
- </​beans:​bean>​ +
-  +
- <!-- PropertyPlaceholderConfigurer still needed here, GwPropertyPlaceholderConfigurer not used --> +
- <​beans:​bean class="​org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">​ +
- <​beans:​property name="​locations"​ value="​classpath:​configuration.properties"/>​ +
- </​beans:​bean>​ +
-  +
-  +
- <!-- Add disable-url-rewriting set to true to prevent URL rewriting of jsessionid --> +
- <http auto-config="​true"​ use-expressions="​true"​ disable-url-rewriting="​true">​ +
- <csrf request-matcher-ref="​csrfMatcher"/>​ +
-  +
- <!--  +
- issue #589 set response header to prevent clickjacking attacks +
- it solves browser console error: +
- Refused to display '​http://​localhost:​8081/'​ in a frame because it set '​X-Frame-Options'​ to '​deny'​. +
- --> +
- <​headers>​  +
- <​frame-options policy="​SAMEORIGIN"​ />  +
- <​header name="​X-Content-Security-Policy"​ value="​default-src inline-script eval-script;​ frame-ancestors '​self'"/>​ +
- <hsts include-subdomains="​true"​ max-age-seconds="​31536000"​ /> +
- </​headers>​  +
-  +
- <!-- IMPORTANT --> +
- <!-- Patterns are always evaluated in the order they are defined. Thus it is important that more specific patterns are defined higher in the list than less specific patterns. --> +
-  +
- <​intercept-url pattern="/​login*"​ access="​permitAll"​ /> <!-- cover also '​loginPage'​ --> +
- <​intercept-url pattern="/​forgotPassword*"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resetPassword*"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​forceChangePassword*"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​accessdenied*"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​emptyMetadataCache"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​emptyClassificationCache"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​emptyMnemonicCodeCache"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​livenessProbe"​ access="​permitAll"​ /> <!-- kubernetes support --> +
- <​intercept-url pattern="/​readinessProbe"​ access="​permitAll"​ /> <!-- kubernetes support --> +
-  +
- <!-- set permitAll for all used resources inside login pages --> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​debug/​dojo/​**"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​debug/​dijit/​**"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​debug/​dojox/​**"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​compressed/​dojo/​**"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​compressed/​dijit/​**"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​compressed/​dojox/​**"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​css/​**"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​icons/​**"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​fontawesome/​**"​ access="​permitAll"​ /> <!-- issue #509 --> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​images/​favicon.png"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​images/​${images.login.form.logo:​gw4_enterprise.png}"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​${images.IndexBackground:​IndexBackground.jpg}"​ access="​permitAll"​ /> +
-  +
- <!-- for all other resources should to be isAuthenticated() or isAnonymous() --> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/**" access="​isAuthenticated()"​ /> +
-  +
- <​intercept-url pattern="/​index*"​ access="​isAuthenticated()"​ /> +
-  +
- <!-- @@@ANONYMOUS_USER@@@ --> +
- <!-- +
- -to enable anonymous access: comment 1 and decomment 2 +
- write the right group name inside '​anonymous'​ tag, in '​granted-authority'​ attribute  +
- (if omitted, the default role is ROLE_ANONYMOUS) +
- --> +
- <​!--1-->​ +
- <​intercept-url pattern="/​**"​ access="​isAuthenticated()"​ /> +
- <​!--2 +
- <​intercept-url pattern="/​**"​ access="​isAuthenticated() or isAnonymous()"​ /> +
- <​anonymous username=""​ granted-authority="​ROLE_ANONYMOUS"​ />​-->​ +
-  +
-  +
- <!-- +
- defaults tag attributes:​ +
- password-parameter="​password"​ +
- username-parameter="​username"​ +
- login-processing-url="​login"​ +
- --> +
- <​form-login +
- login-page="/​loginPage.html"​ +
- default-target-url="/​index.html"​ +
- authentication-failure-handler-ref="​gwAuthenticationFailureHandler"​ +
-  +
- /> +
- <!-- +
- alternative to authentication-failure-handler-ref:​ +
- authentication-failure-url="/​loginPage.html?​error"​ /> +
- --> +
-  +
- <​!--STANDARD OR CUSTOM LOGOUT, decomment the one to be used-->​ +
-  +
- <​!--STANDARD LOGOUT-->​ +
- <​!--choose one between-->​ +
- <​!--<​logout invalidate-session="​true"​ logout-url="/​gwlogout"​ logout-success-url="/"​ />​-->​ +
- <​!--<​logout invalidate-session="​true"​ logout-url="/​gwlogout"​ logout-success-url="/​loginPage.html?​logout"​ />​-->​ +
- <​logout invalidate-session="​true"​ logout-url="/​gwlogout"​ logout-success-url="/​loginPage.html?​logout"​ /> +
-  +
- <​!--CUSTOM LOGOUT-->​ +
- <!-- +
- <​logout success-handler-ref="​customLogoutSuccessHandler"​ /> +
- --> +
- </​http>​ +
-  +
- <​!--CUSTOM LOGOUT-->​ +
- <!-- +
- <​beans:​bean id="​customLogoutSuccessHandler"​ class="​com.geowebframework.webclient.controller.CustomLogoutSuccessHandler"​ /> +
- --> +
-  +
- <​beans:​bean id="​csrfMatcher"​ class="​org.springframework.security.web.util.matcher.OrRequestMatcher">​ +
- <​beans:​constructor-arg>​ +
- <​beans:​list value-type="​org.springframework.security.web.util.matcher.RequestMatcher">​ +
- <​beans:​bean class="​org.springframework.security.web.util.matcher.AntPathRequestMatcher">​ +
- <​beans:​constructor-arg name="​pattern"​ value="​login*"/>​ +
- <​beans:​constructor-arg name="​httpMethod"​ value="​POST"/>​ +
- </​beans:​bean>​ +
- <​beans:​bean class="​org.springframework.security.web.util.matcher.AntPathRequestMatcher">​ +
- <​beans:​constructor-arg name="​pattern"​ value="/​rest/​*/​groovyAction/​generic/​**"/>​ +
- <​beans:​constructor-arg name="​httpMethod"​ value="​POST"/>​ +
- </​beans:​bean>​ +
- <​beans:​bean class="​org.springframework.security.web.util.matcher.AntPathRequestMatcher">​ +
- <​beans:​constructor-arg name="​pattern"​ value="/​rest/​*/​groovyAction/​detail/​**"/>​ +
- <​beans:​constructor-arg name="​httpMethod"​ value="​POST"/>​ +
- </​beans:​bean>​ +
- <​beans:​bean class="​org.springframework.security.web.util.matcher.AntPathRequestMatcher">​ +
- <​beans:​constructor-arg name="​pattern"​ value="/​rest/​*/​groovyAction/​list/​**"/>​ +
- <​beans:​constructor-arg name="​httpMethod"​ value="​POST"/>​ +
- </​beans:​bean>​ +
- <​beans:​bean class="​org.springframework.security.web.util.matcher.AntPathRequestMatcher">​ +
- <​beans:​constructor-arg name="​pattern"​ value="/​rest/​editDetail/​*/​insertDetail**"/>​ +
- <​beans:​constructor-arg name="​httpMethod"​ value="​POST"/>​ +
- </​beans:​bean>​ +
- <​beans:​bean class="​org.springframework.security.web.util.matcher.AntPathRequestMatcher">​ +
- <​beans:​constructor-arg name="​pattern"​ value="/​rest/​editDetail/​*/​updateDetail**"/>​ +
- <​beans:​constructor-arg name="​httpMethod"​ value="​POST"/>​ +
- </​beans:​bean>​ +
- <​beans:​bean class="​org.springframework.security.web.util.matcher.AntPathRequestMatcher">​ +
- <​beans:​constructor-arg name="​pattern"​ value="/​rest/​editDetail/​*/​deleteDetail**"/>​ +
- <​beans:​constructor-arg name="​httpMethod"​ value="​POST"/>​ +
- </​beans:​bean>​ +
- <​beans:​bean class="​org.springframework.security.web.util.matcher.AntPathRequestMatcher">​ +
- <​beans:​constructor-arg name="​pattern"​ value="/​rest/​saveAllMultipleGeometryEdit**"/>​ +
- <​beans:​constructor-arg name="​httpMethod"​ value="​POST"/>​ +
- </​beans:​bean>​ +
- </​beans:​list>​ +
- </​beans:​constructor-arg>​ +
- </​beans:​bean>​ +
-  +
- <​beans:​bean id="​filterMultipartResolver"​ class="​org.springframework.web.multipart.commons.CommonsMultipartResolver">​ +
- <​beans:​property name="​maxUploadSize"​ value="​${commonsMultipartResolver.maxUploadSize:​209715200}"​ /> +
- </​beans:​bean>​ +
-  +
-  +
- <​beans:​bean id="​userLoginLogger"​ class="​com.geowebframework.webclient.security.LogFileLogger"/>​  +
- <​beans:​bean id="​authenticationSuccessEventListner"​ class="​com.geowebframework.webclient.security.AuthenticationSuccessEventListner">​ +
- <​beans:​constructor-arg ref = "​userLoginLogger"/>​ +
- </​beans:​bean>​ +
-  +
- <​beans:​bean id="​gwAuthenticationFailureHandler"​ class="​com.geowebframework.webclient.security.GwAuthenticationFailureHandler"/>​ +
-  +
- +
- <​beans:​bean id="​metadataSource"​ class="​org.apache.commons.dbcp.BasicDataSource"​ +
- destroy-method="​close">​ +
- <​beans:​property name="​driverClassName"​ value="​${jdbcmetadata.driverClassName}"​ /> +
- <​beans:​property name="​url"​ value="​${jdbcmetadata.url}"​ /> +
- <​beans:​property name="​username"​ value="​${jdbcmetadata.username}"​ /> +
- <​beans:​property name="​password"​ value="​${jdbcmetadata.password}"​ /> +
- <​beans:​property name="​maxActive"​ value="​2"​ /> +
- <​beans:​property name="​minIdle"​ value="​1"​ /> +
- <​beans:​property name="​maxIdle"​ value="​2"​ /> +
- <​beans:​property name="​validationQuery"​ value="​${jdbcmetadata.validationQuery}"/>​ +
- </​beans:​bean>​ +
-  +
- <​beans:​bean id="​metadataSqlSessionFactory"​ class="​org.mybatis.spring.SqlSessionFactoryBean">​ +
- <​beans:​property name="​dataSource"​ ref="​metadataSource"​ /> +
- <​beans:​property name="​configLocation"​ value="​classpath:​mybatis-config.xml"​ /> +
- </​beans:​bean>​ +
-  +
-  +
- <​beans:​bean id="​customUserDetailsService"​ class="​com.geowebframework.webclient.security.CustomUserDetailsService">​ +
- <​beans:​property name="​usersByUsernameQuery"​ value="​select * from GWM_USERS where username = ?"/>​ +
- <​beans:​property name="​authoritiesByUsernameQuery"​ value="​select GWM_USER_GROUPS.*,​ usergroup as authority from GWM_USER_GROUPS where username =?" /> +
- <​beans:​property name="​dataSource">​ +
- <​beans:​ref bean="​metadataSource"></​beans:​ref>​ +
- </​beans:​property>​ +
- </​beans:​bean>​ +
-  +
- <​beans:​bean id="​gwUserDetailsDao"​ class="​com.geowebframework.webclient.security.GwUserDetailsDaoImpl"​ ></​beans:​bean>​ +
-  +
- <​beans:​bean id="​limitLoginAuthenticationProvider"​ class="​com.geowebframework.webclient.security.LimitLoginAuthenticationProvider">​ +
- <​beans:​property name="​userDetailsService"​ ref="​customUserDetailsService"​ /> +
- <​beans:​property name="​passwordEncoder"​ ref="​passwordEncoder"​ /> +
- </​beans:​bean>​ +
- +
- <​authentication-manager alias="​authenticationManager">​ +
-  +
- <​authentication-provider ref="​limitLoginAuthenticationProvider"></​authentication-provider>​ +
-  +
- </​authentication-manager>​ +
- +
-</​beans:​beans>​ +
-</​code>​ +
- +
-=== spring-security-keycloak.xml === +
-<code xml spring-security-keycloak.xml>​ +
-<?xml version="​1.0"​ encoding="​UTF-8"?>​ +
-<​beans:​beans +
- xmlns="​http://​www.springframework.org/​schema/​security"​ +
- xmlns:​beans="​http://​www.springframework.org/​schema/​beans"​ +
- xmlns:​context="​http://​www.springframework.org/​schema/​context"​ +
- xmlns:​oauth="​http://​www.springframework.org/​schema/​security/​oauth2"​ +
- xmlns:​xsi="​http://​www.w3.org/​2001/​XMLSchema-instance"​ +
- xsi:​schemaLocation="​ +
- http://​www.springframework.org/​schema/​security http://​www.springframework.org/​schema/​security/​spring-security.xsd +
- http://​www.springframework.org/​schema/​beans http://​www.springframework.org/​schema/​beans/​spring-beans.xsd +
- http://​www.springframework.org/​schema/​context http://​www.springframework.org/​schema/​context/​spring-context.xsd +
- http://​www.springframework.org/​schema/​security/​oauth2 http://​www.springframework.org/​schema/​security/​spring-security-oauth2.xsd +
-+
-+
-  +
- <​context:​component-scan base-package="​com.geowebframework.webclient.security"​ />  +
-  +
- <​beans:​import resource="​classpath:​metadata-config-spring-security.xml"​ /> +
-  +
- <​beans:​import resource="​classpath*:​META-INF/​*.beandef-security.xml"​ /> +
-  +
- <​beans:​bean id="​messageSource"​ class="​com.geowebframework.metadataservice.messagesource.GwReloadableResourceBundleMessageSource">​ +
- <​beans:​property name="​basenames">​ +
- <​beans:​list>​ +
- <​beans:​value>​classpath*:​locale/​messages*</​beans:​value>​ <!-- load all .properties files contained under folder locale, which name starts with '​messages'​. Works even for plug-in --> +
- </​beans:​list>​ +
- </​beans:​property>​ +
- <​beans:​property name="​defaultEncoding"​ value="​UTF-8"/>​ +
- <​beans:​property name="​useCodeAsDefaultMessage"​ value="​false"/><​!-- Set whether to use the message code as default message instead ​ of throwing a NoSuchMessageException. Useful for development and debugging. Default is "​false"​. ​ -->  +
- </​beans:​bean>​ +
-  +
- <!-- @@@KEYCLOAK@@@ STARTS --> +
- <​beans:​bean id="​adapterDeploymentContext"​ class="​org.keycloak.adapters.springsecurity.AdapterDeploymentContextFactoryBean">​ +
- <​beans:​constructor-arg value="/​WEB-INF/​keycloak.json"​ /> +
- </​beans:​bean>​ +
- +
- <​beans:​bean id="​keycloakAuthenticationEntryPoint"​ class="​org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationEntryPoint">​ +
- <​beans:​constructor-arg name="​adapterDeploymentContext"​ ref="​adapterDeploymentContext"​ /> +
- </​beans:​bean>​ +
- +
- <​beans:​bean id="​gwKeycloakAuthenticationProvider"​ class="​com.geowebframework.keycloak.authentication.GwKeycloakAuthenticationProvider"​ > +
- <​beans:​constructor-arg name="​gwKeycloakUserDetailsService"​ ref="​gwKeycloakUserDetailsService"​ /> +
- </​beans:​bean>​ +
-  +
- <​beans:​bean id="​gwKeycloakUserDetailsService"​ +
- class="​com.geowebframework.keycloak.userdetails.GwKeycloakUserDetailsService">​ +
- <​beans:​property name="​dataSource">​ +
- <​beans:​ref bean="​metadataSource"></​beans:​ref>​ +
- </​beans:​property>​ +
- </​beans:​bean>​ +
-  +
- <​beans:​bean id="​httpSessionManager"​ class="​org.keycloak.adapters.springsecurity.management.HttpSessionManager"​ /> +
- <​beans:​bean id="​keycloakPreAuthActionsFilter"​ class="​org.keycloak.adapters.springsecurity.filter.KeycloakPreAuthActionsFilter"​ > +
- <​beans:​constructor-arg ref="​httpSessionManager"/>​ +
- </​beans:​bean>​  +
-  +
- <​beans:​bean id="​keycloakAuthenticationProcessingFilter"​ class="​org.keycloak.adapters.springsecurity.filter.KeycloakAuthenticationProcessingFilter">​ +
- <​beans:​constructor-arg name="​authenticationManager"​ ref="​authenticationManager"​ /> +
- </​beans:​bean>​ +
-  +
- <​beans:​bean id="​keycloakLogoutHandler"​ class="​org.keycloak.adapters.springsecurity.authentication.KeycloakLogoutHandler">​ +
- <​beans:​constructor-arg ref="​adapterDeploymentContext"​ /> +
- </​beans:​bean>​ +
-  +
- <​beans:​bean id="​logoutFilter"​ class="​org.springframework.security.web.authentication.logout.LogoutFilter">​ +
- <​beans:​constructor-arg name="​logoutSuccessUrl"​ value="/"​ /> +
- <​beans:​constructor-arg name="​handlers">​ +
- <​beans:​list>​ +
- <​beans:​ref bean="​keycloakLogoutHandler"​ /> +
- <​beans:​bean class="​org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"​ /> +
- </​beans:​list>​ +
- </​beans:​constructor-arg>​ +
- <​beans:​property name="​logoutRequestMatcher">​ +
- <​beans:​bean class="​org.springframework.security.web.util.matcher.AntPathRequestMatcher">​ +
- <​beans:​constructor-arg name="​pattern"​ value="/​gwlogout**"​ /> +
- <​beans:​constructor-arg name="​httpMethod"​ value="​POST"​ /> +
- </​beans:​bean>​ +
- </​beans:​property>​ +
- </​beans:​bean>​ +
- <!-- @@@KEYCLOAK@@@ ENDS --> +
-  +
-  +
- <!-- Add disable-url-rewriting set to true to prevent URL rewriting of jsessionid --> +
- <http auto-config="​false"​ use-expressions="​true"​ disable-url-rewriting="​true"​ entry-point-ref="​keycloakAuthenticationEntryPoint">​  +
- <csrf disabled="​true"/>​ +
- <​!-- ​ <csrf request-matcher-ref="​csrfMatcher"/> ​ --> +
-  +
- <!--  +
- issue #589 set response header to prevent clickjacking attacks +
- it solves browser console error: +
- Refused to display '​http://​localhost:​8081/'​ in a frame because it set '​X-Frame-Options'​ to '​deny'​. +
- --> +
- <​headers>​  +
- <​frame-options policy="​SAMEORIGIN"​ />  +
- <​header name="​X-Content-Security-Policy"​ value="​default-src inline-script eval-script;​ frame-ancestors '​self'"/>​ +
- <hsts include-subdomains="​true"​ max-age-seconds="​31536000"​ /> +
- </​headers>​  +
-  +
- <!-- @@@KEYCLOAK@@@ --> +
- <​custom-filter ref="​keycloakPreAuthActionsFilter"​ before="​LOGOUT_FILTER"​ /> +
- <​custom-filter ref="​keycloakAuthenticationProcessingFilter"​ before="​FORM_LOGIN_FILTER"​ /> +
-  +
- <!-- IMPORTANT --> +
- <!-- Patterns are always evaluated in the order they are defined. Thus it is important that more specific patterns are defined higher in the list than less specific patterns. --> +
-  +
- <​intercept-url pattern="/​login*"​ access="​permitAll"​ /> <!-- cover also '​loginPage'​ --> +
- <​intercept-url pattern="/​forgotPassword*"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resetPassword*"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​forceChangePassword*"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​accessdenied*"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​emptyMetadataCache"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​emptyClassificationCache"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​emptyMnemonicCodeCache"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​livenessProbe"​ access="​permitAll"​ /> <!-- kubernetes support --> +
- <​intercept-url pattern="/​readinessProbe"​ access="​permitAll"​ /> <!-- kubernetes support --> +
-  +
- <!-- set permitAll for all used resources inside login pages --> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​debug/​dojo/​**"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​debug/​dijit/​**"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​debug/​dojox/​**"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​compressed/​dojo/​**"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​compressed/​dijit/​**"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​compressed/​dojox/​**"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​css/​**"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​icons/​**"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​fontawesome/​**"​ access="​permitAll"​ /> <!-- issue #509 --> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​images/​favicon.png"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​images/​${images.login.form.logo:​gw4_enterprise.png}"​ access="​permitAll"​ /> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​${images.IndexBackground:​IndexBackground.jpg}"​ access="​permitAll"​ /> +
-  +
- <!-- for all other resources should to be isAuthenticated() or isAnonymous() --> +
- <​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/**" access="​isAuthenticated()"​ /> +
-  +
- <​intercept-url pattern="/​index*"​ access="​isAuthenticated()"​ /> +
-  +
- <!-- @@@ANONYMOUS_USER@@@ --> +
- <!-- +
- -to enable anonymous access: comment 1 and decomment 2 +
- write the right group name inside '​anonymous'​ tag, in '​granted-authority'​ attribute  +
- (if omitted, the default role is ROLE_ANONYMOUS) +
- --> +
- <​!--1-->​ +
- <​intercept-url pattern="/​**"​ access="​isAuthenticated()"​ /> +
- <​!--2 +
- <​intercept-url pattern="/​**"​ access="​isAuthenticated() or isAnonymous()"​ /> +
- <​anonymous username=""​ granted-authority="​ROLE_ANONYMOUS"​ />​-->​ +
-  +
- <!-- @@@KEYCLOAK@@@ --> +
- <​custom-filter ref="​logoutFilter"​ position="​LOGOUT_FILTER"​ /> +
-  +
- </​http>​ +
-  +
- <​beans:​bean id="​csrfMatcher"​ class="​org.springframework.security.web.util.matcher.OrRequestMatcher">​ +
- <​beans:​constructor-arg>​ +
- <​beans:​list value-type="​org.springframework.security.web.util.matcher.RequestMatcher">​ +
- <​beans:​bean class="​org.springframework.security.web.util.matcher.AntPathRequestMatcher">​ +
- <​beans:​constructor-arg name="​pattern"​ value="​login*"/>​ +
- <​beans:​constructor-arg name="​httpMethod"​ value="​POST"/>​ +
- </​beans:​bean>​ +
- <​beans:​bean class="​org.springframework.security.web.util.matcher.AntPathRequestMatcher">​ +
- <​beans:​constructor-arg name="​pattern"​ value="/​rest/​*/​groovyAction/​generic/​**"/>​ +
- <​beans:​constructor-arg name="​httpMethod"​ value="​POST"/>​ +
- </​beans:​bean>​ +
- <​beans:​bean class="​org.springframework.security.web.util.matcher.AntPathRequestMatcher">​ +
- <​beans:​constructor-arg name="​pattern"​ value="/​rest/​*/​groovyAction/​detail/​**"/>​ +
- <​beans:​constructor-arg name="​httpMethod"​ value="​POST"/>​ +
- </​beans:​bean>​ +
- <​beans:​bean class="​org.springframework.security.web.util.matcher.AntPathRequestMatcher">​ +
- <​beans:​constructor-arg name="​pattern"​ value="/​rest/​*/​groovyAction/​list/​**"/>​ +
- <​beans:​constructor-arg name="​httpMethod"​ value="​POST"/>​ +
- </​beans:​bean>​ +
- <​beans:​bean class="​org.springframework.security.web.util.matcher.AntPathRequestMatcher">​ +
- <​beans:​constructor-arg name="​pattern"​ value="/​rest/​editDetail/​*/​insertDetail**"/>​ +
- <​beans:​constructor-arg name="​httpMethod"​ value="​POST"/>​ +
- </​beans:​bean>​ +
- <​beans:​bean class="​org.springframework.security.web.util.matcher.AntPathRequestMatcher">​ +
- <​beans:​constructor-arg name="​pattern"​ value="/​rest/​editDetail/​*/​updateDetail**"/>​ +
- <​beans:​constructor-arg name="​httpMethod"​ value="​POST"/>​ +
- </​beans:​bean>​ +
- <​beans:​bean class="​org.springframework.security.web.util.matcher.AntPathRequestMatcher">​ +
- <​beans:​constructor-arg name="​pattern"​ value="/​rest/​editDetail/​*/​deleteDetail**"/>​ +
- <​beans:​constructor-arg name="​httpMethod"​ value="​POST"/>​ +
- </​beans:​bean>​ +
- <​beans:​bean class="​org.springframework.security.web.util.matcher.AntPathRequestMatcher">​ +
- <​beans:​constructor-arg name="​pattern"​ value="/​rest/​saveAllMultipleGeometryEdit**"/>​ +
- <​beans:​constructor-arg name="​httpMethod"​ value="​POST"/>​ +
- </​beans:​bean>​ +
- </​beans:​list>​ +
- </​beans:​constructor-arg>​ +
- </​beans:​bean>​ +
-  +
- <​beans:​bean id="​filterMultipartResolver"​ class="​org.springframework.web.multipart.commons.CommonsMultipartResolver">​ +
- <​beans:​property name="​maxUploadSize"​ value="​${commonsMultipartResolver.maxUploadSize:​209715200}"​ /> +
- </​beans:​bean>​ +
-  +
- <!-- TODO TEST --> +
- <​beans:​bean id="​userLoginLogger"​ class="​com.geowebframework.webclient.security.LogFileLogger"/>​  +
- <​beans:​bean id="​authenticationSuccessEventListner"​ class="​com.geowebframework.webclient.security.AuthenticationSuccessEventListner">​ +
- <​beans:​constructor-arg ref = "​userLoginLogger"/>​ +
- </​beans:​bean>​ +
- <!-- TODO TEST --> +
- <​beans:​bean id="​gwAuthenticationFailureHandler"​ class="​com.geowebframework.webclient.security.GwAuthenticationFailureHandler"/>​ +
-  +
- +
- <​beans:​bean id="​metadataSource"​ class="​org.apache.commons.dbcp.BasicDataSource"​ +
- destroy-method="​close">​ +
- <​beans:​property name="​driverClassName"​ value="​${jdbcmetadata.driverClassName}"​ /> +
- <​beans:​property name="​url"​ value="​${jdbcmetadata.url}"​ /> +
- <​beans:​property name="​username"​ value="​${jdbcmetadata.username}"​ /> +
- <​beans:​property name="​password"​ value="​${jdbcmetadata.password}"​ /> +
- <​beans:​property name="​maxActive"​ value="​2"​ /> +
- <​beans:​property name="​minIdle"​ value="​1"​ /> +
- <​beans:​property name="​maxIdle"​ value="​2"​ /> +
- <​beans:​property name="​validationQuery"​ value="​${jdbcmetadata.validationQuery}"/>​ +
- </​beans:​bean>​ +
-  +
- <​beans:​bean id="​metadataSqlSessionFactory"​ class="​org.mybatis.spring.SqlSessionFactoryBean">​ +
- <​beans:​property name="​dataSource"​ ref="​metadataSource"​ /> +
- <​beans:​property name="​configLocation"​ value="​classpath:​mybatis-config.xml"​ /> +
- </​beans:​bean>​ +
-  +
- <​authentication-manager alias="​authenticationManager">​ +
-  +
- <!-- @@@KEYCLOAK@@@ --> +
- <​authentication-provider ref="​gwKeycloakAuthenticationProvider"​ /> +
-  +
- </​authentication-manager>​ +
- +
-</​beans:​beans>​ +
-</​code>​ +
- +
-=== Modifiche === +
-E' stato modificato il blocco <code xml><​http auto-config="​true"​ use-expressions="​true"​ disable-url-rewriting="​true">​...</​http></​code>​ +
-in particolare sono stati aggiunte le parti: +
-<code xml> +
-... +
-<​intercept-url pattern="/​livenessProbe"​ access="​permitAll"​ /> +
-<​intercept-url pattern="/​readinessProbe"​ access="​permitAll"​ /> +
-.. +
-<​intercept-url pattern="/​resources/#​{ T(com.geowebframework.metadataservice.registry.GwReleaseInfos).getRevision() }/​fontawesome/​**"​ access="​permitAll"​ /> <!-- issue #509 --> +
- +
-</​code>​ +
- +
-e modificate queste: +
-<code xml> +
- <!-- +
- password-parameter="​password"​ +
- username-parameter="​username"​ +
- login-processing-url="​login"​ +
- --> +
- <​form-login +
- login-page="/​loginPage.html"​ +
- default-target-url="/​index.html"​ +
- authentication-failure-handler-ref="​gwAuthenticationFailureHandler"​ +
-  +
- /> +
- <​!-- authentication-failure-url="/​loginPage.html?​error"​ /> --> +
-  +
-  +
-  +
-  +
- <​!--STANDARD OR CUSTOM LOGOUT, decomment the one to be used-->​ +
- <​!--STANDARD LOGOUT-->​ +
- <​!--<​logout logout-success-url="/"​ /> or <logout logout-success-url="/​loginPage.html?​logout"​ />​-->​ +
- <​logout +
- invalidate-session="​true"​ +
- logout-url="/​gwlogout"​ +
- logout-success-url="/​loginPage.html?​logout"​ +
- /> +
- <​!--CUSTOM LOGOUT-->​ +
- <!-- +
- <​logout success-handler-ref="​customLogoutSuccessHandler"​ /> +
- --> +
-</​code>​ +
- +
-Sono stati inoltre rimossi bean ora conservati in **spring-security-deprecated.xml** +
- +
- +
- +
-==== dispatcher-servlet.xml ==== +
- +
-Localizzazione:​ //​WEB-INF/​dispatcher-servlet.xml//​ +
- +
-<code xml dispatcher-servlet.xml>​ +
-<?xml version="​1.0"​ encoding="​UTF-8"?>​ +
-<beans +
- xmlns="​http://​www.springframework.org/​schema/​beans"​ +
- xmlns:​xsi="​http://​www.w3.org/​2001/​XMLSchema-instance"​ xmlns:​mvc="​http://​www.springframework.org/​schema/​mvc"​ +
- xmlns:​context="​http://​www.springframework.org/​schema/​context"​ +
- xmlns:​mybatis="​http://​mybatis.org/​schema/​mybatis-spring"​ xmlns:​util="​http://​www.springframework.org/​schema/​util"​ +
- xmlns:​aop="​http://​www.springframework.org/​schema/​aop"​ +
- xmlns:​task="​http://​www.springframework.org/​schema/​task"​ +
- xmlns:​ehcache="​http://​ehcache-spring-annotations.googlecode.com/​svn/​schema/​ehcache-spring"​ +
- xmlns:​mongo="​http://​www.springframework.org/​schema/​data/​mongo"​ +
- xsi:​schemaLocation="​ +
- http://​www.springframework.org/​schema/​mvc http://​www.springframework.org/​schema/​mvc/​spring-mvc.xsd +
- http://​www.springframework.org/​schema/​beans http://​www.springframework.org/​schema/​beans/​spring-beans.xsd +
- http://​www.springframework.org/​schema/​context http://​www.springframework.org/​schema/​context/​spring-context.xsd +
- http://​mybatis.org/​schema/​mybatis-spring http://​mybatis.org/​schema/​mybatis-spring.xsd +
- http://​www.springframework.org/​schema/​util http://​www.springframework.org/​schema/​util/​spring-util.xsd +
- http://​www.springframework.org/​schema/​aop http://​www.springframework.org/​schema/​aop/​spring-aop.xsd +
- http://​www.springframework.org/​schema/​task http://​www.springframework.org/​schema/​task/​spring-task.xsd +
- http://​ehcache-spring-annotations.googlecode.com/​svn/​schema/​ehcache-spring http://​ehcache-spring-annotations.googlecode.com/​svn/​schema/​ehcache-spring/​ehcache-spring-1.1.xsd +
- http://​www.springframework.org/​schema/​data/​mongo http://​www.springframework.org/​schema/​data/​mongo/​spring-mongo.xsd +
-+
-+
- <​context:​component-scan base-package="​com.geowebframework"​ /> +
-  +
- <!-- Convention: automatically including all resources declared under the folder META-INF/ inside files with '​.beandef.xml'​ extension ​ --> +
- <import resource="​classpath*:​META-INF/​*.beandef.xml"​ /> +
-  +
- <!-- METADATASOURCE --> +
- <bean id="​metadataSource"​ class="​org.apache.commons.dbcp.BasicDataSource"​ destroy-method="​close">​ +
- <​property name="​driverClassName"​ value="​${jdbcmetadata.driverClassName}"​ /> +
- <​property name="​url"​ value="​${jdbcmetadata.url}"​ /> +
- <​property name="​username"​ value="​${jdbcmetadata.username}"​ /> +
- <​property name="​password"​ value="​${jdbcmetadata.password}"​ /> +
- <​property name="​maxActive"​ value="​${jdbcmetadata.maxActive}"​ /> +
- <​property name="​minIdle"​ value="​${jdbcmetadata.minIdle}"​ /> +
- <​property name="​maxIdle"​ value="​${jdbcmetadata.maxIdle}"​ /> +
- <​property name="​validationQuery"​ value="​${jdbcmetadata.validationQuery}"/>​ +
- </​bean>​  +
-  +
- <!-- DATASOURCE --> +
- <bean id="​dataSource"​ class="​org.apache.commons.dbcp.BasicDataSource"​ destroy-method="​close">​ +
- <​property name="​driverClassName"​ value="​${jdbc.driverClassName}"​ /> +
- <​property name="​url"​ value="​${jdbc.url}"​ /> +
- <​property name="​username"​ value="​${jdbc.username}"​ /> +
- <​property name="​password"​ value="​${jdbc.password}"​ /> +
- <​property name="​maxActive"​ value="​${jdbc.maxActive}"​ /> +
- <​property name="​minIdle"​ value="​${jdbc.minIdle}"​ /> +
- <​property name="​maxIdle"​ value="​${jdbc.maxIdle}"​ /> +
- <​property name="​validationQuery"​ value="​${jdbc.validationQuery}"/>​ +
- </​bean>​ +
-  +
- <!-- MARSHALL --> +
- <​mvc:​annotation-driven>​ +
-  +
- <​mvc:​path-matching suffix-pattern="​true"/>​ <!-- issue #589 --> +
-  +
- <​mvc:​message-converters register-defaults="​true">​ +
- <bean id="​marshallingHttpMessageConverter"​ +
- class="​org.springframework.http.converter.xml.MarshallingHttpMessageConverter">​ +
- <​property name="​marshaller"​ ref="​oxmMarshaller"​ /> +
- <​property name="​unmarshaller"​ ref="​oxmMarshaller"​ /> +
- </​bean>​ +
- </​mvc:​message-converters>​ +
-  +
- </​mvc:​annotation-driven>​ +
-  +
- <bean id="​oxmMarshaller"​ class="​org.springframework.oxm.xstream.XStreamMarshaller">​ +
- <​property name="​autodetectAnnotations"​ value="​true"​ /> +
- </​bean>​ +
-  +
- <!-- FILE UPLOAD --> +
- <bean id="​multipartResolver"​ +
- class="​org.springframework.web.multipart.commons.CommonsMultipartResolver">​ +
-  +
- <!-- one of the properties available; the maximum file size in bytes --> +
- <​property name="​maxUploadSize"​ value="​2000000000"​ /> +
- </​bean>​ +
-  +
-</​beans>​ +
-</​code>​ +
- +
-=== Modifiche === +
-E' stato rimosso il blocco //​log4jInitialization//,​ non piu necessario con **log4j2** +
-<​code>​ +
- <!-- LOG4J --> +
- <bean id="​log4jInitialization"​ class="​org.springframework.beans.factory.config.MethodInvokingFactoryBean">​ +
- <​property name="​targetClass"​ value="​org.springframework.util.Log4jConfigurer"​ /> +
- <​property name="​targetMethod"​ value="​initLogging"​ /> +
- <​property name="​arguments">​ +
- <​list>​ +
- <​value>​classpath:​log4j.properties</​value>​ +
- <​value>​10000</​value>​ +
- </​list>​ +
- </​property>​ +
- </​bean>​ +
-</​code>​ +
- +
-==== web.xml ==== +
- +
-Localizzazione:​ //​WEB-INF/​web.xml//​ +
- +
-<code xml web.xml>​ +
-<?xml version="​1.0"​ encoding="​UTF-8"?>​ +
-<​web-app +
- xmlns="​http://​xmlns.jcp.org/​xml/​ns/​javaee"​ +
- xmlns:​xsi="​http://​www.w3.org/​2001/​XMLSchema-instance"​ +
- xsi:​schemaLocation="​http://​xmlns.jcp.org/​xml/​ns/​javaee http://​xmlns.jcp.org/​xml/​ns/​javaee/​web-app_3_1.xsd"​ +
- version="​3.1"​ +
-+
-  +
- <​display-name>​GeoWeb Manager</​display-name>​ +
-  +
-  +
- <​welcome-file-list>​ +
- <​!--DEFAULT --> +
- <​welcome-file>​index.html</​welcome-file>​ +
-  +
- <!-- SOLO EXITONE --> +
- <​!--<​welcome-file>​indexPortal.html</​welcome-file>​-->​ +
-  +
- <​!--SOLO CDE 3.5 --> +
- <​!--<​welcome-file>​gwindex.html</​welcome-file>​-->​ +
- </​welcome-file-list>​ +
-  +
-  +
- <​servlet>​ +
- <​servlet-name>​dispatcher</​servlet-name>​ +
- <​servlet-class>​org.springframework.web.servlet.DispatcherServlet</​servlet-class>​ +
- <​load-on-startup>​1</​load-on-startup>​ +
- <​!--<​async-supported>​true</​async-supported>​ must be enable for use websocket with mapguide --> +
- <​async-supported>​true</​async-supported>​ +
- <!-- +
- It should to solve the problem: +
- Request processing failed; nested exception is org.springframework.web.multipart.MultipartException:​  +
- Failed to parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadException:​  +
- UT000020:​ Connection terminated as request was larger than 10485760 +
-  +
- Sizes must to be expressed in byte (B) +
- --> +
- <​multipart-config>​ +
- <​location>/​tmp</​location>​ +
- <​max-file-size>​104857600</​max-file-size><​!--100MB-->​ +
- <​max-request-size>​209715200</​max-request-size><​!--200MB-->​ +
- <​file-size-threshold>​0</​file-size-threshold>​ +
- </​multipart-config>​ +
- </​servlet>​ +
-  +
-  +
- <​servlet-mapping>​ +
- <​servlet-name>​dispatcher</​servlet-name>​ +
- <​url-pattern>​*.html</​url-pattern>​ +
- </​servlet-mapping>​ +
- <​servlet-mapping>​ +
- <​servlet-name>​dispatcher</​servlet-name>​ +
- <​url-pattern>/​rest/​*</​url-pattern>​ +
- </​servlet-mapping>​ +
- <​servlet-mapping>​ +
- <​servlet-name>​dispatcher</​servlet-name>​ +
- <​url-pattern>/​services/​*</​url-pattern>​ +
- </​servlet-mapping>​ +
- <​servlet-mapping>​ +
- <​servlet-name>​dispatcher</​servlet-name>​ +
- <​url-pattern>/​files/​*</​url-pattern>​ +
- </​servlet-mapping>​ +
- <​servlet-mapping>​ +
- <​servlet-name>​dispatcher</​servlet-name>​ +
- <​url-pattern>/</​url-pattern>​ +
- </​servlet-mapping>​ +
-  +
-  +
- <​!--HTML REPORT SERVELT STARTS-->​ +
- <​servlet>​ +
- <​servlet-name>​ImageServlet</​servlet-name>​ +
- <​servlet-class>​net.sf.jasperreports.j2ee.servlets.ImageServlet</​servlet-class> ​  +
- <​async-supported>​true</​async-supported>​ +
- </​servlet>​ +
- <​servlet-mapping>​ +
- <​servlet-name>​ImageServlet</​servlet-name>​ +
- <​url-pattern>/​jrImage</​url-pattern>​ +
- </​servlet-mapping>​ +
- <​!--HTML REPORT SERVELT ENDS-->​ +
-  +
-  +
- <​jsp-config>​ +
- <​taglib>​ +
- <​taglib-uri>​http://​geowebframework.com/​jsp/​jstl/​functions</​taglib-uri>​ +
- <​taglib-location>/​WEB-INF/​gwutil-functions.tld</​taglib-location>​ +
- </​taglib>​ +
-  +
- <​jsp-property-group>​ +
- <​url-pattern>​*.jsp</​url-pattern>​ +
- <​page-encoding>​UTF-8</​page-encoding>​ +
- </​jsp-property-group>​ +
- </​jsp-config>​ +
-  +
-  +
- <​listener>​ +
- <​listener-class>​ +
- org.springframework.web.context.ContextLoaderListener +
- </​listener-class>​ +
- </​listener>​ +
-  +
-  +
- <!-- +
- It's needed to have HttpServletRequest request available with @Autowired;​ +
- inside a generic XUserDetailsService that implements UserDetailsService. +
- example: SiteminderUserDetailsService.java +
- --> +
- <​listener>​ +
- <​listener-class>​ +
- org.springframework.web.context.request.RequestContextListener +
- </​listener-class>​ +
- </​listener>​ +
-  +
-  +
- <!-- Spring Security STARTS --> +
- <​context-param>​ +
- <​param-name>​contextConfigLocation</​param-name>​ +
- <​param-value>​ +
- <!-- TODO CONFIGURE, choose one between: --> +
- <!-- /​WEB-INF/​spring-security.xml --> +
- <!-- /​WEB-INF/​spring-security-keycloak.xml --> +
- /​WEB-INF/​spring-security.xml +
- </​param-value>​ +
- </​context-param>​ +
-  +
- <​filter>​ +
- <​filter-name>​springSecurityFilterChain</​filter-name>​ +
- <​filter-class>​ +
- org.springframework.web.filter.DelegatingFilterProxy +
- </​filter-class>​ +
- <​!--<​async-supported>​true</​async-supported>​ must be enable for use websocket whith mapguide, must stay before <​init-param> ​ and after  <​filter-class>​-->​ +
- <​async-supported>​true</​async-supported>​ +
- <​init-param>​ +
- <​param-name>​contextAttribute</​param-name>​ +
- <​param-value>​org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcher</​param-value>​ +
- </​init-param>​ +
- </​filter>​ +
-  +
- <​filter-mapping>​ +
- <​filter-name>​springSecurityFilterChain</​filter-name>​ +
- <​url-pattern>/​*</​url-pattern>​ +
- </​filter-mapping>​ +
- <!-- Spring Security ENDS --> +
-  +
-  +
- <!-- FORCE UTF-8 STARTS -->  +
- <!-- important that is at the beginning -->  +
- <​filter>​ +
- <​filter-name>​encodingFilter</​filter-name>​ +
- <​filter-class>​org.springframework.web.filter.CharacterEncodingFilter</​filter-class>​ +
- <​async-supported>​true</​async-supported>​ +
- <​init-param>​ +
- <​param-name>​encoding</​param-name>​ +
- <​param-value>​UTF-8</​param-value>​ +
- </​init-param>​ +
- <​init-param>​ +
- <​param-name>​forceEncoding</​param-name>​ +
- <​param-value>​true</​param-value>​ +
- </​init-param>​ +
- </​filter>​ +
-  +
- <​filter-mapping>​ +
- <​filter-name>​encodingFilter</​filter-name>​ +
- <​url-pattern>/​*</​url-pattern>​ +
- </​filter-mapping>​ +
- <!-- FORCE UTF-8 ENDS --> +
-  +
-  +
- <!-- CORS STARTS-->​ +
- <​filter>​ +
- <​filter-name>​customOptionsMethodFilter</​filter-name>​ +
- <​filter-class>​com.geowebframework.webclient.security.cors.CustomOptionsMethodFilter</​filter-class>​ +
- </​filter>​ +
- <​filter-mapping>​ +
- <​filter-name>​customOptionsMethodFilter</​filter-name>​ +
- <​url-pattern>/​*</​url-pattern>​ +
- </​filter-mapping>​ +
-  +
- <​filter>​ +
- <​filter-name>​customCorsFilter</​filter-name>​ +
- <​filter-class>​com.geowebframework.webclient.security.cors.CustomCorsFilter</​filter-class>​ +
- </​filter>​ +
- <​filter-mapping>​ +
- <​filter-name>​customCorsFilter</​filter-name>​ +
- <​url-pattern>/​*</​url-pattern>​ +
- </​filter-mapping>​ +
- <​filter>​ +
- <​filter-name>​XSSFilter</​filter-name>​ +
- <​filter-class>​com.geowebframework.webclient.security.xss.CrossSiteScriptingFilter</​filter-class>​ +
- </​filter>​ +
- <​filter-mapping>​ +
- <​filter-name>​XSSFilter</​filter-name>​ +
- <​url-pattern>/​*</​url-pattern>​ +
- </​filter-mapping>​ +
- <!-- CORS ENDS-->​ +
-  +
-  +
- <!-- MULTIPART FILTER STARTS-->​ +
- <​filter>​ +
- <​filter-name>​MultipartFilter</​filter-name>​ +
- <​filter-class>​org.springframework.web.multipart.support.MultipartFilter</​filter-class>​ +
- </​filter>​ +
- <​filter-mapping>​ +
- <​filter-name>​MultipartFilter</​filter-name>​ +
- <​url-pattern>/​*</​url-pattern>​ +
- </​filter-mapping>​ +
- <!-- MULTIPART FILTER ENDS-->​ +
-  +
-  +
- <!-- [RP20_666_27] INFORMATION DISCLOSURE OF THE INFRASTRUCTURE --> +
- <​context-param>​ +
- <​param-name>​com.sun.faces.sendPoweredByHeader</​param-name>​ +
- <​param-value>​false</​param-value>​ +
- </​context-param>​ +
-  +
-  +
- <​session-config>​ +
- <​session-timeout>​15</​session-timeout>​ +
-  +
- <!-- [RP20_666_14] INSECURE SESSION COOKIE --> +
- <!-- The following 4 lines (cookie-config tag) must be uncommented in production --> +
-  +
- <!--  +
- <​cookie-config>​ +
- <​http-only>​true</​http-only>​ +
- <​secure>​true</​secure>​ +
- </​cookie-config>​  +
- --> +
- </​session-config>​ +
-  +
-</​web-app>​ +
-</​code>​ +
- +
-=== Modifiche === +
-Nel blocco sottostante si può scegliere quale spring-security utilizzare fra //​spring-security.xml//​ e //​spring-security-keycloak.xml//​. Il default è spring-security.xml +
-<​code>​ +
-... +
- <​context-param>​ +
- <​param-name>​contextConfigLocation</​param-name>​ +
- <​param-value>​ +
- <!-- TODO CONFIGURE, choose one between: --> +
- <!-- /​WEB-INF/​spring-security.xml --> +
- <!-- /​WEB-INF/​spring-security-keycloak.xml --> +
- /​WEB-INF/​spring-security.xml +
- </​param-value>​ +
- </​context-param>​ +
-... +
-</​code>​ +
- +
- +
-==== configuration.properties ==== +
- +
-Localizzazione:​ +
-  * //​[static-contents-folder]/​conf/​configuration.properties//​ +
-  * //​src/​main/​resources/​configuration.properties//​ +
- +
-Va utilizzato il template disponibile [[gwUserManual:​configuration_4_6_x|qui ]], integrandolo con dati e le personalizzazioni del vecchio //​configuration.properties//​ +
- +
- +
-==== log4j2.properties ==== +
-Nelle versioni 4.6.X è stato introdotto **log4j2**, che sostituisce **log4j**. +
- +
-Localizzazione:​ +
-  * //​[static-contents-folder]/​conf/​log4j2.properties//​ +
-  * //​src/​main/​resources/​log4j2.properties//​ +
- +
-Va utilizzato il template disponibile nella [[gwusermanual:​log4j2_properties|guida]],​ integrandolo con i dati del vecchio log4j.properties. +
- +
-In particolare dovrebbe essere solo necessario riprendere i nomi dei file di log, e configurali nei blocchi: +
-<​code>​ +
-appender.rolling.fileName = ${sys:​catalina.home}/​logs/​geoweb_client.log +
-appender.rolling.filePattern = ${sys:​catalina.home}/​logs/​geoweb_client-%d{yyyy-MM-dd-HH-mm-ss}-%i.log +
-</​code>​ +
-<​code>​ +
-appender.rollingEmail.fileName = ${sys:​catalina.home}/​logs/​gwMail.log +
-appender.rollingEmail.filePattern = ${sys:​catalina.home}/​logs/​gwMail-%d{yyyy-MM-dd-HH-mm-ss}-%i.log +
-</​code>​ +
-<​code>​ +
-appender.rollingAccess.fileName = ${sys:​catalina.home}/​logs/​gwAccess.log +
-appender.rollingAccess.filePattern = ${sys:​catalina.home}/​logs/​gwAccess-%d{yyyy-MM-dd-HH-mm-ss}-%i.log +
-</​code>​ +
- +
-Eventualmente integrate ulteriori personalizzazione ​di progetto/​commessa. +
- +
- +
-===== Migrazione metadati ===== +
- +
-Nella 4.6.0-SNAPSHOT la mappa 2D è stata resa configurabile ​con un xml nel webadmin (come le mappe BIM) (issue #563). A tale scopo è stato aggiunto il campo **xml_map_mode (stringa, maxLenght 4000)** alla tabella dei metadati **gwm_maps**. +
-Quindi, tramite script del //​gw_resource_deployer//,​ o manualamente va eseguito lo script: +
- +
-<code sql> +
-ALTER TABLE [SCHEMA_NAME].GWM_MAPS ADD XML_MAP_MODE VARCHAR2(4000 BYTE); +
-</​code>​ +
- +
-I metadati ​che si riferiscono a versioni particolarmente vecchie possono essere importati ​dal **webadmin**,​ e venire automaticamente aggiustati, tramite gli appositi //​converters//​ che si preoccupano di effettuare il passaggio da una versione all'​altra+
- +
-Al momento non viene ancora gestito il popolamento automatico dell'​xml. Utilizzare quindi il template seguente: +
- +
-<code xml map_mode.xml>​ +
-<?xml version="​1.0"​ encoding="​UTF-8"?>​ +
-<mode name='​default'​ label='​Base Mode' icon='​defaultMapMode.png'>​ +
- <​mainToolbar>​ +
- <​buttonGroup name='​selection'​ /> +
- <​buttonGroup name='​navigation'​ /> +
- <​buttonGroup name='​info'​ /> +
- <​buttonGroup name='​refresh'​ /> +
- <​buttonGroup name='​report'​ /> +
- <​buttonGroup name='​googleStreetView'​ /> +
- <​buttonGroup name='​commandsTab'​ /> +
- </​mainToolbar>​ +
- <​tabList>​ +
- <tab type='​layers'​ name='​layers'​ label=''​ /> +
- <tab type='​baseMaps'​ name='​baseMaps'​ label=''​ /> +
- <tab type='​edit'​ name='​edit'​ label=''>​ +
- <​!--<​tabAttribute name='​cutCopyPasteToolbar'​ />​-->​ +
- <​tabAttribute name='​singleInsertToolbar'​ /> +
- <​tabAttribute name='​singleMultipleEditToolbar'​ /> +
- </​tab>​ +
- <​!--<​tab type='​furniture'​ name='​furniture'​ label=''​ />​-->​ +
- </​tabList>​ +
- <​properties>​ +
- <entry key="​showScaleLineControl"​ value="​true"​ /> +
- <entry key="​showScaleControl"​ value="​true"​ /> +
- <entry key="​showMousePositionControl"​ value="​true"​ /> +
- <entry key="​startWithMapSwitcherOpened"​ value="​true"​ /> +
- </​properties>​ +
-</​mode>​ +
-</​code>​ +
- +
-Il template ​va anche puntualmente configurato per decidere quali gruppi di bottoni, tab e controlli visualizzare e quali no. +
-In precedenza queste configurazioni erano globali ed impostatabili dall'​xml di progetto. Tutti quei tag vanno considerati **deprecati**:​ +
-<code xml> +
-<​mapSettings>​ +
-        <​showScaleLineControl>​true</​showScaleLineControl>​ +
-        <​showScaleControl>​true</​showScaleControl>​ +
-        <​showMousePositionControl>​true</​showMousePositionControl>​ +
-        <​showBaseMapChange>​true</​showBaseMapChange>​ +
-        <​showLayersManagement>​true</​showLayersManagement>​ +
-        <​showThematisms>​true</​showThematisms>​ +
-        <​showMapEditing>​true</​showMapEditing>​ +
-        <​startWithMapSwitcherOpened>​true</​startWithMapSwitcherOpened>​ +
-        ... +
-</​mapSettings>​ +
-</​code>​ +
- +
- +
-===== Note Migrazione ===== +
- +
-==== Download gw-webadmin war (Webadmin) ==== +
- +
-=== Release ufficiali === +
- +
-Il download dell'​applicazione gw-webadmin-X.Y.Z.war rilasciate è disponibile in artifactory a questo link (utilizzare le credenziali aziendali):​ +
- +
-http://​artifactory.geowebframework.com/​artifactory/​gw-release/​com/​geowebframework/​gw-webadmin/​**X.Y.Z**/​gw-webadmin-**X.Y.Z**.war +
- +
-dove al posto di X.Y.Z è necessario specificare la versione di geoweb rischiesta.  +
- +
-== Esempio webadmin versione 4.6.10 == +
- +
-[[http://​artifactory.geowebframework.com/​artifactory/​gw-release/​com/​geowebframework/​gw-webadmin/​4.6.10/​gw-webadmin-4.6.10.war]] +
- +
-=== HOTFIX === +
- +
-Nel caso straordinario in cui si richiede una versione hotfix la struttura del link è la seguente: +
- +
-http://​artifactory.geowebframework.com/​artifactory/​gw-hotfix/​com/​geowebframework/​gw-webadmin/​**X.Y.Z**-HOTFIX/​gw-webadmin-**X.Y.Z**-HOTFIX.war +
- +
-[[http://​artifactory.geowebframework.com/​artifactory/​gw-hotfix/​com/​geowebframework/​gw-webadmin/​4.6.11-HOTFIX/​gw-webadmin-4.6.11-HOTFIX.war]] +
-==== Workflow ==== +
-In presenza del modulo del workflow, //​Activiti//​ provvederà ​ad aggiornare le tabelle **act_***. In particolare viene aggiornata l'​informazione sulla version di activiti che passa da <​code>​5.17.0</​code> ​<​code>​5.23.0</​code>​.  +
- +
-**Questo renderà inutilizzabili eventuali applicativi webapp che puntano allo stesso database, e che sono versioni precedenti alla 4.6.X** +
- +
-==== Preferiti del browser ==== +
- +
-La pagina di login è passata da **login.html** a **loginPage.html**. +
-Nel caso in cui nei //​preferiti//,​ il link sia salvato con parti oltrelo / successivo al contesto, come per esempio +
-<​code>​ +
-[server]/​[nome_progetto]/​login.html +
-</​code>​ +
- +
-Modificare il link della voce dei preferiti, cosi: +
-<​code>​ +
-[server]/​[nome_progetto]/​ +
-</​code>​ +
- +
-==== File groovy ==== +
-Con il passaggio alla versione 4.6.0 del framework, c’è stato un’aggiornamento di librerie. +
-Vanno quindi allineati tutti i **file .groovy** che facevano riferimento alla vecchia versione. +
- +
-In <color #​ed1c24>​rosso</​color>​ i vecchi import, in <color #​22b14c>​verde</​color>​ i nuovi path per l’ import. +
- +
-=== log4j === +
-Era affetta da varie falle di sicurezza. Adesso viene utilizzato log4j2. +
- +
-<color #​ed1c24>​private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger("​com.geowebframework.groovy"​);</​color>​ +
- +
-<color #​22b14c>​private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger("​com.geowebframework.groovy"​);</​color>​ +
- +
----------------------------------------------------------- +
-<color #​ed1c24>​import org.apache.log4j.Logger;</​color>​ +
- +
-<color #​ed1c24>​…</​color>​ +
- +
-<color #​ed1c24>​private static final Logger log = Logger.getLogger("​com.geowebframework.groovy"​);</​color>​ +
----------------------------------------------------------- +
-<color #​22b14c>​import org.apache.logging.log4j.LogManager;</​color>​ +
- +
-<color #​22b14c>​import org.apache.logging.log4j.Logger;</​color>​ +
- +
-<color #​22b14c>​…</​color>​ +
- +
-<color #​22b14c>​private static Logger log = LogManager.getLogger("​com.geowebframework.groovy"​);</​color>​ +
- +
-Inoltre ora log4j 2 viene gestito come parametro sia String che CharSequence,​ quindi nei .groovy potrebbe generarsi l'​errore +
-<​code>​ +
-2023-01-23 16:​15:​06,​330 [ajp-nio-8019-exec-70] ERROR com.geowebframework.dataservice.service.GwClassListService - Ambiguous method overloading for method org.apache.logging.log4j.core.Logger#​warn. +
-Cannot resolve which method to invoke for [null, class java.lang.NullPointerException] due to overlapping prototypes between: +
-    [interface java.lang.CharSequence,​ class java.lang.Throwable] +
-    [interface org.apache.logging.log4j.message.Message,​ class java.lang.Throwable] +
-    [interface org.apache.logging.log4j.util.MessageSupplier,​ class java.lang.Throwable] +
-    [interface org.apache.logging.log4j.util.Supplier,​ class java.lang.Throwable] +
-groovy.lang.GroovyRuntimeException:​ Ambiguous method overloading for method org.apache.logging.log4j.core.Logger#​warn. +
-Cannot resolve which method to invoke for [null, class java.lang.NullPointerException] due to overlapping prototypes between: +
-    [interface java.lang.CharSequence,​ class java.lang.Throwable] +
-    [interface org.apache.logging.log4j.message.Message,​ class java.lang.Throwable] +
-    [interface org.apache.logging.log4j.util.MessageSupplier,​ class java.lang.Throwable] +
-    [interface org.apache.logging.log4j.util.Supplier,​ class java.lang.Throwable] +
-</​code>​ +
-in casi del tipo: +
-<​code>​ +
-log.warn(e.getMessage(),​ e); +
-</​code>​ +
-Da sostituire con: +
-<​code>​ +
-log.warn((String) e.getMessage(),​ e); +
-</​code>​ +
- +
-=== jackson === +
- +
-<color #​ed1c24>​import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;</​color>​ +
- +
-<color #​22b14c>​import com.fasterxml.jackson.annotation.JsonInclude.Include;</​color>​ +
- +
-----------------------------------------------------------+
    
-<color #​ed1c24>​import org.codehaus.jackson.map.JsonMappingException;</​color>​ +• Su mapguide Maestro andranno creati tanti SDF quanti sono i drawingType (regole di caricamento,​ divise per unità tecnologiche) all’interno del prodotto 
- +• I layer di sfondo andranno divisi e identificati all’interno di uno dei datasource creati nel punto precedente 
-<color #​22b14c>​import com.fasterxml.jackson.databind.JsonMappingException;</​color>​ +• A questo ​in fase di apertura della mappa (metodo setBackgroundFilter in MapguideService.java) saranno creati tanti dinamicamente tanti datasource quanti sono i drawingType facenti parte di quel layout (piano) selezionato
- +• La logica con cui viene generata la legenda laterale non sarà modificata, a meno che non si ricada nel caso che andremo a trattare a breve 
----------------------------------------------------------- +=== Caso Limite ​=== 
- +Il caso limite che andrà particolarmente attenzionato è il caso in cui si ha un layout al cui interno sono presenti più drawing ​di cui almeno due fanno parte dello stesso drawingType
-<color #​ed1c24>​import org.codehaus.jackson.type.TypeReference;</​color>​ +A questo punto devono ​essere ​creati dinamicamente due datasource analoghi che fanno riferimento allo stesso datasource fittizio. I layer che fanno riferimento a questo datasource di conseguenza dovranno essere individuati e duplicati
- +Nella legenda laterale dovranno essere raggruppati in cartelle ​layer che fanno riferimento a questo drawingType 
-<color #​22b14c>​import com.fasterxml.jackson.core.type.TypeReference;</​color>​ +==== Riconciliazione Dati Esistenti ==== 
- +A partire dalla versione 4.7.0 deve essere spostato il blob sdf dalla tabella gwd_layout alla gwd_drawing. Per fare questo deve essere eseguita una riconciliazione chiamando il metodo upgradeSDFToGwdDrawing direttamente dal browser. Ad esempio andando a scrivere nell’url del browser, ad esempio:
----------------------------------------------------------- +
- +
-<color #​ed1c24>​import org.codehaus.jackson.JsonGenerationException;</​color>​ +
- +
-<color #​22b14c>​import com.fasterxml.jackson.core.JsonGenerationException;</​color>​ +
- +
----------------------------------------------------------- +
- +
-<color #​ed1c24>​import org.codehaus.jackson.map.ObjectMapper;</​color>​ +
- +
-<color #​22b14c>​import com.fasterxml.jackson.databind.ObjectMapper;</​color>​ +
- +
- +
-=== JTS === +
- +
-in generale: +
- +
-<color #​ed1c24>​import com.vividsolutions.jts.*</​color>​ +
- +
-<color #​22b14c>​import org.locationtech.jts.*</​color>​ +
- +
----------------------------------------------------------- +
-<color #​ed1c24>​import com.vividsolutions.jts.geom.Geometry;</​color>​ +
- +
-<color #​22b14c>​import org.locationtech.jts.geom.Geometry;</​color>​ +
- +
----------------------------------------------------------- +
- +
-<color #​22b14c>​import org.locationtech.jts.geom.Coordinate;</​color>​ +
- +
-<color #​22b14c>​import org.locationtech.jts.geom.Geometry;</​color>​ +
- +
-<color #​22b14c>​import org.locationtech.jts.geom.GeometryCollection;</​color>​ +
- +
-<color #​22b14c>​import org.locationtech.jts.geom.GeometryFactory;</​color>​ +
- +
-<color #​22b14c>​import org.locationtech.jts.geom.LineString;</​color>​ +
- +
-<color #​22b14c>​import org.locationtech.jts.geom.LinearRing;</​color>​ +
- +
-<color #​22b14c>​import org.locationtech.jts.geom.MultiLineString;</​color>​ +
- +
-<color #​22b14c>​import org.locationtech.jts.geom.MultiPoint;</​color>​ +
- +
-<color #​22b14c>​import org.locationtech.jts.geom.MultiPolygon;</​color>​ +
- +
-<color #​22b14c>​import org.locationtech.jts.geom.Point;</​color>​ +
- +
-<color #​22b14c>​import org.locationtech.jts.geom.Polygon;</​color>​ +
- +
-<color #​22b14c>​import org.locationtech.jts.geom.Coordinate;</​color>​ +
- +
-<color #​22b14c>​import org.locationtech.jts.geom.Envelope;</​color>​ +
- +
- +
-==== Report ==== +
-La libreria di JasperReports **6.20.1**. E' consigliabile utilizzare per la gestione dei file //.jasper// l'​ultimo [[https://​community.jaspersoft.com/​project/​jaspersoft-studio/​releases|Jaspersoft Studio]]. +
- +
-Il passaggio a **java 11**, ha portato con se il definito superamento ​di una serie di classi che erano da tempo state marchiate come deprecate, e che adesso sono inutilizzabili+
- +
-In particolare,​ in alcune implementazioni di report, posoono ​essere ​stati utilizzati costrutti non piu funzionanti,​ in particolare ​che fanno riferimento a metodi della **class java.util.Date**+
- +
-Vanno quindi allineati tutti **file .jrxml** ​che facevano ​riferimento a metodi non più supportati. +
- +
-In <color #​ed1c24>​rosso</​color>​ esempi di vecchio codice, in <color #​22b14c>​verde</​color>​ il nuovo equivalente. +
- +
- +
-=== java.util.Date format() ​=== +
- +
-risorse utili: +
-  * [[https://​www.baeldung.com/​java-8-date-time-intro|java-8-date-time-intro]] +
-  * [[https://​mkyong.com/​java8/​java-8-how-to-format-localdatetime/​|java-8-how-to-format-localdatetime]]+
  
-<color #​ed1c24><​textFieldExpression><​![CDATA["​PRENOTAZIONI DI OGGI " + new java.util.Date().format('​EEEE dd-MM-yyyy'​)]]><​/textFieldExpression><​/color>+http://prm.svil.gwcloud.it/spm/upgradeSDFToGwdDrawing
  
-<color #​22b14c><​textFieldExpression><​![CDATA["​PRENOTAZIONI DI OGGI " +  +L’operazione di riconciliazione è semplice nel caso in cui ogni layout abbia un solo drawing al suo interno, mentre è più lunga e complicata nel caso di più drawing all’ìnterno del layout: il metodo dovrà andare a splittare ogni sdf in base al pk_drawing di ogni geometria al suo interno e andare a formare tanti sdf diversi quanti sono i drawing all’interno del layout, impiegando fino ad alcuni minuti nel caso di sdf particolarmente complessi
- ​java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("​EEEE dd-MM-yyyy"​))]]></​textFieldExpression></​color>​+
  
  • gwusermanual/migration_to_4_7_x.1719503219.txt.gz
  • Ultima modifica: 2024/06/27 17:46
  • da francesco.peverini