ProtocolPropertyBinaryPropertyChange.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.web.ctrlstat.servlet.protocol_properties;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.openspcoop2.core.constants.ProprietariProtocolProperty;
import org.openspcoop2.core.registry.ProtocolProperty;
import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.constants.ConsoleOperationType;
import org.openspcoop2.protocol.sdk.properties.AbstractConsoleItem;
import org.openspcoop2.protocol.sdk.properties.AbstractProperty;
import org.openspcoop2.protocol.sdk.properties.BinaryConsoleItem;
import org.openspcoop2.protocol.sdk.properties.BinaryProperty;
import org.openspcoop2.protocol.sdk.properties.BooleanProperty;
import org.openspcoop2.protocol.sdk.properties.NumberProperty;
import org.openspcoop2.protocol.sdk.properties.ProtocolProperties;
import org.openspcoop2.protocol.sdk.properties.ProtocolPropertiesFactory;
import org.openspcoop2.protocol.sdk.properties.ProtocolPropertiesUtils;
import org.openspcoop2.protocol.sdk.properties.StringProperty;
import org.openspcoop2.web.ctrlstat.core.ControlStationCore;
import org.openspcoop2.web.ctrlstat.core.Utilities;
import org.openspcoop2.web.ctrlstat.servlet.GeneralHelper;
import org.openspcoop2.web.ctrlstat.servlet.archivi.ArchiviCostanti;
import org.openspcoop2.web.lib.mvc.BinaryParameter;
import org.openspcoop2.web.lib.mvc.Costanti;
import org.openspcoop2.web.lib.mvc.DataElement;
import org.openspcoop2.web.lib.mvc.GeneralData;
import org.openspcoop2.web.lib.mvc.PageData;
import org.openspcoop2.web.lib.mvc.Parameter;
import org.openspcoop2.web.lib.mvc.ServletUtils;
import org.openspcoop2.web.lib.mvc.TipoOperazione;
/**
* ProtocolPropertyBinaryPropertyChange
*
* @author Pintori Giuliano (pintori@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class ProtocolPropertyBinaryPropertyChange extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpSession session = request.getSession(true);
// Inizializzo PageData
PageData pd = new PageData();
GeneralHelper generalHelper = new GeneralHelper(session);
// Inizializzo GeneralData
GeneralData gd = generalHelper.initGeneralData(request);
String userLogin = ServletUtils.getUserLoginFromSession(session);
String label = "";
TipoOperazione tipoOp = TipoOperazione.CHANGE;
List<ProtocolProperty> oldProtocolPropertyListRegistry = null;
List<org.openspcoop2.core.config.ProtocolProperty> oldProtocolPropertyListConfig = null;
ProtocolPropertiesStrutsBean strutsBean = new ProtocolPropertiesStrutsBean();
// Parametri Protocol Properties relativi al tipo di operazione e al tipo di visualizzazione
strutsBean.consoleOperationType = ConsoleOperationType.CHANGE;
BinaryParameter oldContenutoDocumento = null;
String tipologiaDocumentoScaricare = ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PROTOCOL_PROPERTY_BINARY;
try{
ProtocolPropertiesHelper ppHelper = new ProtocolPropertiesHelper(request, pd, session);
strutsBean.id = ppHelper.getParameter(ProtocolPropertiesCostanti.PARAMETRO_PP_ID);
strutsBean.idProprietario = ppHelper.getParameter(ProtocolPropertiesCostanti.PARAMETRO_PP_ID_PROPRIETARIO);
String tipoProprietarioS = ppHelper.getParameter(ProtocolPropertiesCostanti.PARAMETRO_PP_TIPO_PROPRIETARIO);
if(tipoProprietarioS!= null)
strutsBean.tipoProprietario = ProprietariProtocolProperty.valueOf(tipoProprietarioS);
boolean propertyRegistry = ppHelper.isProtocolPropertiesRegistry(strutsBean.tipoProprietario);
strutsBean.nome = ppHelper.getParameter(ProtocolPropertiesCostanti.PARAMETRO_PP_NOME);
strutsBean.nomeProprietario = ppHelper.getParameter(ProtocolPropertiesCostanti.PARAMETRO_PP_NOME_PROPRIETARIO);
strutsBean.nomeParentProprietario = ppHelper.getParameter(ProtocolPropertiesCostanti.PARAMETRO_PP_NOME_PARENT_PROPRIETARIO);
strutsBean.urlChange = ppHelper.getParameter(ProtocolPropertiesCostanti.PARAMETRO_PP_URL_ORIGINALE_CHANGE);
strutsBean.editMode = ppHelper.getParameter(Costanti.DATA_ELEMENT_EDIT_MODE_NAME);
strutsBean.contenutoDocumento = ppHelper.getBinaryParameter(ProtocolPropertiesCostanti.PARAMETRO_PP_CONTENUTO_DOCUMENTO);
strutsBean.protocollo = ppHelper.getParameter(ProtocolPropertiesCostanti.PARAMETRO_PP_PROTOCOLLO);
strutsBean.tipoAccordo = ppHelper.getParameter(ProtocolPropertiesCostanti.PARAMETRO_PP_TIPO_ACCORDO);
ProtocolPropertiesCore ppCore = new ProtocolPropertiesCore();
strutsBean.protocolFactory = ProtocolFactoryManager.getInstance().getProtocolFactoryByName(strutsBean.protocollo);
strutsBean.consoleDynamicConfiguration = strutsBean.protocolFactory.createDynamicConfigurationConsole();
strutsBean.registryReader = ppCore.getRegistryReader(strutsBean.protocolFactory);
strutsBean.configRegistryReader = ppCore.getConfigIntegrationReader(strutsBean.protocolFactory);
long idProtocolPropertyLong = Long.parseLong(strutsBean.id);
// prelevo l'oggetto proprietario
Object oggettoProprietario = ppHelper.getOggettoProprietario(strutsBean.idProprietario, strutsBean.nomeProprietario, strutsBean.nomeParentProprietario, strutsBean.tipoProprietario, strutsBean.tipoAccordo);
// prelevo l'id oggetto proprietario
Object idOggettoProprietario = ppHelper.getIdOggettoProprietario(oggettoProprietario, strutsBean.idProprietario, strutsBean.nomeProprietario, strutsBean.nomeParentProprietario, strutsBean.tipoProprietario, strutsBean.tipoAccordo);
strutsBean.consoleConfiguration = ppHelper.getConsoleDynamicConfiguration(idOggettoProprietario, strutsBean.idProprietario, strutsBean.nomeProprietario, strutsBean.nomeParentProprietario, strutsBean.tipoProprietario, strutsBean.tipoAccordo,
strutsBean.consoleOperationType,
strutsBean.registryReader, strutsBean.configRegistryReader, strutsBean.consoleDynamicConfiguration);
strutsBean.protocolProperties = ppHelper.estraiProtocolPropertiesDaRequest(strutsBean.consoleConfiguration, strutsBean.consoleOperationType, strutsBean.nome, strutsBean.contenutoDocumento);
if(propertyRegistry) {
oldProtocolPropertyListRegistry = ppHelper.getProtocolPropertiesRegistry(oggettoProprietario, strutsBean.id, strutsBean.nome, strutsBean.idProprietario, strutsBean.nomeProprietario, strutsBean.nomeParentProprietario, strutsBean.tipoProprietario, strutsBean.tipoAccordo);
ProtocolPropertiesUtils.mergeProtocolPropertiesRegistry(strutsBean.protocolProperties, oldProtocolPropertyListRegistry, strutsBean.consoleOperationType);
}
else {
oldProtocolPropertyListConfig = ppHelper.getProtocolPropertiesConfig(oggettoProprietario, strutsBean.id, strutsBean.nome, strutsBean.idProprietario, strutsBean.nomeProprietario, strutsBean.nomeParentProprietario, strutsBean.tipoProprietario, strutsBean.tipoAccordo);
ProtocolPropertiesUtils.mergeProtocolPropertiesConfig(strutsBean.protocolProperties, oldProtocolPropertyListConfig, strutsBean.consoleOperationType);
}
// vecchio valore della property sul DB
ProtocolProperty protocolPropertyRegistry = null;
org.openspcoop2.core.config.ProtocolProperty protocolPropertyConfig = null;
// binaryConsoleItem
AbstractConsoleItem<?> binaryConsoleItem = ProtocolPropertiesUtils.getAbstractConsoleItem(strutsBean.consoleConfiguration.getConsoleItem(), strutsBean.nome);
label = binaryConsoleItem.getLabel();
boolean readOnly = false;
String noteAggiornamento = null;
boolean showContent = true;
BinaryConsoleItem b = null;
if(binaryConsoleItem instanceof BinaryConsoleItem) {
b = (BinaryConsoleItem) binaryConsoleItem;
readOnly = b.isReadOnly();
showContent = b.isShowContent();
noteAggiornamento = b.getNoteUpdate();
}
// Preparo il menu
ppHelper.makeMenu();
// se la property e' presente sul db allora la leggo
if(idProtocolPropertyLong > 0){
if(propertyRegistry) {
protocolPropertyRegistry = ProtocolPropertiesUtils.getProtocolPropertyRegistry(strutsBean.nome, oldProtocolPropertyListRegistry);
}
else {
protocolPropertyConfig = ProtocolPropertiesUtils.getProtocolPropertyConfig(strutsBean.nome, oldProtocolPropertyListConfig);
}
}
oldContenutoDocumento = new BinaryParameter();
if(protocolPropertyRegistry != null){
// carico il vecchio contenuto della property
oldContenutoDocumento.setValue(protocolPropertyRegistry.getByteFile());
oldContenutoDocumento.setFilename(protocolPropertyRegistry.getFile());
oldContenutoDocumento.setName(strutsBean.nome);
}
else if(protocolPropertyConfig != null){
// carico il vecchio contenuto della property
oldContenutoDocumento.setValue(protocolPropertyConfig.getByteFile());
oldContenutoDocumento.setFilename(protocolPropertyConfig.getFile());
oldContenutoDocumento.setName(strutsBean.nome);
}
StringBuilder contenutoDocumentoStringBuilder = new StringBuilder();
byte[] oldValue = oldContenutoDocumento.getValue() ;
if(readOnly && oldValue==null) {
// il valore deve essere preso da default value
oldValue = b.getDefaultValue();
oldContenutoDocumento.setValue(oldValue);
if(oldContenutoDocumento.getFilename()==null) {
oldContenutoDocumento.setFilename(binaryConsoleItem.getLabel());
}
}
String errore = null;
if(showContent) {
errore = Utilities.getTestoVisualizzabile(oldValue,contenutoDocumentoStringBuilder);
}
// Parametri Barra titolo TIPO PROPRIETARIO / LABEL OGGETTO / GESTIONE DOCUMENTO
List<Parameter> lstParam = ppHelper.getTitolo(oggettoProprietario, strutsBean.tipoProprietario, strutsBean.id, strutsBean.nome, strutsBean.idProprietario, strutsBean.nomeProprietario,strutsBean.nomeParentProprietario,strutsBean.urlChange, strutsBean.tipoAccordo);
lstParam.add(new Parameter(label,null));
if(ServletUtils.isEditModeInProgress(strutsBean.editMode)){
// setto la barra del titolo TIPO PROPRIETARIO / LABEL OGGETTO / GESTIONE DOCUMENTO
ServletUtils.setPageDataTitle(pd,lstParam);
// preparo i campi
List<DataElement> dati = new ArrayList<>();
dati.add(ServletUtils.getDataElementForEditModeFinished());
dati = ppHelper.addProtocolPropertyChangeToDati(tipoOp, dati, strutsBean.protocollo, strutsBean.id, strutsBean.nome, strutsBean.idProprietario,strutsBean.tipoProprietario,strutsBean.tipoAccordo,strutsBean.nomeProprietario,strutsBean.nomeParentProprietario,strutsBean.urlChange, label,
oldContenutoDocumento,contenutoDocumentoStringBuilder,errore,tipologiaDocumentoScaricare,binaryConsoleItem, readOnly, noteAggiornamento);
pd.setDati(dati);
ServletUtils.setGeneralAndPageDataIntoSession(request, session, gd, pd);
return ServletUtils.getStrutsForwardEditModeInProgress(mapping,
ProtocolPropertiesCostanti.OBJECT_NAME_PP, ProtocolPropertiesCostanti.TIPO_OPERAZIONE_BINARY_PROPERTY_CHANGE);
}
// update del valore della singola property
AbstractProperty<?> abstractPropertyById = ProtocolPropertiesUtils.getAbstractPropertyById(strutsBean.protocolProperties, binaryConsoleItem.getId());
if(abstractPropertyById != null){
BinaryProperty bp = (BinaryProperty) abstractPropertyById;
bp.setValue(strutsBean.contenutoDocumento.getValue());
bp.setFileName(strutsBean.contenutoDocumento.getFilename());
bp.setFileId(strutsBean.contenutoDocumento.getId());
}
// validazione del contenuto
boolean isOk = true;
try{
ppHelper.validaProtocolPropertyBinaria(strutsBean.nome,strutsBean.consoleConfiguration, strutsBean.consoleOperationType, strutsBean.protocolProperties);
}catch(ProtocolException e){
ControlStationCore.getLog().error(e.getMessage(),e);
pd.setMessage(e.getMessage());
isOk = false;
}
// Valido i parametri custom se ho gia' passato tutta la validazione prevista
if(isOk){
try{
// Rendo in chiaro eventuali proprietà cifrate, per consentirne la validazione
ProtocolProperties protocolPropertiesCloned = new ProtocolProperties();
if(strutsBean.protocolProperties!=null && strutsBean.protocolProperties.sizeProperties()>0) {
for (int i = 0; i < strutsBean.protocolProperties.sizeProperties(); i++) {
AbstractProperty<?> pp = strutsBean.protocolProperties.getProperty(i);
if(pp instanceof BinaryProperty) {
BinaryProperty bp = (BinaryProperty) pp;
BinaryProperty bpCloned = ProtocolPropertiesFactory.newProperty(bp.getId(), ppCore.getDriverBYOKUtilities().unwrap(bp.getValue()), bp.getFileName(), bp.getFileId());
protocolPropertiesCloned.addProperty(bpCloned);
}
else if(pp instanceof StringProperty) {
StringProperty sp = (StringProperty) pp;
StringProperty spCloned = ProtocolPropertiesFactory.newProperty(sp.getId(), ppCore.getDriverBYOKUtilities().unwrap(sp.getValue()));
protocolPropertiesCloned.addProperty(spCloned);
}
else if(pp instanceof BooleanProperty) {
BooleanProperty bp = (BooleanProperty) pp;
BooleanProperty bpCloned = ProtocolPropertiesFactory.newProperty(bp.getId(), bp.getValue());
protocolPropertiesCloned.addProperty(bpCloned);
}
else if(pp instanceof NumberProperty) {
NumberProperty np = (NumberProperty) pp;
NumberProperty npCloned = ProtocolPropertiesFactory.newProperty(np.getId(), np.getValue());
protocolPropertiesCloned.addProperty(npCloned);
}
}
}
ppHelper.validateDynamicConfig(strutsBean.consoleDynamicConfiguration, idOggettoProprietario, strutsBean.tipoAccordo, strutsBean.tipoProprietario, strutsBean.consoleConfiguration, strutsBean.consoleOperationType,
protocolPropertiesCloned,/** strutsBean.protocolProperties,*/
strutsBean.registryReader, strutsBean.configRegistryReader);
}catch(ProtocolException e){
ControlStationCore.getLog().error(e.getMessage(),e);
pd.setMessage(e.getMessage());
isOk = false;
}
}
if (!isOk) {
// setto la barra del titolo TIPO PROPRIETARIO / LABEL OGGETTO / GESTIONE DOCUMENTO
ServletUtils.setPageDataTitle(pd, lstParam);
// preparo i campi
List<DataElement> dati = new ArrayList<>();
dati.add(ServletUtils.getDataElementForEditModeFinished());
contenutoDocumentoStringBuilder = new StringBuilder();
errore = null;
if(showContent) {
errore = Utilities.getTestoVisualizzabile(strutsBean.contenutoDocumento.getValue(),contenutoDocumentoStringBuilder);
}
dati = ppHelper.addProtocolPropertyChangeToDati(tipoOp, dati, strutsBean.protocollo, strutsBean.id, strutsBean.nome, strutsBean.idProprietario,strutsBean.tipoProprietario,strutsBean.tipoAccordo,strutsBean.nomeProprietario,strutsBean.nomeParentProprietario,strutsBean.urlChange, label,
strutsBean.contenutoDocumento,contenutoDocumentoStringBuilder,errore,tipologiaDocumentoScaricare,binaryConsoleItem, readOnly, noteAggiornamento);
pd.setDati(dati);
//cancello il file temporaneo
ppHelper.deleteBinaryProtocolPropertyTmpFiles(strutsBean.protocolProperties, strutsBean.nome, ProtocolPropertiesCostanti.PARAMETRO_PP_CONTENUTO_DOCUMENTO);
ServletUtils.setGeneralAndPageDataIntoSession(request, session, gd, pd);
return ServletUtils.getStrutsForwardEditModeCheckError(mapping,
ProtocolPropertiesCostanti.OBJECT_NAME_PP, ProtocolPropertiesCostanti.TIPO_OPERAZIONE_BINARY_PROPERTY_CHANGE);
}
// salvataggio delle properties con hack in ADD per far settare il valore della property binary
if(propertyRegistry) {
List<ProtocolProperty> protocolPropertiesAggiornate = ProtocolPropertiesUtils.toProtocolPropertiesRegistry(strutsBean.protocolProperties, ConsoleOperationType.ADD, oldProtocolPropertyListRegistry);
ppHelper.salvaPropertiesRegistry(userLogin, ppHelper.smista(), oggettoProprietario, protocolPropertiesAggiornate, strutsBean.id, strutsBean.nome, strutsBean.idProprietario, strutsBean.nomeProprietario, strutsBean.nomeParentProprietario, strutsBean.tipoProprietario, strutsBean.tipoAccordo);
}
else {
List<org.openspcoop2.core.config.ProtocolProperty> protocolPropertiesAggiornate = ProtocolPropertiesUtils.toProtocolPropertiesConfig(strutsBean.protocolProperties, ConsoleOperationType.ADD, oldProtocolPropertyListConfig);
ppHelper.salvaPropertiesConfig(userLogin, ppHelper.smista(), oggettoProprietario, protocolPropertiesAggiornate, strutsBean.id, strutsBean.nome, strutsBean.idProprietario, strutsBean.nomeProprietario, strutsBean.nomeParentProprietario, strutsBean.tipoProprietario, strutsBean.tipoAccordo);
}
//cancello il file temporaneo
ppHelper.deleteBinaryProtocolPropertyTmpFiles(strutsBean.protocolProperties, strutsBean.nome, ProtocolPropertiesCostanti.PARAMETRO_PP_CONTENUTO_DOCUMENTO);
// mostro la visualizzazione del file
// setto la barra del titolo TIPO PROPRIETARIO / LABEL OGGETTO / GESTIONE DOCUMENTO
// Aggiorno la barra perche' possono essere cambiati gli id delle breadcrumbs a seconda del proprietario
lstParam = ppHelper.getTitolo(oggettoProprietario, strutsBean.tipoProprietario, strutsBean.id, strutsBean.nome, strutsBean.idProprietario, strutsBean.nomeProprietario,strutsBean.nomeParentProprietario,strutsBean.urlChange, strutsBean.tipoAccordo,true);
lstParam.add(new Parameter(label,null));
ServletUtils.setPageDataTitle(pd, lstParam);
// preparo i campi
List<DataElement> dati = new ArrayList<>();
dati.add(ServletUtils.getDataElementForEditModeFinished());
// ricaricare il valore dell'id property
oggettoProprietario = ppHelper.getOggettoProprietario(strutsBean.idProprietario, strutsBean.nomeProprietario, strutsBean.nomeParentProprietario, strutsBean.tipoProprietario, strutsBean.tipoAccordo);
if(propertyRegistry) {
oldProtocolPropertyListRegistry = ppHelper.getProtocolPropertiesRegistry(oggettoProprietario, strutsBean.id, strutsBean.nome, strutsBean.idProprietario, strutsBean.nomeProprietario, strutsBean.nomeParentProprietario, strutsBean.tipoProprietario, strutsBean.tipoAccordo);
ProtocolProperty protocolProperty = ProtocolPropertiesUtils.getProtocolPropertyRegistry(strutsBean.nome, oldProtocolPropertyListRegistry);
strutsBean.id = null;
if(protocolProperty != null)
strutsBean.id = ""+ protocolProperty.getId();
}
else {
oldProtocolPropertyListConfig = ppHelper.getProtocolPropertiesConfig(oggettoProprietario, strutsBean.id, strutsBean.nome, strutsBean.idProprietario, strutsBean.nomeProprietario, strutsBean.nomeParentProprietario, strutsBean.tipoProprietario, strutsBean.tipoAccordo);
org.openspcoop2.core.config.ProtocolProperty protocolProperty = ProtocolPropertiesUtils.getProtocolPropertyConfig(strutsBean.nome, oldProtocolPropertyListConfig);
strutsBean.id = null;
if(protocolProperty != null)
strutsBean.id = ""+ protocolProperty.getId();
}
contenutoDocumentoStringBuilder = new StringBuilder();
errore = null;
if(showContent) {
errore = Utilities.getTestoVisualizzabile(strutsBean.contenutoDocumento.getValue(),contenutoDocumentoStringBuilder);
}
dati = ppHelper.addProtocolPropertyChangeToDati(tipoOp, dati, strutsBean.protocollo, strutsBean.id, strutsBean.nome, strutsBean.idProprietario,strutsBean.tipoProprietario,strutsBean.tipoAccordo,strutsBean.nomeProprietario,strutsBean.nomeParentProprietario,strutsBean.urlChange, label,
strutsBean.contenutoDocumento,contenutoDocumentoStringBuilder,errore,tipologiaDocumentoScaricare,binaryConsoleItem, readOnly, noteAggiornamento);
pd.setDati(dati);
// setto la baseurl per il redirect (alla servlet XXXChange) ,strutsBean.urlChange
// se viene premuto invio
gd = generalHelper.initGeneralData(request);
ServletUtils.setGeneralAndPageDataIntoSession(request, session, gd, pd);
return ServletUtils.getStrutsForwardEditModeFinished(mapping, ProtocolPropertiesCostanti.OBJECT_NAME_PP, ProtocolPropertiesCostanti.TIPO_OPERAZIONE_BINARY_PROPERTY_CHANGE);
} catch (Exception e) {
return ServletUtils.getStrutsForwardError(ControlStationCore.getLog(), e, pd, request, session, gd, mapping,
ProtocolPropertiesCostanti.OBJECT_NAME_PP, ProtocolPropertiesCostanti.TIPO_OPERAZIONE_BINARY_PROPERTY_CHANGE);
}
}
}