dg1cloud-core/pom.xml
.. .. @@ -33,7 +33,6 @@ 33 33 <dependency> 34 34 <groupId>org.flywaydb</groupId> 35 35 <artifactId>flyway-core</artifactId> 36 - <version>4.0.1</version>37 36 </dependency> 38 37 39 38 <dependency> .. .. @@ -71,6 +70,16 @@ 71 70 </dependency> 72 71 73 72 <dependency> 73 + <groupId>org.springframework.ws</groupId>74 + <artifactId>spring-ws-core</artifactId>75 + </dependency>76 +77 + <dependency>78 + <groupId>org.springframework.ws</groupId>79 + <artifactId>spring-ws-security</artifactId>80 + </dependency>81 +82 + <dependency>74 83 <groupId>org.apache.httpcomponents</groupId> 75 84 <artifactId>httpclient</artifactId> 76 85 </dependency> .. .. @@ -98,10 +107,10 @@ 98 107 </dependency> 99 108 100 109 <dependency> 101 - <groupId>commons-codec</groupId>102 - <artifactId>commons-codec</artifactId>110 + <groupId>org.webjars</groupId>111 + <artifactId>webjars-locator</artifactId>112 + <version>0.34</version>103 113 </dependency> 104 -105 114 <!-- bootstrap and jquery --> 106 115 <dependency> 107 116 <groupId>org.webjars</groupId> .. .. @@ -118,11 +127,49 @@ 118 127 119 128 <build> 120 129 <finalName>${project.artifactId}</finalName> 130 + <resources>131 + <resource>132 + <directory>src/main/java</directory>133 + <includes>134 + <include>**/*.properties</include>135 + <include>**/*.sql</include>136 + </includes>137 + </resource>138 + <resource>139 + <directory>src/main/resource</directory>140 + <includes>141 + <include>application.properties</include>142 + </includes>143 + </resource>144 + </resources>121 145 <plugins> 122 146 <plugin> 123 147 <groupId>org.springframework.boot</groupId> 124 148 <artifactId>spring-boot-maven-plugin</artifactId> 125 149 </plugin> 150 + <!-- tag::wsdl[] -->151 + <plugin>152 + <groupId>org.jvnet.jaxb2.maven2</groupId>153 + <artifactId>maven-jaxb2-plugin</artifactId>154 + <version>0.14.0</version>155 + <executions>156 + <execution>157 + <goals>158 + <goal>generate</goal>159 + </goals>160 + </execution>161 + </executions>162 + <configuration>163 + <schemaLanguage>WSDL</schemaLanguage>164 + <generatePackage>it.isharedoc.schemas.instance</generatePackage>165 + <schemas>166 + <schema>167 + <url>https://democorepa3.grupposistematica.it/isharedoc/webservices/webserviceInstance3.wsdl</url>168 + </schema>169 + </schemas>170 + </configuration>171 + </plugin>172 + <!-- end::wsdl[] -->126 173 </plugins> 127 174 </build> 128 175 dg1cloud-core/src/main/java/it/digione/dg1cloud/config/dg1cloud.properties
.. .. @@ -15,7 +15,16 @@ 15 15 16 16 external.server.address.base.url=http://vannux.grupposistematica.it:8080/dg1cloud 17 17 18 -google.recaptcha.enabled=false18 +google.recaptcha.enabled=true19 19 google.recaptcha.url=https://www.google.com/recaptcha/api/siteverify 20 20 google.recaptcha.key=6LfCHmkUAAAAAFa1KmVtPFecItBriBHx1qmKHcVS 21 -google.recaptcha.secret=6LfCHmkUAAAAAKXdXWO36daHnItKQwkEvXOpX6YY21 +google.recaptcha.secret=6LfCHmkUAAAAAKXdXWO36daHnItKQwkEvXOpX6YY22 +23 +isharedoc.ws.endpoint.instance=https://democorepa3.grupposistematica.it/isharedoc/webservices/webserviceInstance3.wsdl24 +isharedoc.ws.username=admin25 +isharedoc.ws.password=sistematica10026 +isharedoc.ws.urp.puid=010927 +isharedoc.ws.urp.mbox=URP28 +isharedoc.ws.urp.storyboad=URP29 +isharedoc.ws.urp.metaviewname=URP30 +isharedoc.ws.urp.direction=INdg1cloud-core/src/main/java/it/digione/dg1cloud/controller/DownloadController.java
.. .. @@ -10,8 +10,8 @@ 10 10 import org.springframework.web.bind.annotation.RequestParam; 11 11 import org.springframework.web.servlet.ModelAndView; 12 12 13 +import it.digione.dg1cloud.form.DownloadFileCaptchaForm;13 14 import it.digione.dg1cloud.recaptcha.CaptchaSettings; 14 -import it.digione.dg1cloud.recaptcha.DownloadFileCaptchaForm;15 15 16 16 @Controller 17 17 public class DownloadController { dg1cloud-core/src/main/java/it/digione/dg1cloud/recaptcha/DownloadFileCaptchaController.javasimilarity index 93%rename from dg1cloud-core/src/main/java/it/digione/dg1cloud/recaptcha/DownloadFileCaptchaController.javarename to dg1cloud-core/src/main/java/it/digione/dg1cloud/controller/DownloadFileCaptchaController.java
.. .. @@ -1,4 +1,4 @@ 1 -package it.digione.dg1cloud.recaptcha;1 +package it.digione.dg1cloud.controller;2 2 3 3 import java.io.FileNotFoundException; 4 4 .. .. @@ -12,6 +12,7 @@ 12 12 import org.springframework.web.bind.annotation.RequestMapping; 13 13 import org.springframework.web.servlet.ModelAndView; 14 14 15 +import it.digione.dg1cloud.form.DownloadFileCaptchaForm;15 16 import it.digione.dg1cloud.service.Utils; 16 17 17 18 @Controller dg1cloud-core/src/main/java/it/digione/dg1cloud/controller/StartURPController.java
.. .. @@ -0,0 +1,78 @@ 1 +package it.digione.dg1cloud.controller;2 +3 +import javax.validation.Valid;4 +import javax.xml.bind.JAXBElement;5 +6 +import org.springframework.beans.factory.annotation.Autowired;7 +import org.springframework.stereotype.Controller;8 +import org.springframework.validation.BindingResult;9 +import org.springframework.web.bind.annotation.ControllerAdvice;10 +import org.springframework.web.bind.annotation.ModelAttribute;11 +import org.springframework.web.bind.annotation.PostMapping;12 +import org.springframework.web.bind.annotation.RequestMapping;13 +import org.springframework.web.servlet.ModelAndView;14 +15 +import it.digione.dg1cloud.form.StartURPForm;16 +import it.digione.dg1cloud.ws.client.SOAPConnector;17 +import it.digione.dg1cloud.ws.client.isd.IsdProperties;18 +import it.digione.dg1cloud.ws.client.isd.IsdConfig;19 +import it.isharedoc.schemas.instance.InstanceMessageCreateRequest;20 +import it.isharedoc.schemas.instance.ObjectFactory;21 +22 +@ControllerAdvice23 +@Controller24 +public class StartURPController {25 +26 + @Autowired IsdProperties isdProperties;27 + @Autowired IsdConfig isdConfig;28 +29 + @ModelAttribute("startURPForm")30 + public StartURPForm startURPForm() {31 + return new StartURPForm();32 + }33 +34 + @RequestMapping("/startURP")35 + public String startURP() {36 + return "startURP";37 + }38 + @PostMapping("/sendStartRequest")39 + public Object sendStartRequest(@ModelAttribute("startURPForm") @Valid StartURPForm form,40 + BindingResult result) {41 +42 + ModelAndView modelAndView;43 + if (result.hasErrors()){44 + modelAndView = new ModelAndView("startURP");45 + modelAndView.addObject(result);46 + modelAndView.addObject("startURPForm", form);47 + modelAndView.addObject("message", "Impossibbile inviare la richiesta");48 + modelAndView.addObject("alertClass", "alert-danger");49 + return modelAndView;50 + } else {51 + modelAndView = new ModelAndView("startURP");52 +53 + InstanceMessageCreateRequest imcr = createInstanceMessageCreateRequest(form);54 + SOAPConnector soapConnector = isdConfig.soapConnector(isdConfig.marshaller(), isdConfig.wsSecurityInterceptor());55 + System.out.println(soapConnector.callWebService(soapConnector.getDefaultUri(), imcr));56 +57 + modelAndView.addObject("message", "Richiesta inviata con successo");58 + modelAndView.addObject("alertClass", "alert-success");59 + return modelAndView;60 + }61 +62 + }63 +64 + private InstanceMessageCreateRequest createInstanceMessageCreateRequest( StartURPForm startURPForm ) {65 +66 + ObjectFactory factory = new ObjectFactory();67 +68 + InstanceMessageCreateRequest request = new InstanceMessageCreateRequest();69 +70 + request.setPartitionPuid(isdProperties.getUrp().getPuid());71 + request.setMessageBoxCode(isdProperties.getUrp().getMbox());72 + request.setStoryboardCode(isdProperties.getUrp().getStoryboad());73 +74 + request.setMetaViewName(factory.createInstanceMessageCreateRequestMetaViewName(isdProperties.getUrp().getMetaviewname()));75 +76 + return null;77 + }78 +}dg1cloud-core/src/main/java/it/digione/dg1cloud/recaptcha/DownloadFileCaptchaForm.javasimilarity index 90%rename from dg1cloud-core/src/main/java/it/digione/dg1cloud/recaptcha/DownloadFileCaptchaForm.javarename to dg1cloud-core/src/main/java/it/digione/dg1cloud/form/DownloadFileCaptchaForm.java
.. .. @@ -1,8 +1,10 @@ 1 -package it.digione.dg1cloud.recaptcha;1 +package it.digione.dg1cloud.form;2 2 3 3 import javax.validation.constraints.NotEmpty; 4 4 import javax.validation.constraints.NotNull; 5 5 6 +import it.digione.dg1cloud.recaptcha.ValidReCaptcha;7 +6 8 public class DownloadFileCaptchaForm { 7 9 8 10 @NotNull dg1cloud-core/src/main/java/it/digione/dg1cloud/form/StartURPForm.java
.. .. @@ -0,0 +1,54 @@ 1 +package it.digione.dg1cloud.form;2 +3 +import javax.validation.constraints.NotEmpty;4 +import javax.validation.constraints.NotNull;5 +6 +import org.springframework.web.multipart.MultipartFile;7 +8 +import it.digione.dg1cloud.recaptcha.ValidReCaptcha;9 +10 +public class StartURPForm {11 +12 + @NotEmpty13 + private String mittente;14 + @NotEmpty15 + private String oggetto;16 + @NotEmpty17 + private String corpo;18 + @NotEmpty19 + @ValidReCaptcha20 + private String reCaptchaResponse;21 + @NotNull22 + private MultipartFile allegato;23 +24 + public String getMittente() {25 + return mittente;26 + }27 + public void setMittente(String mittente) {28 + this.mittente = mittente;29 + }30 + public String getOggetto() {31 + return oggetto;32 + }33 + public void setOggetto(String oggetto) {34 + this.oggetto = oggetto;35 + }36 + public String getCorpo() {37 + return corpo;38 + }39 + public void setCorpo(String corpo) {40 + this.corpo = corpo;41 + }42 + public String getReCaptchaResponse() {43 + return reCaptchaResponse;44 + }45 + public void setReCaptchaResponse(String reCaptchaResponse) {46 + this.reCaptchaResponse = reCaptchaResponse;47 + }48 + public MultipartFile getAllegato() {49 + return allegato;50 + }51 + public void setAllegato(MultipartFile allegato) {52 + this.allegato = allegato;53 + }54 +}dg1cloud-core/src/main/java/it/digione/dg1cloud/ws/client/SOAPConnector.java
.. .. @@ -0,0 +1,10 @@ 1 +package it.digione.dg1cloud.ws.client;2 +3 +import org.springframework.ws.client.core.support.WebServiceGatewaySupport;4 +5 +public class SOAPConnector extends WebServiceGatewaySupport {6 +7 + public Object callWebService(String url, Object request){8 + return getWebServiceTemplate().marshalSendAndReceive(url, request);9 + }10 +}dg1cloud-core/src/main/java/it/digione/dg1cloud/ws/client/isd/IsdConfig.java
.. .. @@ -0,0 +1,47 @@ 1 +package it.digione.dg1cloud.ws.client.isd;2 +3 +import org.apache.wss4j.dom.WSConstants;4 +import org.springframework.beans.factory.annotation.Autowired;5 +import org.springframework.context.annotation.Bean;6 +import org.springframework.context.annotation.Configuration;7 +import org.springframework.oxm.jaxb.Jaxb2Marshaller;8 +import org.springframework.ws.client.support.interceptor.ClientInterceptor;9 +import org.springframework.ws.soap.security.wss4j2.Wss4jSecurityInterceptor;10 +11 +import it.digione.dg1cloud.ws.client.SOAPConnector;12 +13 +@Configuration14 +public class IsdConfig {15 +16 + @Autowired IsdProperties isdProperties;17 +18 + @Bean19 + public Jaxb2Marshaller marshaller() {20 + Jaxb2Marshaller marshaller = new Jaxb2Marshaller();21 + marshaller.setContextPath("it.isharedoc.schemas.instance");22 + return marshaller;23 + }24 +25 + @Bean26 + public Wss4jSecurityInterceptor wsSecurityInterceptor() {27 + Wss4jSecurityInterceptor wss4jSecurityInterceptor = new Wss4jSecurityInterceptor();28 + wss4jSecurityInterceptor.setSecurementActions(WSConstants.USERNAME_TOKEN_LN);29 + wss4jSecurityInterceptor.setSecurementUsername(isdProperties.getUsername());30 + wss4jSecurityInterceptor.setSecurementPassword(isdProperties.getPassword());31 + wss4jSecurityInterceptor.setSecurementPasswordType(WSConstants.PW_TEXT);32 + wss4jSecurityInterceptor.setSecurementUsernameTokenNonce(true);33 + return wss4jSecurityInterceptor;34 + }35 +36 + @Bean37 + public SOAPConnector soapConnector(Jaxb2Marshaller marshaller, Wss4jSecurityInterceptor wsSecurityInterceptor) {38 + SOAPConnector client = new SOAPConnector();39 + client.setDefaultUri(isdProperties.getEndpoint().getInstance());40 + client.setMarshaller(marshaller);41 + client.setUnmarshaller(marshaller);42 + ClientInterceptor[] interceptors = new ClientInterceptor[1];43 + interceptors[0] = wsSecurityInterceptor;44 + client.setInterceptors(interceptors);45 + return client;46 + }47 +}dg1cloud-core/src/main/java/it/digione/dg1cloud/ws/client/isd/IsdProperties.java
.. .. @@ -0,0 +1,114 @@ 1 +package it.digione.dg1cloud.ws.client.isd;2 +3 +import org.springframework.boot.context.properties.ConfigurationProperties;4 +import org.springframework.stereotype.Component;5 +6 +@Component7 +@ConfigurationProperties("isharedoc.ws")8 +public class IsdProperties {9 +10 + private Endpoint endpoint;11 + private Urp urp;12 + private String username;13 + private String password;14 +15 + public Endpoint getEndpoint() {16 + return endpoint;17 + }18 + public void setEndpoint(Endpoint endpoint) {19 + this.endpoint = endpoint;20 + }21 + public Urp getUrp() {22 + return urp;23 + }24 + public void setUrp(Urp urp) {25 + this.urp = urp;26 + }27 + public String getUsername() {28 + return username;29 + }30 + public void setUsername(String username) {31 + this.username = username;32 + }33 + public String getPassword() {34 + return password;35 + }36 + public void setPassword(String password) {37 + this.password = password;38 + }39 + @Override40 + public String toString() {41 + return "IsdProperties{" +42 + "username='" + username + "'," +43 + "endpoint=" + endpoint + "," +44 + "urp=" + urp +45 + "}";46 + }47 +48 + public static class Endpoint {49 +50 + private String instance;51 + public String getInstance() {52 + return instance;53 + }54 + public void setInstance(String instance) {55 + this.instance = instance;56 + }57 +58 + @Override59 + public String toString() {60 + return "Endpoint{" +61 + "instance='" + instance + "'" +62 + "}";63 + }64 + }65 +66 + public static class Urp {67 +68 + private String puid;69 + private String mbox;70 + private String storyboad;71 + private String metaviewname;72 + private String direction;73 + public String getPuid() {74 + return puid;75 + }76 + public void setPuid(String puid) {77 + this.puid = puid;78 + }79 + public String getMbox() {80 + return mbox;81 + }82 + public void setMbox(String mbox) {83 + this.mbox = mbox;84 + }85 + public String getStoryboad() {86 + return storyboad;87 + }88 + public void setStoryboad(String storyboad) {89 + this.storyboad = storyboad;90 + }91 + public String getMetaviewname() {92 + return metaviewname;93 + }94 + public void setMetaviewname(String metaviewname) {95 + this.metaviewname = metaviewname;96 + }97 + public String getDirection() {98 + return direction;99 + }100 + public void setDirection(String direction) {101 + this.direction = direction;102 + }103 + @Override104 + public String toString() {105 + return "Urp{" +106 + "puid='" + puid + "'," +107 + "mbox='" + mbox + "'," +108 + "storyboad='" + storyboad + "'," +109 + "metaviewname='" + metaviewname + "'," +110 + "direction='" + direction + "'" +111 + "}";112 + }113 + }114 +}dg1cloud-core/src/main/resources/application.properties
.. .. @@ -1,6 +1,6 @@ 1 1 spring.datasource.url=jdbc:postgresql://localhost:5432/dg1cloud 2 -#spring.datasource.username=postgres3 -#spring.datasource.password=passero2 +spring.datasource.username=postgres3 +spring.datasource.password=passero4 4 spring.datasource.driver-class-name=org.postgresql.Driver 5 5 spring.datasource.tomcat.initial-size=10 6 6 spring.datasource.tomcat.max-wait=30000 .. .. @@ -17,5 +17,8 @@ 17 17 spring.jmx.default-domain=dg1cloud 18 18 19 19 #server.address=vannux.grupposistematica.it 20 +server.error.include-stacktrace=always20 21 21 -logging.level.it.digione.dg1cloud=DEBUG22 +logging.level.it.digione.dg1cloud=DEBUG23 +24 +logging.level.org.springframework.ws=TRACEdg1cloud-core/src/main/resources/templates/downloadFileCaptcha.html
.. .. @@ -6,7 +6,6 @@ 6 6 <meta name="viewport" content="width=device-width, initial-scale=1"/> 7 7 8 8 <link rel="stylesheet" type="text/css" th:href="@{/webjars/bootstrap/3.3.7/css/bootstrap.min.css}"/> 9 - <link rel="stylesheet" type="text/css" th:href="@{/css/main.css}"/>10 9 11 10 <title>Link download file</title> 12 11 <script src='https://www.google.com/recaptcha/api.js'></script> dg1cloud-core/src/main/resources/templates/error.html
.. .. @@ -0,0 +1,43 @@ 1 +<!DOCTYPE html>2 +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">3 +<head>4 + <style>5 + table td{6 + vertical-align:top;7 + border:solid 1px #888;8 + padding:10px;9 + }10 + </style>11 +</head>12 +<body>13 +<h1>Si è verificato un errore</h1>14 +<table>15 + <tr>16 + <td>Data</td>17 + <td th:text="${timestamp}"/>18 + </tr>19 + <tr>20 + <td>percorso</td>21 + <td th:text="${path}"/>22 + </tr>23 + <tr>24 + <td>Errore</td>25 + <td th:text="${error}"/>26 + </tr>27 + <tr>28 + <td>Stato</td>29 + <td th:text="${status}"/>30 + </tr>31 + <tr>32 + <td>Messaggio</td>33 + <td th:text="${message}"/>34 + </tr>35 + <tr>36 + <td>Trace</td>37 + <td>38 + <pre th:text="${trace}"></pre>39 + </td>40 + </tr>41 +</table>42 +</body>43 +</html>dg1cloud-core/src/main/resources/templates/startURP.html
.. .. @@ -0,0 +1,71 @@ 1 +<!DOCTYPE html>2 +<html xmlns:th="http://www.thymeleaf.org">3 + <head>4 + <meta charset="utf-8"/>5 + <meta http-equiv="X-UA-Compatible" content="IE=edge"/>6 + <meta name="viewport" content="width=device-width, initial-scale=1"/>7 +8 + <link rel="stylesheet" type="text/css" th:href="@{/webjars/bootstrap/3.3.7/css/bootstrap.min.css}"/>9 +10 + <title>Avvia istanza URP</title>11 + <script src='https://www.google.com/recaptcha/api.js'></script>12 + </head>13 + <body>14 + <div class="container">15 + <div class="row">16 + <div class="col-md-4 col-md-offset-4">17 + <div class="panel panel-default">18 + <div class="panel-body">19 + <div class="text-center">20 + <h3><i class="glyphicon glyphicon-inbox" style="font-size:2em;"></i></h3>21 + <h2 class="text-center" style="word-wrap: break-word;" th:text="'Avvia istanza URP'"></h2>22 + <div class="panel-body">23 + <form data-toggle="validator" action="#"24 + th:action="@{/sendStartRequest}" th:object="${startURPForm}"25 + method="post" role="form"26 + enctype="multipart/form-data" >27 + <div th:if="${message}" th:text="${message}" th:class="${'alert ' + alertClass}"></div>28 + <div class="form-group">29 + <label for="mittente" class="control-label">Mittente*</label>30 + <input type="email" class="form-control" th:field="*{mittente}" required placeholder="Email mittente" />31 + <p th:if="${#fields.hasErrors('mittente')}">Email mittente mancante</p>32 + </div>33 + <div class="form-group">34 + <label for="oggetto" class="control-label">Oggetto*</label>35 + <input type="text" class="form-control" th:field="*{oggetto}" required />36 + <p th:if="${#fields.hasErrors('oggetto')}">Compilare l'oggetto della richiesta</p>37 + </div>38 + <div class="form-group">39 + <label for="oggetto" class="control-label">Richiesta*</label>40 + <textarea rows="5" class="form-control" th:field="*{corpo}" required ></textarea>41 + <p th:if="${#fields.hasErrors('corpo')}">Scrivere il corpo della richiesta</p>42 + </div>43 + <div class="form-group">44 + <label for="allegato" class="control-label">Allegato richiesta*</label>45 + <input type="file" class="form-control" th:field="*{allegato}" required ></input>46 + <p th:if="${#fields.hasErrors('allegato')}">Inserire un allegato</p>47 + <p class="error-message"48 + th:each="error: ${#fields.errors('allegato')}"49 + th:text="${error}"></p>50 + </div>51 + <div class="form-group">52 + <div class="g-recaptcha" th:attr="data-sitekey=${@captchaSettings.getKey()}"></div>53 + <p class="error-message"54 + th:each="error: ${#fields.errors('reCaptchaResponse')}"55 + th:text="'Errore validazione reCaptcha'"></p>56 + </div>57 + <div class="form-group">58 + <button name="Invia richiesta" type="submit" th:text="'Invia richiesta'"></button>59 + </div>60 + </form>61 + </div>62 + </div>63 + </div>64 + </div>65 + </div>66 + </div>67 + </div>68 + <script type="text/javascript" th:src="@{/webjars/jquery/3.2.1/jquery.min.js/}"></script>69 + <script type="text/javascript" th:src="@{/webjars/bootstrap/3.3.7/js/bootstrap.min.js}"></script>70 + </body>71 +</html>dg1cloud-core/src/test/java/it/digione/cloud/Dg1cloudCoreApplicationTests.javadeleted file mode 100644
.. .. @@ -1,22 +0,0 @@ 1 -package it.digione.cloud;2 -3 -import org.junit.Test;4 -import org.junit.runner.RunWith;5 -import org.springframework.beans.factory.annotation.Autowired;6 -import org.springframework.boot.test.context.SpringBootTest;7 -import org.springframework.test.context.junit4.SpringRunner;8 -9 -import it.digione.dg1cloud.app.Dg1cloudCoreApplication;10 -import it.digione.dg1cloud.service.CleanerService;11 -12 -@RunWith(SpringRunner.class)13 -@SpringBootTest(classes = Dg1cloudCoreApplication.class)14 -public class Dg1cloudCoreApplicationTests {15 -16 - @Autowired CleanerService cleanerService;17 - @Test18 - public void contextLoads() {19 - cleanerService.cleanEmptyStorageFolder();20 - }21 -22 -}