RegistryAPI.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.core.registry.rest;
import java.io.Serializable;
import java.net.URL;
import java.util.List;
import javax.xml.namespace.QName;
import org.openspcoop2.core.registry.AccordoServizioParteComune;
import org.openspcoop2.core.registry.Resource;
import org.openspcoop2.core.registry.ResourceParameter;
import org.openspcoop2.core.registry.ResourceRepresentation;
import org.openspcoop2.core.registry.ResourceResponse;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziException;
import org.openspcoop2.utils.UtilsException;
import org.openspcoop2.utils.rest.api.Api;
import org.openspcoop2.utils.rest.api.ApiBodyParameter;
import org.openspcoop2.utils.rest.api.ApiCookieParameter;
import org.openspcoop2.utils.rest.api.ApiHeaderParameter;
import org.openspcoop2.utils.rest.api.ApiOperation;
import org.openspcoop2.utils.rest.api.ApiParameterSchema;
import org.openspcoop2.utils.rest.api.ApiParameterSchemaComplexType;
import org.openspcoop2.utils.rest.api.ApiReference;
import org.openspcoop2.utils.rest.api.ApiRequest;
import org.openspcoop2.utils.rest.api.ApiRequestDynamicPathParameter;
import org.openspcoop2.utils.rest.api.ApiRequestFormParameter;
import org.openspcoop2.utils.rest.api.ApiRequestQueryParameter;
import org.openspcoop2.utils.rest.api.ApiResponse;
import org.openspcoop2.utils.transport.http.HttpRequestMethod;
/**
* RegistryAPI
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class RegistryAPI extends Api implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private AccordoServizioParteComune aspc = null;
public AccordoServizioParteComune getAspc() {
return this.aspc;
}
public RegistryAPI(AccordoServizioParteComune aspc,String baseURL) throws DriverRegistroServiziException {
try {
this.aspc = aspc;
this.setName(aspc.getNome());
this.setDescription(aspc.getDescrizione());
this.setBaseURL(new URL(baseURL));
if(aspc.sizeResourceList()>0) {
for (Resource resource : aspc.getResourceList()) {
HttpRequestMethod httpMethod = null;
if(resource.getMethod()!=null) {
httpMethod = HttpRequestMethod.valueOf(resource.getMethod().getValue());
}
ApiOperation apiOp = new ApiOperation(httpMethod, resource.getPath());
apiOp.setDescription(resource.getDescrizione());
// Richiesta
if(resource.getRequest()!=null) {
apiOp.setRequest(new ApiRequest());
if(resource.getRequest().sizeParameterList()>0) {
initParameterList(resource.getRequest().getParameterList(), apiOp.getRequest(), null);
}
if(resource.getRequest().sizeRepresentationList()>0) {
initRepresentationList(resource.getRequest().getRepresentationList(), apiOp.getRequest(), null);
}
}
// Risposta
if(resource.sizeResponseList()>0) {
for (ResourceResponse response : resource.getResponseList()) {
ApiResponse apiResponse = new ApiResponse();
if(ApiResponse.isDefaultHttpReturnCode(response.getStatus())) {
apiResponse.setDefaultHttpReturnCode();
}
else {
apiResponse.setHttpReturnCode(response.getStatus());
}
apiResponse.setDescription(response.getDescrizione());
if(response.sizeParameterList()>0) {
initParameterList(response.getParameterList(), null, apiResponse);
}
if(response.sizeRepresentationList()>0) {
initRepresentationList(response.getRepresentationList(), null, apiResponse);
}
apiOp.addResponse(apiResponse);
}
}
this.addOperation(apiOp);
}
}
}catch(Exception e) {
throw new DriverRegistroServiziException(e.getMessage(),e);
}
}
private static void initParameterList(List<ResourceParameter> rpList, ApiRequest apiRequest, ApiResponse apiResponse) throws UtilsException {
for (ResourceParameter rp : rpList) {
// ApiSchemaTypeRestriction schema = null;
// if(rp.getRestrizioni()!=null) {
// schema = ApiSchemaTypeRestriction.toApiSchemaTypeRestriction(rp.getRestrizioni());
// }
// if(schema==null) {
// schema = new ApiSchemaTypeRestriction();
// schema.setType(rp.getTipo());
// }
// else if(schema.getType()==null) {
// schema.setType(rp.getTipo());
// }
ApiParameterSchema apiParameterSchema = ApiParameterSchema.toApiParameterSchema(rp.getRestrizioni());
if(apiParameterSchema==null) {
apiParameterSchema = new ApiParameterSchema();
apiParameterSchema.setComplexType(ApiParameterSchemaComplexType.simple);
apiParameterSchema.addType(rp.getTipo(), null);
}
switch (rp.getParameterType()) {
case COOKIE:
ApiCookieParameter cookie = new ApiCookieParameter(rp.getNome(), apiParameterSchema);
cookie.setDescription(rp.getDescrizione());
cookie.setRequired(rp.isRequired());
if(apiRequest!=null) {
apiRequest.addCookieParameter(cookie);
}
else if(apiResponse!=null) {
apiResponse.addCookieParameter(cookie);
}
break;
case DYNAMIC_PATH:
ApiRequestDynamicPathParameter dynamicPath = new ApiRequestDynamicPathParameter(rp.getNome(), apiParameterSchema);
dynamicPath.setDescription(rp.getDescrizione());
dynamicPath.setRequired(rp.isRequired());
if(apiRequest!=null) {
apiRequest.addDynamicPathParameter(dynamicPath);
}
break;
case FORM:
ApiRequestFormParameter form = new ApiRequestFormParameter(rp.getNome(), apiParameterSchema);
form.setDescription(rp.getDescrizione());
form.setRequired(rp.isRequired());
if(apiRequest!=null) {
apiRequest.addFormParameter(form);
}
break;
case HEADER:
ApiHeaderParameter header = new ApiHeaderParameter(rp.getNome(), apiParameterSchema);
header.setDescription(rp.getDescrizione());
header.setRequired(rp.isRequired());
if(apiRequest!=null) {
apiRequest.addHeaderParameter(header);
}
else if(apiResponse!=null) {
apiResponse.addHeaderParameter(header);
}
break;
case QUERY:
ApiRequestQueryParameter query = new ApiRequestQueryParameter(rp.getNome(), apiParameterSchema);
query.setDescription(rp.getDescrizione());
query.setRequired(rp.isRequired());
if(apiRequest!=null) {
apiRequest.addQueryParameter(query);
}
break;
default:
break;
}
}
}
private static void initRepresentationList(List<ResourceRepresentation> rrList, ApiRequest apiRequest, ApiResponse apiResponse) {
for (ResourceRepresentation rr : rrList) {
ApiBodyParameter parameter = new ApiBodyParameter(rr.getNome());
parameter.setDescription(rr.getDescrizione());
parameter.setMediaType(rr.getMediaType());
if(rr.getRepresentationType()!=null) {
switch (rr.getRepresentationType()) {
case JSON:
if(rr.getJson()!=null) {
String tipo = rr.getJson().getTipo();
if(tipo!=null && tipo.contains("#")) {
ApiReference ref = new ApiReference(tipo.split("#")[0], tipo.split("#")[1]);
parameter.setElement(ref);
}
else {
parameter.setElement(tipo);
}
}
break;
case XML:
if(rr.getXml()!=null) {
parameter.setElement(new QName(rr.getXml().getNamespace(),rr.getXml().getNome()));
}
break;
}
}
if(apiRequest!=null) {
apiRequest.addBodyParameter(parameter);
}
else {
apiResponse.addBodyParameter(parameter);
}
}
}
}