Canigó. Configuració ruta definició client axis2 mòduls PICA

Darrera actualització: 15-12-2022

Introducció

L’objectiu d’aquest article és mostrar com configurar la ruta de la definició del client axis2 als mòduls de la PICA per a projectes generats amb una versió del Framework Canigó inferior a la v.3.6.5.

Justificació

Els mòduls de Canigó associats a la PICA utilitzen la versió 1.9.2 del client de la PICA, el qual no permet configurar la ruta de la definició del client axis2 que, per defecte, té el següent valor: /WEB-INF/classes!/axis2client/. Aquesta configuració per defecte produeix un error en desplegar un projecte amb contenidors web embeguts (per exemple tomcat) utilitzant Spring Boot pel fet que no és possible trobar la ruta /WEB-INF/classes!/axis2client/ dins del jar que conté l’aplicació.


Per a corregir aquest error sense actualitzar la versió de Canigó, serà necessari:
  • excloure manualment la versió 1.9.2 del client de la PICA,

  • incloure la versió 1.10.0 del mateix client,

  • reescriure el servei del connector de Canigó de la Pica: PicaServiceWrapperImpl.java, i

  • modificar algunes configuracions de beans i properties.

Passos a seguir

Modificar l’arxiu pom.xml

Cal excloure la versió 1.9.2 i incloure la versió 1.10.0 del client de la PICA.

...
  <properties>
    ...
    <api.pica.version>1.10.0</api.pica.version>
    ...
  </properties>
  <dependencies>
    ...
    <dependency>
      <groupId>cat.gencat.ctti</groupId>
      <artifactId>canigo.integration.pica</artifactId>
      <version>${canigo.integration.pica.version}</version>
      <exclusions>
        <exclusion>
          <groupId>PICA</groupId>
          <artifactId>api-pica</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>PICA</groupId>
      <artifactId>api-pica</artifactId>
      <version>${api.pica.version}</version>
    </dependency>
    ...
  </dependencies>
...

El pom.xml anterior fa referència a l’ús del mòdul: canigo.integration.pica. En cas d’utilitzar qualsevol altre mòdul d’integració de canigó i la pica, s’ha d’agregar la corresponent dependència en comptes de canigo.integration.pica.

Modificar l’arxiu pica.properties

Cal afegir la propietat que conté la ruta de l’especificació d’axis2.

...
*.pica.axisdefinition.location=classpath:axis2client/
...

Reescriure el servei del connector de la PICA

Cal crear la classe: PicaWithAxisDefinitionServiceWrapperImpl.java que sobreescriu la classe original de Canigó: PicaServiceWrapperImpl.java.

package cat.gencat.ctti.canigo.arch.integration.pica;

...

public class PicaWithAxisDefinitionServiceWrapperImpl implements IPicaServiceWrapper, InitializingBean {
  private static final Logger log = LoggerFactory.getLogger(PicaWithAxisDefinitionServiceWrapperImpl.class);
  private static final String PICA_PARAMS_SSL_INCOMPLETS = "pica.params.ssl.incomplets";
  private static final String PICA_EXCEPCIO = "pica.excepcio";
  private static final String PICA_MODALITAT_INDEFINIDA = "pica.modalitat.indefinida";

  private HashMap<String, ProducteModalitat> modalitats = new HashMap<>();
  private Requeridor requeridor;
  private Resource axisDefinition;
  private String trustStoreSSLKeystore;
  private String trustStoreSSLKeystoreType;
  private String trustStoreSSLKeystorePassword;

  public void afterPropertiesSet() {
    if (StringUtils.hasText(trustStoreSSLKeystore) && StringUtils.hasText(trustStoreSSLKeystorePassword)
      && StringUtils.hasText(trustStoreSSLKeystoreType)) {
      SSLConfiguration.setTrustStoreSSLKeystore(trustStoreSSLKeystore);
      SSLConfiguration.setTrustStoreSSLKeystoreType(trustStoreSSLKeystoreType);
      SSLConfiguration.setTrustStoreSSLKeystorePassword(trustStoreSSLKeystorePassword);
      SSLConfiguration.initSSL();
    } else {
      log.info(PICA_PARAMS_SSL_INCOMPLETS);
    }
    log.info("PICA module loaded...");
  }

  public IPICAServiceSincron getPicaWebServiceSincronInstance(String modalitat) {
    if (modalitats.containsKey(modalitat)) {
      IPICAWithAxisDefinitionServiceSincron result;
      result = new PICAWithAxisDefinitionWebServiceSincron();
      result.setProducteModalitat(modalitats.get(modalitat));
      result.setRequeridor(requeridor);
      result.setAxisDefinition(axisDefinition);
      return result;
    }
    throw new WrappedCheckedException(prepareDetails(PICA_MODALITAT_INDEFINIDA));
  }

