All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jeaf.RESTServiceProxy.xpt Maven / Gradle / Ivy

There is a newer version: 1.24.1
Show newest version
«EXTENSION java::GeneratorCommons»
«EXTENSION java::Naming»
«EXTENSION jeaf::RESTFunctions»
«EXTENSION java::OpenAPIFunctions»
«EXTENSION functions::Property»
«EXTENSION functions::Class»
«EXTENSION functions::RESTOperation»

«IMPORT uml»
«IMPORT JMM»

«DEFINE GenerateRESTServiceProxy FOR RESTResource»
  «IF isTargetRuntimeSpring()»
  	«EXPAND GenerateRESTServiceProxySpring»
  «ENDIF»
  «IF isTargetRuntimeJEAF()»
  	«EXPAND GenerateRESTProxyServiceProviderInterface»
  	«EXPAND GenerateRESTProxyServiceProviderFactory»
  	«EXPAND GenerateRESTProxyServiceProviderImpl»
  «ENDIF»
   
«ENDDEFINE»

«DEFINE GenerateRESTProxyServiceProviderInterface FOR RESTResource»
«FILE packagePath()+"/restproxy/"+name+"RESTProxyServiceProvider.java" src_gen»
«getFileHeader()»
package «packageName()».restproxy;

/**
 * Service Provider Interface is generated so that a proxy for a REST Resource can be provided as JEAF Service Provider.
 */
public interface «name»RESTProxyServiceProvider extends com.anaptecs.jeaf.core.api.ServiceProvider {
  «EXPAND JEAFOperation::InterfaceOperation FOREACH this.getAllOperations().typeSelect(RESTOperation)»
}
«ENDFILE»
«ENDDEFINE»

«DEFINE GenerateRESTProxyServiceProviderFactory FOR RESTResource»
«FILE packagePath()+"/restproxy/"+name+"RESTProxyServiceProviderFactory.java" src_gen»
«getFileHeader()»
package «packageName()».restproxy;

import com.anaptecs.jeaf.core.api.ServiceProvider;
import com.anaptecs.jeaf.core.spi.ServiceProviderImplementation;
import com.anaptecs.jeaf.core.servicechannel.api.ServiceProviderFactory;

/**
 * This class is the factory class the service provider implementation {@link «name»RESTProxyServiceProviderImpl}.
 */
@com.anaptecs.jeaf.core.annotations.ServiceProviderFactory
public final class «name»RESTProxyServiceProviderFactory extends ServiceProviderFactory {
  /**
   * Initialize object. No actions have to be performed.
   */
  public «name»RESTProxyServiceProviderFactory( ) {
    // Nothing to do.
  }

  /**
   * Method creates a new instance of the service provider.
   * 
   * @return {@link ServiceProviderImplementation} Instance of service provider. The method never returns null.
   * 
   * @see com.anaptecs.jeaf.core.servicechannel.api.ServiceProviderFactory#createServiceProviderImplementation()
   */
  public ServiceProviderImplementation createServiceProviderImplementation( ) {
    return new «name»RESTProxyServiceProviderImpl();
  }

  /**
   * Method returns the interface of the service provider created by this factory.
   * 
   * @return Class Class object of interface that belongs to the service provider that is created by this factory. The
   * method never returns null.
   * 
   * @see com.anaptecs.jeaf.core.servicechannel.api.ServiceProviderFactory#getServiceProviderInterface()
   */
  public Class getServiceProviderInterface( ) {
    return «packageName()».restproxy.«name»RESTProxyServiceProvider.class;
  }
}
«ENDFILE»
«ENDDEFINE»

«DEFINE GenerateRESTProxyServiceProviderImpl FOR RESTResource»
«FILE packagePath()+"/restproxy/"+name+"RESTProxyServiceProviderImpl.java" src_gen»
«getFileHeader()»
package «packageName()».restproxy;

import com.anaptecs.jeaf.core.api.ServiceProvider;
import com.anaptecs.jeaf.core.spi.ServiceProviderImplementation;
import com.anaptecs.jeaf.core.servicechannel.api.ServiceProviderFactory;

/**
 * Class implements a service provider that acts as proxy for REST service {@link «this.fqn()»}.
 */
public final class «name»RESTProxyServiceProviderImpl implements com.anaptecs.jeaf.core.spi.ServiceProviderImplementation, «packageName()».restproxy.«name»RESTProxyServiceProvider {
  /**
   * REST request executor is used to send REST request to the proxied REST resource. Depending on the Spring
   * configuration the matching implementation will be injected here.
   */
  @com.anaptecs.jeaf.core.annotations.JEAFServiceProvider
  private com.anaptecs.jeaf.rest.executor.api.jeaf.RESTRequestExecutorServiceProvider requestExecutor;
  
  /**
   * Determine configuration of the service provider implementation and initialize httpo client to call REST service. 
   */
  @Override
  public void initialize( ) {
    // Nothing to do.
  }
  
