ContentReader.java
- /*
- * GovWay - A customizable API Gateway
- * https://govway.org
- *
- * Copyright (c) 2005-2025 Link.it srl (https://link.it).
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3, as published by
- * the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
- package org.openspcoop2.pdd.core.dynamic;
- import java.io.ByteArrayOutputStream;
- import org.openspcoop2.message.OpenSPCoop2Message;
- import org.openspcoop2.message.constants.MessageRole;
- import org.openspcoop2.message.constants.MessageType;
- import org.openspcoop2.message.constants.ServiceBinding;
- import org.openspcoop2.message.rest.DumpRestMessageUtils;
- import org.openspcoop2.message.soap.DumpSoapMessageUtils;
- import org.openspcoop2.message.soap.TunnelSoapUtils;
- import org.openspcoop2.message.soap.reader.OpenSPCoop2MessageSoapStreamReader;
- import org.openspcoop2.message.utils.DumpMessaggio;
- import org.openspcoop2.message.utils.DumpMessaggioConfig;
- import org.openspcoop2.pdd.core.GestoreCorrelazioneApplicativa;
- import org.openspcoop2.protocol.sdk.Context;
- import org.openspcoop2.utils.digest.DigestEncoding;
- import org.slf4j.Logger;
- /**
- * ContentReader
- *
- * @author Andrea Poli (apoli@link.it)
- * @author $Author$
- * @version $Rev$, $Date$
- */
- public class ContentReader {
- protected static final String FUNZIONALITA_RICHIEDE_SOAP = "Funzionalità utilizzabile solamente con service binding soap";
- protected static final String FUNZIONALITA_RICHIEDE_JSON = "Funzionalità richiede un messaggio JSON";
- protected static final String FUNZIONALITA_RICHIEDE_XML = "Funzionalità richiede un messaggio XML";
-
- protected Logger log;
-
- protected OpenSPCoop2Message message;
-
- protected Context pddContext;
- public ContentReader(OpenSPCoop2Message message, Context pddContext, Logger log) {
- this.message = message;
- this.pddContext = pddContext;
- this.log = log;
- }
- public String getApplicationMessageId() {
- boolean request = this.message==null ||
- this.message.getMessageRole()==null ||
- MessageRole.NONE.equals(this.message.getMessageRole()) ||
- MessageRole.REQUEST.equals(this.message.getMessageRole());
- if(request) {
- if(this.pddContext!=null && this.pddContext.containsKey(GestoreCorrelazioneApplicativa.CONTEXT_CORRELAZIONE_APPLICATIVA_RICHIESTA)) {
- return (String) this.pddContext.get(GestoreCorrelazioneApplicativa.CONTEXT_CORRELAZIONE_APPLICATIVA_RICHIESTA);
- }
- }
- else {
- if(this.pddContext!=null && this.pddContext.containsKey(GestoreCorrelazioneApplicativa.CONTEXT_CORRELAZIONE_APPLICATIVA_RISPOSTA)) {
- return (String) this.pddContext.get(GestoreCorrelazioneApplicativa.CONTEXT_CORRELAZIONE_APPLICATIVA_RISPOSTA);
- }
- }
- return null;
- }
-
-
- public OpenSPCoop2Message getMessage() {
- return this.message; // questo metodo consente di attuare trasformazione più avanzate agendo sull'oggetto
- }
-
- public boolean isSoap() {
- if(this.message==null) {
- return false;
- }
- return ServiceBinding.SOAP.equals(this.message.getServiceBinding());
- }
- public boolean isSoap11() {
- if(this.message==null || this.message.getMessageType()==null) {
- return false;
- }
- return MessageType.SOAP_11.equals(this.message.getMessageType());
- }
- public boolean isSoap12() {
- if(this.message==null || this.message.getMessageType()==null) {
- return false;
- }
- return MessageType.SOAP_12.equals(this.message.getMessageType());
- }
-
- public boolean isRest() {
- if(this.message==null) {
- return false;
- }
- return ServiceBinding.REST.equals(this.message.getServiceBinding());
- }
- public boolean isRestXml() {
- if(this.message==null || this.message.getMessageType()==null) {
- return false;
- }
- return MessageType.XML.equals(this.message.getMessageType());
- }
- public boolean isRestJson() {
- if(this.message==null || this.message.getMessageType()==null) {
- return false;
- }
- return MessageType.JSON.equals(this.message.getMessageType());
- }
- public boolean isRestMultipart() {
- if(this.message==null || this.message.getMessageType()==null) {
- return false;
- }
- return MessageType.MIME_MULTIPART.equals(this.message.getMessageType());
- }
- public boolean isRestBinary() {
- if(this.message==null || this.message.getMessageType()==null) {
- return false;
- }
- return MessageType.BINARY.equals(this.message.getMessageType());
- }
-
-
- public boolean isHasContent() throws DynamicException {
- // per invocazioni dinamiche
- return this.hasContent();
- }
- public boolean hasContent() throws DynamicException {
- try {
- if(this.message==null) {
- return false;
- }
- if(ServiceBinding.SOAP.equals(this.message.getServiceBinding())) {
- return this.message.castAsSoap().getSOAPPart()!=null && this.message.castAsSoap().getSOAPPart().getEnvelope()!=null;
- }
- else {
- return this.message.castAsRest().hasContent();
- }
- }catch(Exception t) {
- throw new DynamicException(t.getMessage(),t);
- }
- }
- public byte[] getContent() throws DynamicException {
- byte [] content = null;
- if(!this.hasContent()) {
- content = null;
- }
- else {
- try {
- if(ServiceBinding.SOAP.equals(this.message.getServiceBinding())) {
- ByteArrayOutputStream bout = new ByteArrayOutputStream();
- this.message.castAsSoap().writeTo(bout, false);
- bout.flush();
- bout.close();
- content = bout.toByteArray();
- }
- else {
- /** non viene preservato il charset, es il test org.openspcoop2.pdd.core.trasformazioni.Test fallisce: Test [zip-json] (charset: ISO-8859-1) ... nei caratteri strani
- return this.message.castAsRest().getContentAsByteArray(); */
- content = this.message.castAsRest().getContentAsString().getBytes();
- }
- }catch(Exception t) {
- throw new DynamicException(t.getMessage(),t);
- }
- }
- return content;
- }
- public String getContentAsString() throws DynamicException {
- if(!this.hasContent()) {
- return null;
- }
- try {
- if(ServiceBinding.SOAP.equals(this.message.getServiceBinding())) {
- ByteArrayOutputStream bout = new ByteArrayOutputStream();
- this.message.castAsSoap().writeTo(bout, false);
- bout.flush();
- bout.close();
- return bout.toString();
- }
- else {
- return this.message.castAsRest().getContentAsString();
- }
- }catch(Exception t) {
- throw new DynamicException(t.getMessage(),t);
- }
- }
- public String getContentBase64Digest(String algorithm) throws DynamicException{
- return getContentDigest(algorithm, DigestEncoding.BASE64, false);
- }
- public String getContentBase64Digest(String algorithm, String rfc3230) throws DynamicException{
- // // per invocazioni dinamiche
- boolean v = false;
- try {
- v = Boolean.valueOf(rfc3230);
- }catch(Exception e) {
- throw new DynamicException(this.buildUncorrectBooleaValueMessage(rfc3230, e),e);
- }
- return getContentBase64Digest(algorithm, v);
- }
- public String getContentBase64Digest(String algorithm, boolean rfc3230) throws DynamicException{
- return getContentDigest(algorithm, DigestEncoding.BASE64, rfc3230);
- }
-
- public String getContentHexDigest(String algorithm) throws DynamicException{
- return getContentDigest(algorithm, DigestEncoding.HEX, false);
- }
- public String getContentHexDigest(String algorithm, String rfc3230) throws DynamicException{
- // // per invocazioni dinamiche
- boolean v = false;
- try {
- v = Boolean.valueOf(rfc3230);
- }catch(Exception e) {
- throw new DynamicException(this.buildUncorrectBooleaValueMessage(rfc3230, e),e);
- }
- return getContentHexDigest(algorithm, v);
- }
- public String getContentHexDigest(String algorithm, boolean rfc3230) throws DynamicException{
- return getContentDigest(algorithm, DigestEncoding.HEX, rfc3230);
- }
-
- public String getContentDigest(String algorithm, String digestEncodingParam) throws DynamicException{
- return getContentDigest(algorithm, digestEncodingParam, false);
- }
- public String getContentDigest(String algorithm, DigestEncoding digestEncoding) throws DynamicException{
- return getContentDigest(algorithm, digestEncoding, false);
- }
- public String getContentDigest(String algorithm, String digestEncodingParam, String rfc3230) throws DynamicException{
- // // per invocazioni dinamiche
- boolean v = false;
- try {
- v = Boolean.valueOf(rfc3230);
- }catch(Exception e) {
- throw new DynamicException(this.buildUncorrectBooleaValueMessage(rfc3230, e),e);
- }
- return getContentDigest(algorithm, digestEncodingParam, v);
- }
- public String getContentDigest(String algorithm, String digestEncodingParam,
- boolean rfc3230 // aggiunge prefisso algoritmo=
- ) throws DynamicException{
- DigestEncoding digestEncoding = null;
- try {
- digestEncoding = DigestEncoding.valueOf(digestEncodingParam);
- }catch(Exception t) {
- throw new DynamicException("DigestEncoding '"+digestEncodingParam+"' unsupported");
- }
- return getContentDigest(algorithm, digestEncoding, rfc3230);
- }
- public String getContentDigest(String algorithm, DigestEncoding digestEncoding, String rfc3230) throws DynamicException{
- // // per invocazioni dinamiche
- boolean v = false;
- try {
- v = Boolean.valueOf(rfc3230);
- }catch(Exception e) {
- throw new DynamicException(this.buildUncorrectBooleaValueMessage(rfc3230, e),e);
- }
- return getContentDigest(algorithm, digestEncoding, v);
- }
- public String getContentDigest(String algorithm, DigestEncoding digestEncoding,
- boolean rfc3230 // aggiunge prefisso algoritmo=
- ) throws DynamicException{
- byte[] content = getContent();
- if(content==null) {
- throw new DynamicException("Content null");
- }
- try {
- return org.openspcoop2.utils.digest.DigestUtils.getDigestValue(content, algorithm, digestEncoding, rfc3230);
- }catch(Exception e) {
- throw new DynamicException(e.getMessage(),e);
- }
- }
-
- public byte[] getContentSoapBody() throws DynamicException {
- byte [] content = null;
- if(!this.hasContent()) {
- content = null;
- }
- else {
- try {
- if(ServiceBinding.SOAP.equals(this.message.getServiceBinding())) {
- if(this.message.castAsSoap().getSOAPPart()==null || this.message.castAsSoap().getSOAPPart().getEnvelope()==null) {
- throw new DynamicException("Messaggio senza una busta SOAP");
- }
- content = TunnelSoapUtils.sbustamentoSOAPEnvelope(this.message.getFactory(), this.message.castAsSoap().getSOAPPart().getEnvelope(), false);
- }
- else {
- throw new DynamicException(FUNZIONALITA_RICHIEDE_SOAP);
- }
- }catch(Exception t) {
- throw new DynamicException(t.getMessage(),t);
- }
- }
- return content;
- }
-
- public String getContentSoapBodyBase64Digest(String algorithm) throws DynamicException{
- return getContentSoapBodyDigest(algorithm, DigestEncoding.BASE64, false);
- }
- public String getContentSoapBodyBase64Digest(String algorithm, String rfc3230) throws DynamicException{
- // // per invocazioni dinamiche
- boolean v = false;
- try {
- v = Boolean.valueOf(rfc3230);
- }catch(Exception e) {
- throw new DynamicException(this.buildUncorrectBooleaValueMessage(rfc3230, e),e);
- }
- return getContentSoapBodyBase64Digest(algorithm, v);
- }
- public String getContentSoapBodyBase64Digest(String algorithm, boolean rfc3230) throws DynamicException{
- return getContentSoapBodyDigest(algorithm, DigestEncoding.BASE64, rfc3230);
- }
-
- public String getContentSoapBodyHexDigest(String algorithm) throws DynamicException{
- return getContentSoapBodyDigest(algorithm, DigestEncoding.HEX, false);
- }
- public String getContentSoapBodyHexDigest(String algorithm, String rfc3230) throws DynamicException{
- // // per invocazioni dinamiche
- boolean v = false;
- try {
- v = Boolean.valueOf(rfc3230);
- }catch(Exception e) {
- throw new DynamicException(this.buildUncorrectBooleaValueMessage(rfc3230, e),e);
- }
- return getContentSoapBodyHexDigest(algorithm, v);
- }
- public String getContentSoapBodyHexDigest(String algorithm, boolean rfc3230) throws DynamicException{
- return getContentSoapBodyDigest(algorithm, DigestEncoding.HEX, rfc3230);
- }
-
- public String getContentSoapBodyDigest(String algorithm, String digestEncodingParam) throws DynamicException{
- return getContentSoapBodyDigest(algorithm, digestEncodingParam, false);
- }
- public String getContentSoapBodyDigest(String algorithm, DigestEncoding digestEncoding) throws DynamicException{
- return getContentSoapBodyDigest(algorithm, digestEncoding, false);
- }
- public String getContentSoapBodyDigest(String algorithm, String digestEncodingParam, String rfc3230) throws DynamicException{
- // // per invocazioni dinamiche
- boolean v = false;
- try {
- v = Boolean.valueOf(rfc3230);
- }catch(Exception e) {
- throw new DynamicException(this.buildUncorrectBooleaValueMessage(rfc3230, e),e);
- }
- return getContentSoapBodyDigest(algorithm, digestEncodingParam, v);
- }
- public String getContentSoapBodyDigest(String algorithm, String digestEncodingParam,
- boolean rfc3230 // aggiunge prefisso algoritmo=
- ) throws DynamicException{
- DigestEncoding digestEncoding = null;
- try {
- digestEncoding = DigestEncoding.valueOf(digestEncodingParam);
- }catch(Exception t) {
- throw new DynamicException("DigestEncoding '"+digestEncodingParam+"' unsupported");
- }
- return getContentSoapBodyDigest(algorithm, digestEncoding, rfc3230);
- }
- public String getContentSoapBodyDigest(String algorithm, DigestEncoding digestEncoding, String rfc3230) throws DynamicException{
- // // per invocazioni dinamiche
- boolean v = false;
- try {
- v = Boolean.valueOf(rfc3230);
- }catch(Exception e) {
- throw new DynamicException(this.buildUncorrectBooleaValueMessage(rfc3230, e),e);
- }
- return getContentSoapBodyDigest(algorithm, digestEncoding, v);
- }
- public String getContentSoapBodyDigest(String algorithm, DigestEncoding digestEncoding,
- boolean rfc3230 // aggiunge prefisso algoritmo=
- ) throws DynamicException{
- byte[] content = getContentSoapBody();
- if(content==null) {
- throw new DynamicException("Content null");
- }
- try {
- return org.openspcoop2.utils.digest.DigestUtils.getDigestValue(content, algorithm, digestEncoding, rfc3230);
- }catch(Exception e) {
- throw new DynamicException(e.getMessage(),e);
- }
- }
-
- private String buildUncorrectBooleaValueMessage(String rfc3230, Exception e) {
- return "Uncorrect boolean value '"+rfc3230+"': "+e.getMessage();
- }
-
-
-
- public boolean isSoapFault() throws DynamicException {
- try {
- if(ServiceBinding.SOAP.equals(this.message.getServiceBinding())) {
- return this.message.castAsSoap().hasSOAPFault();
- }
- else {
- throw new DynamicException(FUNZIONALITA_RICHIEDE_SOAP);
- }
- }catch(Exception t) {
- throw new DynamicException(t.getMessage(),t);
- }
- }
- public boolean isSoapBodyEmpty() throws DynamicException {
- try {
- if(ServiceBinding.SOAP.equals(this.message.getServiceBinding())) {
- return this.message.castAsSoap().isSOAPBodyEmpty();
- }
- else {
- throw new DynamicException(FUNZIONALITA_RICHIEDE_SOAP);
- }
- }catch(Exception t) {
- throw new DynamicException(t.getMessage(),t);
- }
- }
- public boolean isSoapWithAttachments() throws DynamicException {
- try {
- if(ServiceBinding.SOAP.equals(this.message.getServiceBinding())) {
- return this.message.castAsSoap().hasAttachments();
- }
- else {
- throw new DynamicException(FUNZIONALITA_RICHIEDE_SOAP);
- }
- }catch(Exception t) {
- throw new DynamicException(t.getMessage(),t);
- }
- }
- public OpenSPCoop2MessageSoapStreamReader getSoapReader() throws DynamicException {
- try {
- if(ServiceBinding.SOAP.equals(this.message.getServiceBinding())) {
- return this.message.castAsSoap().getSoapReader();
- }
- else {
- throw new DynamicException(FUNZIONALITA_RICHIEDE_SOAP);
- }
- }catch(Exception t) {
- throw new DynamicException(t.getMessage(),t);
- }
- }
-
-
- public DumpMessaggio getPart() throws DynamicException {
- // per invocazioni dinamiche
- return this.dumpMessage();
- }
- public DumpMessaggio getDumpMessage() throws DynamicException {
- // per invocazioni dinamiche
- return this.dumpMessage();
- }
- public DumpMessaggio dumpMessage() throws DynamicException {
- if(this.dumpMessaggioInit==null) {
- this.initDump();
- }
- return this.dumpMessaggio;
- }
-
-
- private DumpMessaggio dumpMessaggio = null;
- private Boolean dumpMessaggioInit = null;
- private synchronized void initDump() throws DynamicException {
- if(this.dumpMessaggioInit==null) {
-
- try{
- if(this.hasContent()) {
-
- DumpMessaggioConfig config = new DumpMessaggioConfig();
- config.setDumpAttachments(true);
- config.setDumpBody(true);
- config.setDumpHeaders(false);
- config.setDumpMultipartHeaders(true);
- if(ServiceBinding.SOAP.equals(this.message.getServiceBinding())) {
- this.dumpMessaggio = DumpSoapMessageUtils.dumpMessage(this.message.castAsSoap(), config, true);
- }
- else {
- this.dumpMessaggio = DumpRestMessageUtils.dumpMessage(this.message.castAsRest(), config, true);
- }
- }
- }catch(Exception t) {
- throw new DynamicException(t.getMessage(),t);
- }
-
- this.dumpMessaggioInit = true;
- }
- }
-
- }