  public IPICAServiceAsincron getPicaWebServiceAsincronInstance(String modalitat) {
    if (modalitats.containsKey(modalitat)) {
      IPICAWithAxisDefinitionServiceAsincron result;
      result = new PICAWithAxisDefinitionWebServiceAsincron();
      result.setProducteModalitat(modalitats.get(modalitat));
      result.setRequeridor(requeridor);
      result.setAxisDefinition(axisDefinition);
      return result;
    }
    throw new WrappedCheckedException(prepareDetails(PICA_MODALITAT_INDEFINIDA));
  }

  ExceptionDetails prepareDetails(String errorMessage) {
    return new ExceptionDetails(Objects.requireNonNullElse(errorMessage, PICA_EXCEPCIO));
  }

  ExceptionDetails prepareDetails() {
    return prepareDetails(null);
  }

  public CridaSincronaResponseDocument ferPeticioAlServei(IPICAServiceSincron serviceSincron) {
    try {
      return serviceSincron.ferPeticioAlServei();
    } catch (PICAException e) {
      throw new WrappedCheckedException(e, prepareDetails(PICAExceptionUtils.getOriginalCause(e)));
    }
  }

  public CridaAsincronaResponseDocument ferPeticioAlServei(IPICAServiceAsincron serviceAsincron) {
    try {
      return serviceAsincron.ferPeticioAlServei();
    } catch (PICAException e) {
      throw new WrappedCheckedException(e, prepareDetails(PICAExceptionUtils.getOriginalCause(e)));
    }
  }

  public List<DadesEspecifiques> extreuDadesEspecifiques(IPICAServiceSincron service, CridaSincronaResponseDocument resposta) {
    try {
      return service.getDadesEspecifiquesResposta(resposta);
    } catch (PICAException e) {
      throw new WrappedCheckedException(e, prepareDetails(e.getMessage()));
    }
  }

  public List<DadesEspecifiques> extreuDadesEspecifiques(IPICAServiceAsincron service, ObtindreResultatResponseDocument resposta) {
    try {
      return service.getDadesEspecifiquesResposta(resposta);
    } catch (PICAException e) {
      throw new WrappedCheckedException(e, prepareDetails(e.getMessage()));
    }
  }

  public EstatAsincron extreuEstatPeticio(IPICAServiceAsincron serviceAsincron, ObtindreResultatResponseDocument resposta) {
    try {
      return serviceAsincron.getEstatPeticio(resposta);
    } catch (PICAException e) {
      throw new WrappedCheckedException(e, prepareDetails(e.getMessage()));
    }
  }

  public EstatAsincron extreuEstatPeticio(IPICAServiceAsincron serviceAsincron, CridaAsincronaResponseDocument resposta) {
    try {
      return serviceAsincron.getEstatPeticio(resposta);
    } catch (PICAException e) {
      throw new WrappedCheckedException(e, prepareDetails(e.getMessage()));
    }
  }

  public ObtindreResultatResponseDocument obtenirResultatPeticio(IPICAServiceAsincron serviceAsincron) {
    try {
      return serviceAsincron.obtindreResultatPeticio();
    } catch (PICAServiceException e) {
      throw new WrappedCheckedException(e, prepareDetails());
    }
  }

  public HashMap<String, ProducteModalitat> getModalitats() {
    return modalitats;
  }

  /* getters and setters */
}

Afegir un bean que invoqui al servei creat

Cal modificar l’arxiu de configuració de beans de l’aplicació: app-integration-custom.xml, per a incorporar un bean que gestioni el servei: PicaWithAxisDefinitionServiceWrapperImpl.java.

<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
  ...
  <bean abstract="true" id="abstractPicaWithAxisDefinitionService"
        class="cat.gencat.ctti.canigo.arch.integration.pica.PicaWithAxisDefinitionServiceWrapperImpl"
        scope="prototype">
    <description>Abstract pica service with default configuration</description>
    <property name="trustStoreSSLKeystore" value="${pica.trustStore.location}"/>
    <property name="trustStoreSSLKeystoreType" value="${pica.trustStore.type}"/>
    <property name="trustStoreSSLKeystorePassword" value="${pica.trustStore.password}"/>
    <property name="axisDefinition" value="${pica.axisdefinition.location}"/>
    <property name="requeridor" ref="requeridor"/>
  </bean>

  <bean id="picaService" parent="abstractPicaWithAxisDefinitionService"
        class="cat.gencat.ctti.canigo.arch.integration.pica.PicaWithAxisDefinitionServiceWrapperImpl"
        scope="prototype">
    <property name="requeridor" ref="requeridor"/>
    <property name="modalitats">
      <map>
        ...
      </map>
    </property>
  </bean>
</beans>

Conclusió

És possible configurar la ruta de la definició del client axis2 a projectes existents amb Canigó 3.4.x o 3.6.x sense haver d’actualitzar el connector de la PICA de Canigó.