BasicFactory.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 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.protocol.basic;
import org.openspcoop2.core.config.driver.IDriverConfigurazioneGet;
import org.openspcoop2.core.registry.driver.IDriverRegistroServiziGet;
import org.openspcoop2.protocol.basic.archive.BasicArchive;
import org.openspcoop2.protocol.basic.builder.BustaBuilder;
import org.openspcoop2.protocol.basic.builder.ErroreApplicativoBuilder;
import org.openspcoop2.protocol.basic.builder.EsitoBuilder;
import org.openspcoop2.protocol.basic.config.BasicProtocolIntegrationConfiguration;
import org.openspcoop2.protocol.basic.config.BasicTraduttore;
import org.openspcoop2.protocol.basic.diagnostica.DiagnosticSerializer;
import org.openspcoop2.protocol.basic.properties.BasicDynamicConfiguration;
import org.openspcoop2.protocol.basic.registry.ConfigIntegrationReader;
import org.openspcoop2.protocol.basic.registry.RegistryReader;
import org.openspcoop2.protocol.basic.tracciamento.TracciaSerializer;
import org.openspcoop2.protocol.basic.validator.ValidatoreErrori;
import org.openspcoop2.protocol.basic.validator.ValidazioneAccordi;
import org.openspcoop2.protocol.basic.validator.ValidazioneConSchema;
import org.openspcoop2.protocol.basic.validator.ValidazioneDocumenti;
import org.openspcoop2.protocol.basic.validator.ValidazioneSemantica;
import org.openspcoop2.protocol.basic.validator.ValidazioneSintattica;
import org.openspcoop2.protocol.manifest.Openspcoop2;
import org.openspcoop2.protocol.registry.CachedRegistryReader;
import org.openspcoop2.protocol.registry.RegistroServiziManager;
import org.openspcoop2.protocol.sdk.ConfigurazionePdD;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.InformazioniProtocollo;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.archive.IArchive;
import org.openspcoop2.protocol.sdk.config.IProtocolIntegrationConfiguration;
import org.openspcoop2.protocol.sdk.diagnostica.IDiagnosticDriver;
import org.openspcoop2.protocol.sdk.diagnostica.IDiagnosticProducer;
import org.openspcoop2.protocol.sdk.dump.IDumpProducer;
import org.openspcoop2.protocol.sdk.properties.IConsoleDynamicConfiguration;
import org.openspcoop2.protocol.sdk.registry.IConfigIntegrationReader;
import org.openspcoop2.protocol.sdk.registry.IRegistryReader;
import org.openspcoop2.protocol.sdk.state.IState;
import org.openspcoop2.protocol.sdk.state.RequestInfo;
import org.openspcoop2.protocol.sdk.tracciamento.ITracciaDriver;
import org.openspcoop2.protocol.sdk.tracciamento.ITracciaProducer;
import org.openspcoop2.protocol.sdk.validator.IValidazioneAccordi;
import org.openspcoop2.protocol.sdk.validator.IValidazioneDocumenti;
import org.openspcoop2.protocol.utils.EsitiProperties;
import org.openspcoop2.protocol.utils.ProtocolUtils;
import org.openspcoop2.utils.Map;
import org.openspcoop2.utils.MapKey;
import org.slf4j.Logger;
/**
* BasicFactory
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public abstract class BasicFactory<BustaRawType> implements IProtocolFactory<BustaRawType> {
private static final long serialVersionUID = 1L;
private String protocol;
private MapKey<String> protocolMapKey;
private InformazioniProtocollo informazioniProtocollo;
protected Logger log;
protected Logger logProtocol;
private ConfigurazionePdD configPdD;
private Openspcoop2 manifest;
protected BasicStaticInstanceConfig staticInstanceConfig;
/* ** INIT ** */
@Override
public void init(Logger log,String protocol,ConfigurazionePdD configPdD,Openspcoop2 manifest) throws ProtocolException{
this.protocol = protocol;
this.protocolMapKey = ProtocolUtils.protocolToMapKey(this.protocol);
this.log = log;
this.configPdD = configPdD;
this.manifest = manifest;
this.informazioniProtocollo = new InformazioniProtocollo();
this.informazioniProtocollo.setName(this.protocol);
this.informazioniProtocollo.setLabel(manifest.getProtocol().getLabel());
this.informazioniProtocollo.setWebSite(manifest.getProtocol().getWebSite());
this.informazioniProtocollo.setDescription(manifest.getProtocol().getDescrizione());
if(manifest.getProtocol().getTransaction()!=null) {
this.informazioniProtocollo.setErrorProtocol(manifest.getProtocol().getTransaction().isErrorProtocol());
this.informazioniProtocollo.setEnvelopeErrorProtocol(manifest.getProtocol().getTransaction().isEnvelopeErrorProtocol());
this.informazioniProtocollo.setLabelErrorProtocol(manifest.getProtocol().getTransaction().getLabelErrorProtocol());
this.informazioniProtocollo.setExternalFault(manifest.getProtocol().getTransaction().isExternalFault());
this.informazioniProtocollo.setLabelExternalFault(manifest.getProtocol().getTransaction().getLabelExternalFault());
}
}
protected void initStaticInstance(BasicStaticInstanceConfig staticInstanceConfig) throws ProtocolException{
if(staticInstanceConfig!=null) {
this.staticInstanceConfig = staticInstanceConfig;
if(staticInstanceConfig.isStaticConfig()) {
if(staticInstanceTraduttore==null) {
initStaticInstanceTraduttore();
}
createTraduttore();
if(staticInstanceProtocolIntegrationConfiguration==null) {
initStaticInstanceProtocolIntegrationConfiguration();
}
createProtocolIntegrationConfiguration();
}
if(staticInstanceConfig.isStaticErrorBuilder()) {
if(staticInstanceErroreApplicativoBuilder==null) {
initStaticInstanceErroreApplicativoBuilder();
}
createErroreApplicativoBuilder();
}
if(staticInstanceConfig.isStaticEsitoBuilder() && EsitiProperties.isInitializedProtocol(this.getProtocolMapKey())) {
if(staticInstanceEsitoBuilder==null) {
initStaticInstanceEsitoBuilder();
}
createEsitoBuilder();
}
}
}
public void initStaticInstance() throws ProtocolException{
if(this.staticInstanceConfig!=null && this.staticInstanceConfig.isStaticEsitoBuilder() && EsitiProperties.isInitializedProtocol(this.getProtocolMapKey()) &&
(staticInstanceEsitoBuilder==null || !staticInstanceEsitoBuilder.containsKey(this.getProtocolMapKey()))) {
if(staticInstanceEsitoBuilder==null) {
initStaticInstanceEsitoBuilder();
}
createEsitoBuilder();
}
}
@Override
public void initProtocolLogger(Logger protocolLogger) throws ProtocolException{
this.logProtocol = protocolLogger;
}
/* ** LOGGER ** */
@Override
public Logger getLogger() {
return this.log;
}
@Override
public Logger getProtocolLogger() {
if(this.logProtocol!=null) {
return this.logProtocol;
}
else {
return this.log; // Per contesti di utilizzo fuori dalla PdD, (es. console) per non avere nullPointer
}
}
/* ** INFO SERVIZIO ** */
@Override
public String getProtocol() {
return this.protocol;
}
@Override
public MapKey<String> getProtocolMapKey() {
return this.protocolMapKey;
}
@Override
public InformazioniProtocollo getInformazioniProtocol() {
return this.informazioniProtocollo;
}
@Override
public ConfigurazionePdD getConfigurazionePdD() {
return this.configPdD;
}
@Override
public Openspcoop2 getManifest() {
return this.manifest;
}
/* ** PROTOCOL BUILDER ** */
@Override
public org.openspcoop2.protocol.sdk.builder.IBustaBuilder<BustaRawType> createBustaBuilder(IState state) throws ProtocolException {
return new BustaBuilder<BustaRawType>(this, state);
}
private static Map<org.openspcoop2.protocol.sdk.builder.IErroreApplicativoBuilder> staticInstanceErroreApplicativoBuilder = null;
private static synchronized void initStaticInstanceErroreApplicativoBuilder() {
if(staticInstanceErroreApplicativoBuilder==null) {
staticInstanceErroreApplicativoBuilder = new Map<org.openspcoop2.protocol.sdk.builder.IErroreApplicativoBuilder>();
}
}
@Override
public org.openspcoop2.protocol.sdk.builder.IErroreApplicativoBuilder createErroreApplicativoBuilder() throws ProtocolException {
if(staticInstanceErroreApplicativoBuilder!=null) {
org.openspcoop2.protocol.sdk.builder.IErroreApplicativoBuilder builder = staticInstanceErroreApplicativoBuilder.get(this.getProtocolMapKey());
if(builder==null) {
initErroreApplicativoBuilder(this.getProtocolMapKey());
builder = staticInstanceErroreApplicativoBuilder.get(this.getProtocolMapKey());
}
return builder;
}
else {
return new ErroreApplicativoBuilder(this);
}
}
private synchronized void initErroreApplicativoBuilder(MapKey<String> protocolMapKey) throws ProtocolException {
if(!staticInstanceErroreApplicativoBuilder.containsKey(protocolMapKey)) {
staticInstanceErroreApplicativoBuilder.put(protocolMapKey, new ErroreApplicativoBuilder(this));
}
}
private static Map<org.openspcoop2.protocol.sdk.builder.IEsitoBuilder> staticInstanceEsitoBuilder = null;
private static synchronized void initStaticInstanceEsitoBuilder() {
if(staticInstanceEsitoBuilder==null) {
staticInstanceEsitoBuilder = new Map<org.openspcoop2.protocol.sdk.builder.IEsitoBuilder>();
}
}
@Override
public org.openspcoop2.protocol.sdk.builder.IEsitoBuilder createEsitoBuilder() throws ProtocolException{
if(staticInstanceEsitoBuilder!=null) {
org.openspcoop2.protocol.sdk.builder.IEsitoBuilder builder = staticInstanceEsitoBuilder.get(this.getProtocolMapKey());
if(builder==null) {
initEsitoBuilder(this.getProtocolMapKey());
builder = staticInstanceEsitoBuilder.get(this.getProtocolMapKey());
}
return builder;
}
else {
return new EsitoBuilder(this);
}
}
private synchronized void initEsitoBuilder(MapKey<String> protocolMapKey) throws ProtocolException {
if(!staticInstanceEsitoBuilder.containsKey(protocolMapKey)) {
staticInstanceEsitoBuilder.put(protocolMapKey, new EsitoBuilder(this));
}
}
/* ** PROTOCOL VALIDATOR ** */
@Override
public org.openspcoop2.protocol.sdk.validator.IValidatoreErrori createValidatoreErrori(IState state) throws ProtocolException{
return new ValidatoreErrori(this, state);
}
@Override
public org.openspcoop2.protocol.sdk.validator.IValidazioneSintattica<BustaRawType> createValidazioneSintattica(IState state) throws ProtocolException {
return new ValidazioneSintattica<BustaRawType>(this, state);
}
@Override
public org.openspcoop2.protocol.sdk.validator.IValidazioneSemantica createValidazioneSemantica(IState state) throws ProtocolException {
return new ValidazioneSemantica(this, state);
}
@Override
public org.openspcoop2.protocol.sdk.validator.IValidazioneConSchema createValidazioneConSchema(IState state) throws ProtocolException{
return new ValidazioneConSchema(this, state);
}
@Override
public IValidazioneDocumenti createValidazioneDocumenti()
throws ProtocolException {
return new ValidazioneDocumenti(this);
}
@Override
public IValidazioneAccordi createValidazioneAccordi()
throws ProtocolException {
return new ValidazioneAccordi(this);
}
/* ** DIAGNOSTICI ** */
@Override
public IDiagnosticDriver createDiagnosticDriver() throws ProtocolException{
return new org.openspcoop2.protocol.basic.diagnostica.DiagnosticDriver(this);
}
@Override
public IDiagnosticProducer createDiagnosticProducer() throws ProtocolException{
return new org.openspcoop2.protocol.basic.diagnostica.DiagnosticProducer(this);
}
@Override
public org.openspcoop2.protocol.sdk.diagnostica.IDiagnosticSerializer createDiagnosticSerializer() throws ProtocolException {
return new DiagnosticSerializer(this);
}
/* ** TRACCE ** */
@Override
public ITracciaDriver createTracciaDriver() throws ProtocolException{
return new org.openspcoop2.protocol.basic.tracciamento.TracciaDriver(this);
}
@Override
public ITracciaProducer createTracciaProducer() throws ProtocolException{
return new org.openspcoop2.protocol.basic.tracciamento.TracciaProducer(this);
}
@Override
public org.openspcoop2.protocol.sdk.tracciamento.ITracciaSerializer createTracciaSerializer() throws ProtocolException {
return new TracciaSerializer(this);
}
/* ** DUMP ** */
@Override
public IDumpProducer createDumpProducer() throws ProtocolException{
return new org.openspcoop2.protocol.basic.dump.DumpProducer(this);
}
/* ** ARCHIVE ** */
@Override
public IArchive createArchive() throws ProtocolException{
return new BasicArchive(this);
}
/* ** CONFIG ** */
private static Map<org.openspcoop2.protocol.sdk.config.ITraduttore> staticInstanceTraduttore = null;
private static synchronized void initStaticInstanceTraduttore() {
if(staticInstanceTraduttore==null) {
staticInstanceTraduttore = new Map<org.openspcoop2.protocol.sdk.config.ITraduttore>();
}
}
@Override
public org.openspcoop2.protocol.sdk.config.ITraduttore createTraduttore() throws ProtocolException{
if(staticInstanceTraduttore!=null) {
org.openspcoop2.protocol.sdk.config.ITraduttore traduttore = staticInstanceTraduttore.get(this.getProtocolMapKey());
if(traduttore==null) {
initTraduttore(this.getProtocolMapKey());
traduttore = staticInstanceTraduttore.get(this.getProtocolMapKey());
}
return traduttore;
}
else {
return new BasicTraduttore(this);
}
}
private synchronized void initTraduttore(MapKey<String> protocolMapKey) throws ProtocolException {
if(!staticInstanceTraduttore.containsKey(protocolMapKey)) {
staticInstanceTraduttore.put(protocolMapKey, new BasicTraduttore(this));
}
}
private static Map<org.openspcoop2.protocol.sdk.config.IProtocolIntegrationConfiguration> staticInstanceProtocolIntegrationConfiguration = null;
private static synchronized void initStaticInstanceProtocolIntegrationConfiguration() {
if(staticInstanceProtocolIntegrationConfiguration==null) {
staticInstanceProtocolIntegrationConfiguration = new Map<org.openspcoop2.protocol.sdk.config.IProtocolIntegrationConfiguration>();
}
}
@Override
public IProtocolIntegrationConfiguration createProtocolIntegrationConfiguration() throws ProtocolException{
if(staticInstanceProtocolIntegrationConfiguration!=null) {
IProtocolIntegrationConfiguration config = staticInstanceProtocolIntegrationConfiguration.get(this.getProtocolMapKey());
if(config==null) {
initProtocolIntegrationConfiguration(this.getProtocolMapKey());
config = staticInstanceProtocolIntegrationConfiguration.get(this.getProtocolMapKey());
}
return config;
}
else {
return new BasicProtocolIntegrationConfiguration(this);
}
}
private synchronized void initProtocolIntegrationConfiguration(MapKey<String> protocolMapKey) throws ProtocolException {
if(!staticInstanceProtocolIntegrationConfiguration.containsKey(protocolMapKey)) {
staticInstanceProtocolIntegrationConfiguration.put(protocolMapKey, new BasicProtocolIntegrationConfiguration(this));
}
}
/* ** CONSOLE ** */
@Override
public IConsoleDynamicConfiguration createDynamicConfigurationConsole() throws ProtocolException{
return new BasicDynamicConfiguration(this);
}
/* ** REGISTRY ** */
@Override
public IRegistryReader getRegistryReader(IDriverRegistroServiziGet driverRegistry) throws ProtocolException{
try{
return new RegistryReader(driverRegistry, this.log);
}catch(Exception e){
throw new ProtocolException(e.getMessage(),e);
}
}
@Override
public IRegistryReader getCachedRegistryReader(IState state, RequestInfo requestInfo) throws ProtocolException{
try{
return new CachedRegistryReader(this.log, this, state, requestInfo);
}catch(Exception e){
throw new ProtocolException(e.getMessage(),e);
}
}
@Override
public IRegistryReader getCachedRegistryReader(Object registryReader, RequestInfo requestInfo) throws ProtocolException{
try{
return new CachedRegistryReader(this.log, this, (RegistroServiziManager)registryReader, requestInfo);
}catch(Exception e){
throw new ProtocolException(e.getMessage(),e);
}
}
@Override
public IConfigIntegrationReader getConfigIntegrationReader(IDriverConfigurazioneGet driver) throws ProtocolException{
try{
return new ConfigIntegrationReader(driver, this.log);
}catch(Exception e){
throw new ProtocolException(e.getMessage(),e);
}
}
@Override
public IConfigIntegrationReader getCachedConfigIntegrationReader(IState state, RequestInfo requestInfo) throws ProtocolException{
try{
Class<?> c = Class.forName("org.openspcoop2.pdd.config.CachedConfigIntegrationReader");
return (IConfigIntegrationReader) c.getConstructor(Logger.class,IProtocolFactory.class,IState.class,RequestInfo.class).
newInstance(this.log,this,state,requestInfo);
}catch(Exception e){
throw new ProtocolException(e.getMessage(),e);
}
}
@Override
public IConfigIntegrationReader getCachedConfigIntegrationReader(Object configReader, RequestInfo requestInfo) throws ProtocolException{
try{
Class<?> cConfigurazionePdDManager = Class.forName("org.openspcoop2.pdd.config.ConfigurazionePdDManager");
Class<?> c = Class.forName("org.openspcoop2.pdd.config.CachedConfigIntegrationReader");
return (IConfigIntegrationReader) c.getConstructor(Logger.class,IProtocolFactory.class,cConfigurazionePdDManager,RequestInfo.class).
newInstance(this.log,this,configReader,requestInfo);
}catch(Exception e){
throw new ProtocolException(e.getMessage(),e);
}
}
}