  /**
   * Method checks state of this service provider implementation.
   * 
   * @return {@link HealthCheckResult} Result of the check.
   */
  @Override
  public com.anaptecs.jeaf.xfun.api.health.HealthCheckResult check( com.anaptecs.jeaf.xfun.api.health.CheckLevel pLevel ) {
    return null;
  }
  
  «EXPAND RESTProxyOperationOperation(this) FOREACH this.getAllOperations().typeSelect(RESTOperation)»
}
«ENDFILE»
«ENDDEFINE»



«DEFINE GenerateRESTServiceProxySpring FOR RESTResource»
«FILE packagePath()+"/restproxy/"+name+"RESTProxy.java" src_gen»
«getFileHeader()»
package «packageName()».restproxy;

/**
 * Class implements a proxy for REST Service {@link «this.fqn()»}. The proxy is implemented as Spring services. This way to developers it
 * looks like a plain Spring Service.
 * 
 * This implementation deals with everything that is required to call the external REST service including the following
 * things:
 * 
    *
  • Serialization / deserialization between Java and JSON
  • *
  • Proper connection pooling and timeouts for HTTP requests
  • *
  • Proper setting of HTTP header
  • *
  • Circuit breaker in case of availabilities problems of the REST service
  • *
* * However, as an transactional context can not be propagated to another REST resource developers still have to take care * about proper transaction handling if needed. */ @org.springframework.stereotype.Service public class «name»RESTProxy implements «this.fqn()» { /** * REST request executor is used to send REST request to the proxied REST resource. Depending on the Spring * configuration the matching implementation will be injected here. */ private final com.anaptecs.jeaf.rest.executor.api.RESTRequestExecutor requestExecutor; «IF generateRESTRequestValidation() || generateRESTResponseValidation()» /** * REST Service Proxy was generated with request / response validation enabled. The actual validation will be delegated to the implementation of this interface. */ private final com.anaptecs.jeaf.validation.api.ValidationExecutor validationExecutor; «ENDIF» /** * Initialize object. * * @param pRequestExecutor Dependency on concrete {@link RESTRequestExecutor} implementation that should be used. */ public «name»RESTProxy( com.anaptecs.jeaf.rest.executor.api.RESTRequestExecutor pRequestExecutor «IF generateRESTRequestValidation() || generateRESTResponseValidation()», com.anaptecs.jeaf.validation.api.ValidationExecutor pValidationExecutor«ENDIF» ) { requestExecutor = pRequestExecutor; «IF generateRESTRequestValidation() || generateRESTResponseValidation()» validationExecutor = pValidationExecutor; «ENDIF» } «EXPAND RESTProxyOperationOperation(this) FOREACH this.getAllOperations().typeSelect(RESTOperation)» } «ENDFILE» «ENDDEFINE» «DEFINE RESTProxyOperationOperation(RESTResource service) FOR RESTOperation» «EXPAND functions::Javadoc::JavadocForOperation» «EXPAND java::Helper::GenerateDeprecationAnnotation-» «EXPAND java::Helper::GenerateDeprecationAnnotation FOR this.getReturnResult() -» @Override «visibility» «getReturnTypeName()» «name» («EXPAND jeaf::JEAFOperation::ParameterSignatureNoValidationAnnotation»)«getThrownExceptionsAsString()» { «IF generateRESTRequestValidation() && this.getInputParameters().select(e|e.isParameterSuppressed() == false).isEmpty == false» «IF isTargetRuntimeSpring()» // Validate request parameter(s). validationExecutor.validateRequest(«((NamedElement)owner).fqn()».class, «this.asParameterListNames()»); «ENDIF» «ENDIF» // Create builder for «this.httpMethods.selectFirst(e|e!=null)» request com.anaptecs.jeaf.rest.executor.api.RESTRequest.Builder lRequestBuilder = com.anaptecs.jeaf.rest.executor.api.RESTRequest.builder(«service.fqn()».class, com.anaptecs.jeaf.rest.executor.api.HttpMethod.«this.httpMethods.selectFirst(e|e!=null)», com.anaptecs.jeaf.rest.executor.api.ContentType.JSON); // Build path of request StringBuilder lPathBuilder = new StringBuilder(); «IF service.path.length > 0» lPathBuilder.append("«service.path»"); «ENDIF» «IF this.getRESTOperationPath(service).length > 0» lPathBuilder.append('/'); «FOREACH splitRESTPath(this.getRESTOperationPath(service), this.getAllPathParams(), this.getAllPathParamNamnes()) AS pathPart» lPathBuilder.append(«pathPart»); «ENDFOREACH» «ENDIF» lRequestBuilder.setPath(lPathBuilder.toString()); «IF this.getQueryParams().size > 0 || this.getBeanParams().type.getAllAttributesFromHierarchy().typeSelect(JMM::QueryParam).size > 0» // Add query parameter(s) to request «ENDIF» «FOREACH this.getQueryParams() AS queryParam » «IF queryParam.type.isPrimitiveType() == false || queryParam.isMultivalued()» if («queryParam.name» != null) { «ENDIF» «IF queryParam.isMultivalued() == true && (queryParam.type.isOpenAPIDataType() || queryParam.type.isAnyDateType())» java.util.List lValues = new java.util.ArrayList(); for («queryParam.type.fqn()» lNext : «queryParam.name») { «IF queryParam.type.isOpenAPIDataType()» «IF queryParam.type.getAllAttributesFromHierarchy().select(e|e.isStatic == false).first().type.isPrimitiveType()» lValues.add(String.valueOf(lNext.«queryParam.type.getAllAttributesFromHierarchy().select(e|e.isStatic == false).first().asGetter()»())); «ELSE» «IF queryParam.type.isCompositeDataType()» lValues.add(lNext.get«queryParam.type.getCompositeDateTypePublicFieldName().toFirstUpper()»()); «ELSE» lValues.add(lNext.«queryParam.type.getAllAttributesFromHierarchy().select(e|e.isStatic == false).first().asGetter()»()); «ENDIF»«ENDIF» «ELSE» lValues.add(«EXPAND DateConversionForElement("lNext") FOR queryParam»); «ENDIF» } lRequestBuilder.setQueryParameter("«queryParam.getRESTQueryParamName()»", lValues); «ELSE» lRequestBuilder.setQueryParameter("«queryParam.getRESTQueryParamName()»", «EXPAND QueryParamValueAccessor FOR queryParam»); «ENDIF» «IF queryParam.type.isPrimitiveType() == false || queryParam.isMultivalued()» } «ENDIF» «ENDFOREACH» «FOREACH this.getBeanParams() AS beanParam» «IF beanParam.type.getAllAttributesFromHierarchy().typeSelect(JMM::QueryParam).size > 0» if(«beanParam.name» != null) { «ENDIF» «FOREACH beanParam.type.getAllAttributesFromHierarchy().typeSelect(JMM::QueryParam) AS queryParam» «IF queryParam.type.isPrimitiveType() == false || queryParam.isMultivalued()» if («beanParam.name».«queryParam.asGetter()»() != null) { «ENDIF» «IF queryParam.isMultivalued() == true && (queryParam.type.isOpenAPIDataType() || queryParam.type.isAnyDateType())» java.util.List lValues = new java.util.ArrayList(); for(«queryParam.type.fqn()» lNext : «beanParam.name».«queryParam.asGetter()»()) { «IF queryParam.type.isOpenAPIDataType()» «IF queryParam.type.isCompositeDataType()» lValues.add(lNext.get«queryParam.type.getCompositeDateTypePublicFieldName().toFirstUpper()»()); «ELSE» «IF queryParam.type.getAllAttributesFromHierarchy().select(e|e.isStatic == false).first().type.isPrimitiveType()» lValues.add(String.valueOf(lNext.«queryParam.type.getAllAttributesFromHierarchy().select(e|e.isStatic == false).first().asGetter()»())); «ELSE» lValues.add(lNext.«queryParam.type.getAllAttributesFromHierarchy().select(e|e.isStatic == false).first().asGetter()»().toString()); «ENDIF» «ENDIF» «ELSE» lValues.add(«EXPAND DateConversionForElement("lNext") FOR queryParam»); «ENDIF» } lRequestBuilder.setQueryParameter("«queryParam.getRESTQueryParamName()»", lValues); «ELSE» lRequestBuilder.setQueryParameter("«queryParam.getRESTQueryParamName()»", «EXPAND QueryParamValueAccessorForBeanParam(beanParam) FOR queryParam»); «ENDIF» «IF queryParam.type.isPrimitiveType() == false || queryParam.isMultivalued()» } «ENDIF» «ENDFOREACH» «IF beanParam.type.getAllAttributesFromHierarchy().typeSelect(JMM::QueryParam).size > 0» } «ENDIF» «ENDFOREACH» «IF this.getHeaderParams().size > 0 || this.getBeanParams().type.getAllAttributesFromHierarchy().typeSelect(JMM::HeaderParam).select(e|e.isPropertySuppressed() == false).size > 0» // Set HTTP header(s) «FOREACH this.getHeaderParams() AS headerParam» «IF headerParam.type.isPrimitiveType() == false || headerParam.isMultivalued()» if («headerParam.name» != null) { «ENDIF» «IF headerParam.isMultivalued() == false && headerParam.type.isPrimitiveType() == false» lRequestBuilder.setHeader("«headerParam.getRESTHeaderParamName()»", «EXPAND HeaderParamValueAccessor FOR headerParam»); «ELSE» «IF headerParam.type.isStringType() || headerParam.type.isPrimitiveType() || headerParam.type.isBasicType()» lRequestBuilder.setHeader("«headerParam.getRESTHeaderParamName()»", «headerParam.name»); «ELSE» java.util.List lValues = new java.util.ArrayList(); for («headerParam.type.fqn()» lNext : «headerParam.name») { «IF headerParam.type.isOpenAPIDataType()» «IF headerParam.type.isCompositeDataType()» lValues.add(lNext.get«headerParam.type.getCompositeDateTypePublicFieldName().toFirstUpper()»()); «ELSE» lValues.add(lNext.«headerParam.type.getAllAttributesFromHierarchy().select(e|e.isStatic == false).first().asGetter()»()); «ENDIF» «ELSE» «IF headerParam.type.isAnyDateType()» lValues.add(«EXPAND DateConversionForElement("lNext") FOR headerParam»); «ELSE» lValues.add(lNext); «ENDIF» «ENDIF» } lRequestBuilder.setHeader("«headerParam.getRESTHeaderParamName()»", lValues); «ENDIF» «ENDIF» «IF headerParam.type.isPrimitiveType() == false || headerParam.isMultivalued()» } «ENDIF» «ENDFOREACH» «ENDIF» «FOREACH this.getBeanParams() AS beanParam» «IF beanParam.type.getAllAttributesFromHierarchy().typeSelect(JMM::HeaderParam).select(e|e.isPropertySuppressed() == false).size > 0» if(«beanParam.name» != null) { «IF beanParam.hasParamCustomHeaders()» // First we process custom headers then the explicit ones. for (java.util.Map.Entry lNextEntry : «beanParam.name».getCustomHeaders().entrySet()) { lRequestBuilder.setHeader(lNextEntry.getKey(), lNextEntry.getValue()); } «ENDIF» «ENDIF» «FOREACH beanParam.type.getAllAttributesFromHierarchy().typeSelect(JMM::HeaderParam).select(e|e.isPropertySuppressed() == false) AS headerParam» «IF headerParam.type.isPrimitiveType() == false || headerParam.isMultivalued()» if («beanParam.name».«headerParam.asGetter()»() != null) { «IF headerParam.isMultivalued() == false» lRequestBuilder.setHeader("«headerParam.getRESTHeaderParamName()»", «EXPAND HeaderParamValueAccessorForBeanParam(beanParam) FOR headerParam»); «IF headerParam.type.isPrimitiveType() == false || headerParam.isMultivalued()» } «ENDIF» «ELSE» «IF headerParam.type.isStringType() || headerParam.type.isPrimitiveType()» lRequestBuilder.setHeader("«headerParam.getRESTHeaderParamName()»", «beanParam.name».«headerParam.asGetter()»()); «ELSE» «IF headerParam.type.isBasicType()» lRequestBuilder.setHeader("«headerParam.getRESTHeaderParamName()»", «beanParam.name».«headerParam.asGetter()»()); «ELSE» java.util.List lValues = new java.util.ArrayList(); for («headerParam.type.fqn()» lNext : «beanParam.name».«headerParam.asGetter()»()) { «IF headerParam.type.isOpenAPIDataType()» «IF headerParam.type.isCompositeDataType()» lValues.add(lNext.get«headerParam.type.getCompositeDateTypePublicFieldName().toFirstUpper()»()); «ELSE» lValues.add(lNext.«headerParam.type.getAllAttributesFromHierarchy().select(e|e.isStatic == false).first().asGetter()»()); «ENDIF» «ELSE» «IF headerParam.type.isAnyDateType()» lValues.add(«EXPAND DateConversionForElement("lNext") FOR headerParam»); «ELSE» lValues.add(lNext); «ENDIF» «ENDIF» } lRequestBuilder.setHeader("«headerParam.getRESTHeaderParamName()»", lValues); «ENDIF» «ENDIF» } «ENDIF» «ELSE» «IF headerParam.type.isBooleanType() && headerParam.type.isPrimitiveType()» lRequestBuilder.setHeader("«headerParam.getRESTHeaderParamName()»", «beanParam.name».is«headerParam.name.toFirstUpper()»()); «ELSE» lRequestBuilder.setHeader("«headerParam.getRESTHeaderParamName()»", «beanParam.name».«headerParam.asGetter()»()); «ENDIF» «ENDIF» «ENDFOREACH» «IF beanParam.type.getAllAttributesFromHierarchy().typeSelect(JMM::HeaderParam).select(e|e.isPropertySuppressed() == false).size > 0» } «ENDIF» «ENDFOREACH» «IF this.hasCookieParams()» // Handle cookie parameters «FOREACH this.getCookieParams() AS cookieParam» «IF cookieParam.type.isPrimitiveType() == false» if («cookieParam.name» != null) { «ENDIF» lRequestBuilder.setCookie("«cookieParam.getRESTCookieParamName()»", «EXPAND CookieParamValueAccessor FOR cookieParam»); «IF cookieParam.type.isPrimitiveType() == false» } «ENDIF» «ENDFOREACH» «FOREACH this.getBeanParams() AS beanParam» «IF beanParam.type.getAllAttributesFromHierarchy().typeSelect(JMM::CookieParam).size > 0» if(«beanParam.name» != null) { «ENDIF» «FOREACH beanParam.type.getAllAttributesFromHierarchy().typeSelect(JMM::CookieParam) AS cookieParam» «IF cookieParam.type.isPrimitiveType() == false» if («beanParam.name».«cookieParam.asGetter()»() != null) { «ENDIF» lRequestBuilder.setCookie("«cookieParam.getRESTCookieParamName()»", «EXPAND CookieParamValueAccessorForBeanParam(beanParam) FOR cookieParam»); «IF cookieParam.type.isPrimitiveType() == false» } «ENDIF» «ENDFOREACH» «IF beanParam.type.getAllAttributesFromHierarchy().typeSelect(JMM::CookieParam).size > 0» } «ENDIF» «ENDFOREACH» «ENDIF» «FOREACH this.getRequestBodyParameters() AS body» // Set parameter «body.name» as request body. lRequestBuilder.setBody(«body.name»); «ENDFOREACH» «IF getReturnTypeName() != "void"» // Execute request and return result. «ELSE» // Execute request. «ENDIF» com.anaptecs.jeaf.rest.executor.api.RESTRequest lRequest = lRequestBuilder.build(); «IF getReturnTypeName() != "void"» «IF getReturnType().type.isClass() && getReturnType().type.asClass().templateBinding.isEmpty == false» com.anaptecs.jeaf.rest.executor.api.TypeReference<«getReturnTypeName()»> lTypeReference = new TypeReference<«getReturnTypeName()»>() { }; com.anaptecs.jeaf.rest.executor.api.ObjectType lObjectType = ObjectType.createTypeReferenceObjectType(lTypeReference); «ELSE» com.anaptecs.jeaf.rest.executor.api.ObjectType lObjectType = ObjectType.createObjectType(«getReturnType().type.fqn()».class); «ENDIF» «IF this.getReturnResult().isMultivalued() == false» «IF generateRESTResponseValidation()» «getReturnTypeName()» lResult = requestExecutor.executeSingleObjectResultRequest(lRequest, «this.getHTTPStatusCode()», lObjectType); // Validate response and return it. validationExecutor.validateResponse(«((NamedElement)owner).fqn()».class, lResult); return lResult; «ELSE» return requestExecutor.executeSingleObjectResultRequest(lRequest, «this.getHTTPStatusCode()», lObjectType); «ENDIF» «ELSE» «getReturnTypeName()» lResult = requestExecutor.executeCollectionResultRequest(lRequest, «this.getHTTPStatusCode()», «this.getReturnResult().getCollectionType()».class, lObjectType); if (lResult == null) { lResult = «this.getReturnResult().getEmptyCollectionOperation()»; } «IF generateRESTResponseValidation()» // Validate response and return it. validationExecutor.validateResponse(«((NamedElement)owner).fqn()».class, lResult); «ENDIF» return lResult; «ENDIF» «ELSE» requestExecutor.executeNoResultRequest(lRequest, «this.getHTTPStatusCode()»); «ENDIF» } «ENDDEFINE» «DEFINE QueryParamValueAccessor FOR QueryParam» «IF type.isStringType()» «name» «ELSE» «IF type.isPrimitiveType()» «IF this.isMultivalued() == false» String.valueOf(«name») «ELSE» «name» «ENDIF» «ELSE» «IF type.isOpenAPIDataType()» «IF type.isCompositeDataType()» «name».get«type.getCompositeDateTypePublicFieldName().toFirstUpper()»() «ELSE» «name».«type.getAllAttributesFromHierarchy().select(e|e.isStatic == false).first().asGetter()»() «ENDIF» «ELSE» «IF isTargetRuntimeJEAF()» «IF this.isMultivalued() == false» com.anaptecs.jeaf.xfun.api.XFun.getDatatypeConverterRegistry().getConverter(«type.fqn()».class, String.class).convert(«name») «ELSE» «name» «ENDIF» «ENDIF» «IF isTargetRuntimeSpring()» «IF type.isAnyDateType()» «EXPAND DateConversion FOR this» «ELSE» «IF this.isMultivalued() == false» «name».toString() «ELSE» «name» «ENDIF» «ENDIF» «ENDIF» «ENDIF» «ENDIF» «ENDIF» «ENDDEFINE» «DEFINE QueryParamValueAccessorForBeanParam(uml::Parameter beanParam) FOR QueryParam» «IF type.isStringType()» «beanParam.name».«this.asGetter()»() «ELSE» «IF type.isPrimitiveType()» «IF this.isMultivalued() == false» String.valueOf(«beanParam.name».«this.asGetter()»()) «ELSE» «beanParam.name».«this.asGetter()»() «ENDIF» «ELSE» «IF type.isOpenAPIDataType()» «IF type.isCompositeDataType()» «beanParam.name».«this.asGetter()»().get«type.getCompositeDateTypePublicFieldName().toFirstUpper()»() «ELSE» «beanParam.name».«this.asGetter()»().«type.getAllAttributesFromHierarchy().select(e|e.isStatic == false).first().asGetter()»() «ENDIF» «ELSE» «IF isTargetRuntimeJEAF()» «IF this.isMultivalued() == false» com.anaptecs.jeaf.xfun.api.XFun.getDatatypeConverterRegistry().getConverter(«type.fqn()».class, String.class).convert(«beanParam.name».«this.asGetter()»()) «ELSE» «beanParam.name».«this.asGetter()»() «ENDIF» «ENDIF» «IF isTargetRuntimeSpring()» «IF type.isAnyDateType()» «EXPAND DateConversionForBeanParam(beanParam) FOR this» «ELSE» «IF this.isMultivalued() == false» «beanParam.name».«this.asGetter()»().toString() «ELSE» «beanParam.name».«this.asGetter()»() «ENDIF» «ENDIF» «ENDIF» «ENDIF» «ENDIF» «ENDIF» «ENDDEFINE» «DEFINE HeaderParamValueAccessor FOR HeaderParam» «IF type.isStringType()» «name» «ELSE» «IF type.isPrimitiveType()» String.valueOf(«name») «ELSE» «IF type.isOpenAPIDataType()» «IF type.isCompositeDataType()» «name».get«type.getCompositeDateTypePublicFieldName().toFirstUpper()»() «ELSE» «name».«type.getAllAttributesFromHierarchy().select(e|e.isStatic == false).first().asGetter()»() «ENDIF» «ELSE» «IF isTargetRuntimeJEAF()» «IF this.isMultivalued() == false» com.anaptecs.jeaf.xfun.api.XFun.getDatatypeConverterRegistry().getConverter(«type.fqn()».class, String.class).convert(«name») «ELSE» «name» «ENDIF» «ENDIF» «IF isTargetRuntimeSpring()» «IF type.isAnyDateType()» «EXPAND DateConversion FOR this» «ELSE» «IF this.isMultivalued() == false» «name».toString() «ELSE» «name» «ENDIF» «ENDIF» «ENDIF» «ENDIF» «ENDIF» «ENDIF» «ENDDEFINE» «DEFINE HeaderParamValueAccessorForBeanParam(uml::Parameter beanParam) FOR HeaderParam» «IF type.isStringType()» «beanParam.name».«this.asGetter()»() «ELSE» «IF type.isPrimitiveType()» «IF this.isMultivalued() == false» String.valueOf(«beanParam.name».«this.asGetter()»()) «ELSE» «beanParam.name».«this.asGetter()»() «ENDIF» «ELSE» «IF type.isOpenAPIDataType()» «IF type.isCompositeDataType()» «beanParam.name».«this.asGetter()»().get«type.getCompositeDateTypePublicFieldName().toFirstUpper()»() «ELSE» «beanParam.name».«this.asGetter()»().«type.getAllAttributesFromHierarchy().select(e|e.isStatic == false).first().asGetter()»() «ENDIF» «ELSE» «IF this.isMultivalued() == false» «IF isTargetRuntimeJEAF()» com.anaptecs.jeaf.xfun.api.XFun.getDatatypeConverterRegistry().getConverter(«type.fqn()».class, String.class).convert(«beanParam.name».«this.asGetter()»()) «ENDIF» «IF isTargetRuntimeSpring()» «IF type.isAnyDateType()» «EXPAND DateConversionForBeanParam(beanParam) FOR this» «ELSE» «beanParam.name».«this.asGetter()»().toString() «ENDIF» «ENDIF» «ELSE» «beanParam.name».«this.asGetter()»() «ENDIF» «ENDIF» «ENDIF» «ENDIF» «ENDDEFINE» «DEFINE CookieParamValueAccessor FOR CookieParam» «IF type.isStringType()» «name» «ELSE» «IF type.isPrimitiveType()» String.valueOf(«name») «ELSE» «IF type.isOpenAPIDataType()» «name».«type.getAllAttributesFromHierarchy().select(e|e.isStatic == false).first().asGetter()»() «ELSE» «IF isTargetRuntimeJEAF()» com.anaptecs.jeaf.xfun.api.XFun.getDatatypeConverterRegistry().getConverter(«type.fqn()».class, String.class).convert(«name») «ENDIF» «IF isTargetRuntimeSpring()» «IF type.isAnyDateType()» «EXPAND DateConversion FOR this» «ELSE» «name».toString() «ENDIF» «ENDIF» «ENDIF» «ENDIF» «ENDIF» «ENDDEFINE» «DEFINE CookieParamValueAccessorForBeanParam(uml::Parameter beanParam) FOR CookieParam» «IF type.isStringType()» «beanParam.name».«this.asGetter()»() «ELSE» «IF type.isPrimitiveType()» String.valueOf(«beanParam.name».«this.asGetter()»()) «ELSE» «IF type.isOpenAPIDataType()» «beanParam.name».«this.asGetter()»().«type.getAllAttributesFromHierarchy().select(e|e.isStatic == false).first().asGetter()»() «ELSE» «IF isTargetRuntimeJEAF()» com.anaptecs.jeaf.xfun.api.XFun.getDatatypeConverterRegistry().getConverter(«type.fqn()».class, String.class).convert(«beanParam.name».«this.asGetter()»()) «ENDIF» «IF isTargetRuntimeSpring()» «IF type.isAnyDateType()» «EXPAND DateConversionForBeanParam(beanParam) FOR this» «ELSE» «IF type.isAnyDateType()» «EXPAND DateConversionForBeanParam(beanParam) FOR this» «ELSE» «beanParam.name».«this.asGetter()»().toString() «ENDIF» «ENDIF» «ENDIF» «ENDIF» «ENDIF» «ENDIF» «ENDDEFINE» «DEFINE DateConversion FOR Parameter» «IF type.isOffsetDateTime()» java.time.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(«this.name») «ELSE»«IF type.isOffsetTime()» java.time.format.DateTimeFormatter.ISO_OFFSET_TIME.format(«this.name») «ELSE»«IF type.isLocalDateTime()» java.time.format.DateTimeFormatter.ISO_DATE_TIME.format(«this.name») «ELSE»«IF type.isLocalTime()» java.time.format.DateTimeFormatter.ISO_TIME.format(«this.name») «ELSE»«IF type.isLocalDate()» java.time.format.DateTimeFormatter.ISO_DATE.format(«this.name») «ELSE»«IF type.isCalendar()» new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX").format(«this.name».getTime()) «ELSE»«IF type.isUtilDate()» new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX").format(«this.name») «ELSE»«IF type.isSQLTimestamp() || type.isSQLTime() || type.isSQLDate()» «this.name».toString() «ENDIF»«ENDIF»«ENDIF»«ENDIF»«ENDIF»«ENDIF»«ENDIF»«ENDIF» «ENDDEFINE» «DEFINE DateConversionForBeanParam(uml::Parameter beanParam) FOR Property» «EXPAND DateConversionForElement(beanParam.name + "." + this.asGetter() + "()") FOR this» «ENDDEFINE» «DEFINE DateConversionForElement(String paramName) FOR Property» «IF type.isOffsetDateTime()» java.time.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(«paramName») «ELSE»«IF type.isOffsetTime()» java.time.format.DateTimeFormatter.ISO_OFFSET_TIME.format(«paramName») «ELSE»«IF type.isLocalDateTime()» java.time.format.DateTimeFormatter.ISO_DATE_TIME.format(«paramName») «ELSE»«IF type.isLocalTime()» java.time.format.DateTimeFormatter.ISO_TIME.format(«paramName») «ELSE»«IF type.isLocalDate()» java.time.format.DateTimeFormatter.ISO_DATE.format(«paramName») «ELSE»«IF type.isCalendar()» new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX").format(«paramName».getTime()) «ELSE»«IF type.isUtilDate()» new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX").format(«paramName») «ELSE»«IF type.isSQLTimestamp() || type.isSQLTime() || type.isSQLDate()» «paramName».toString() «ENDIF»«ENDIF»«ENDIF»«ENDIF»«ENDIF»«ENDIF»«ENDIF»«ENDIF» «ENDDEFINE» «DEFINE GenerateRESTServiceProxyConfigFile FOR RESTResource» «IF isTargetRuntimeSpring()» «EXPAND GenerateRESTServiceProxyConfigFileSpring» «ENDIF» «IF isTargetRuntimeJEAF()» «EXPAND GenerateRESTServiceProxyConfigFileJEAF» «ENDIF» «ENDDEFINE» «DEFINE GenerateRESTServiceProxyConfigFileSpring FOR RESTResource» «FILE name.toLowerCase()+"-rest-client.yaml" res» # File contains configuration for external REST resource «this.name» # URL to external service externalServiceURL: TODO: Please configure URL of external REST resource «IF this.usesCookies() -» # Domain of the cookie that is used in requests. cookieDomain: # Path of the cookie that is used in requests. cookiePath: «ENDIF -» # List of http header names that should be considered to be sensitive. sensitiveHeaders: - Authorzation # Parameter defines if http requests should be traced. traceRequests: true # Parameter defines if http responses should be traced. traceResponses: false # Apache HTTP Client configuration httpClientConfiguration: # Maximum size of the connection pool. maxPoolSize: 5 # Maximum amount of idle connections in the connection pool. maxIdleConnections: 5 # Keep alive duration for connection to proxy target (in milliseconds) keepAliveDuration: 20000 # Parameter configures the time period in milliseconds after which a connection is validated before it is taken # from the pool again. validateAfterInactivityDuration: 10000 # Maximum amount of retries before a call to the REST service is considered to be failed. # Be aware that in case of enabled retires server side must support idempotency on writes. maxRetries: 0 # Interval in milliseconds after which the REST service is called again in case that retries are configured. retryInterval: 100 # Response timeout in milliseconds for calls to REST service. Please be aware that this is a very sensitive # parameter and needs to be fine-tuned for your purposes. responseTimeout: 5000 # Timeout in milliseconds to establish connections to the REST service. As connections are pooled this parameter # should not have a too strong influence on the overall behavior. However please ensure that it fits to your # environment. connectTimeout: 2000 # Timeout in milliseconds when requesting a connection from the pool of http connections. This parameter especially # becomes important in cases where a connection pool is configured too small or in cases of unexpected high load. connectionRequestTimeout: 100 # Resilience4J circuit breaker configuration circuitBreakerConfiguration: # Failure rate threshold (percent of requests) defines which amount of failed request must be exceeded due to # technical problems that the circuit breaker opens and no further request will be sent to the REST service. # # Value must between 0 and 100. failureRateThreshold: 5 # Duration in milliseconds that the circuit breaker stays open until request will be sent to the REST service again. # # The value must be zero or greater. durationInOpenState: 20000 # Configures the duration in milliseconds above which calls are considered as slow and increase the slow calls # percentage. # # The value must be zero or greater. slowRequestDuration: 5000 # Configures the slow request threshold in percentage. The circuit breaker considers a call as slow when the call # duration is greater than slowCallDuration. When the percentage of slow calls is equal to or greater # than the threshold, the circuit breaker transitions to open and starts short-circuiting calls. # # Value must between 0 and 100. slowRequestRateThreshold: 30 # Configures the number of permitted calls when the circuit breaker is half open. # # The value must be zero or greater. permittedCallsInHalfOpenState: 2 # Configures the size of the sliding window in seconds which is used to record the outcome of calls when the circuit # breaker is closed. # # The value must be greater than 0. slidingWindowSizeSeconds: 5 «ENDFILE» «ENDDEFINE» «DEFINE GenerateRESTServiceProxyConfigFileJEAF FOR RESTResource» «FILE name.toLowerCase()+"-rest-client.properties" res-» # # File contains configuration for external REST resource «this.name» # # URL to external service externalServiceURL=Please configure URL of external REST resource «IF this.usesCookies() -» # Domain of the cookie that is used in requests. cookieDomain= # Path of the cookie that is used in requests. cookiePath= «ENDIF -» # Comma separated list of http header names that should be considered to be sensitive. sensitiveHeaders=Authorzation # Parameter defines if http requests should be traced. traceRequests=true # Parameter defines if http responses should be traced. traceResponses=false # # Apache HTTP Client configuration # # Maximum size of the connection pool. maxPoolSize=5 # Maximum amount of idle connections in the connection pool. maxIdleConnections=5 # Keep alive duration for connection to proxy target (in milliseconds) keepAliveDuration=20000 # Parameter configures the time period in milliseconds after which a connection is validated before it is taken # from the pool again. validateAfterInactivityDuration=10000 # Maximum amount of retries before a call to the REST service is considered to be failed. # Be aware that in case of enabled retires server side must support idempotency on writes. maxRetries=0 # Interval in milliseconds after which the REST service is called again in case that retries are configured. retryInterval=100 # Response timeout in milliseconds for calls to REST service. Please be aware that this is a very sensitive # parameter and needs to be fine-tuned for your purposes. responseTimeout=5000 # Timeout in milliseconds to establish connections to the REST service. As connections are pooled this parameter # should not have a too strong influence on the overall behavior. However please ensure that it fits to your # environment. connectTimeout=2000 # Timeout in milliseconds when requesting a connection from the pool of http connections. This parameter especially # becomes important in cases where a connection pool is configured too small or in cases of unexpected high load. connectionRequestTimeout: 100 # # Resilience4J circuit breaker configuration # # Failure rate threshold (percent of requests) defines which amount of failed request must be exceeded due to # technical problems that the circuit breaker opens and no further request will be sent to the REST service. # # Value must between 0 and 100. failureRateThreshold=5 # Duration in milliseconds that the circuit breaker stays open until request will be sent to the REST service again. # # The value must be zero or greater. durationInOpenState=20000 # Configures the duration in milliseconds above which calls are considered as slow and increase the slow calls # percentage. # # The value must be zero or greater. slowRequestDuration=5000 # Configures the slow request threshold in percentage. The circuit breaker considers a call as slow when the call # duration is greater than slowCallDuration. When the percentage of slow calls is equal to or greater # than the threshold, the circuit breaker transitions to open and starts short-circuiting calls. # # Value must between 0 and 100. slowRequestRateThreshold=30 # Configures the number of permitted calls when the circuit breaker is half open. # # The value must be zero or greater. permittedCallsInHalfOpenState=2 # Configures the size of the sliding window in seconds which is used to record the outcome of calls when the circuit # breaker is closed. # # The value must be greater than 0. slidingWindowSizeSeconds=5 «ENDFILE» «ENDDEFINE»