ApiSchemaTypeRestriction.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.utils.rest.api;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import org.openspcoop2.utils.UtilsException;
import org.openspcoop2.utils.beans.BaseBean;
/**
* ApiSchemaTypeRestriction
*
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class ApiSchemaTypeRestriction extends BaseBean implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Object schema;
private String format;
private String type;
// ** STYLE e EXPLODE **
private Boolean arrayParameter;
private String style;
private String explode;
// ** NUMBER **
// minimum ≤ value ≤ maximum
private BigDecimal minimum;
private BigDecimal maximum;
/*
* exclusiveMinimum: false or not included value ≥ minimum
* exclusiveMinimum: true value > minimum
* exclusiveMaximum: false or not included value ≤ maximum
* exclusiveMaximum: true value < maximum
*/
private Boolean exclusiveMinimum;
private Boolean exclusiveMaximum;
// The example 10 above matches 10, 20, 30, 0, -10, -20, and so on.
// The value of multipleOf must be a positive number, that is, you cannot use multipleOf: -5.
private BigDecimal multipleOf;
// ** STRING **
private Long minLength;
private Long maxLength;
/*
* Note that the regular expression is enclosed in the ^…$ tokens, where ^ means the beginning of the string, and $ means the end of the string.
* Without ^…$, pattern works as a partial match, that is, matches any string that contains the specified regular expression.
* For example, pattern: pet matches pet, petstore and carpet. The ^…$ token forces an exact match.
**/
private String pattern;
// ** ENUM **
private List<?> enumValues;
private static final String TYPE = "type";
private static final String TYPE_OBJECT = "object";
private static final String TYPE_ARRAY = "array";
private static final String FORMAT = "format";
private static final String MINIMUM = "minimum";
private static final String EXCLUSIVE_MINIMUM = "exclusiveMinimum";
private static final String MAXIMUM = "maximum";
private static final String EXCLUSIVE_MAXIMUM = "exclusiveMaximum";
private static final String MULTIPLE_OF = "multipleOf";
private static final String MIN_LENGTH = "minLength";
private static final String MAX_LENGTH = "maxLength";
private static final String PATTERN = "pattern";
private static final String ENUM_VALUES = "enumValues";
private static final String ARRAY_PARAMETER = "arrayParameter";
private static final String STYLE = "style";
private static final String STYLE_PATH_SIMPLE = "simple";
private static final String STYLE_PATH_LABEL = "label";
private static final String STYLE_PATH_MATRIX = "matrix";
private static final String STYLE_QUERY_FORM = "form";
private static final String STYLE_QUERY_SPACE_DELIMITED = "spaceDelimited";
private static final String STYLE_QUERY_PIPE_DELIMITED = "pipeDelimited";
private static final String STYLE_QUERY_DEEP_OBJECT = "deepObject";
private static final String STYLE_HEADER_SIMPLE = "simple";
private static final String STYLE_COOKIE_FORM = "form";
private static final String EXPLODE = "explode";
public static ApiSchemaTypeRestriction toApiSchemaTypeRestriction(String restriction) throws UtilsException {
if(restriction!=null) {
restriction = restriction.trim();
}
if(restriction==null || "".equals(restriction) || !restriction.contains("=")) {
throw new UtilsException("Formato non valido");
}
ApiSchemaTypeRestriction schema = new ApiSchemaTypeRestriction();
String [] tmp = restriction.split(";");
if(tmp==null || tmp.length<=0) {
throw new UtilsException("Formato non valido");
}
for (int i = 0; i < tmp.length; i++) {
String regola = tmp[i];
if(regola!=null) {
regola = regola.trim();
}
if(regola==null || "".equals(regola) || !regola.contains("=")) {
throw new UtilsException("Formato non valido (trovata regola '"+regola+"' senza '=')");
}
String [] nomeValore = regola.split("=");
if(nomeValore==null || nomeValore.length!=2) {
throw new UtilsException("Formato non valido (regola '"+regola+"'); atteso tipo=restrizione");
}
String tipo = nomeValore[0];
if(tipo!=null) {
tipo = tipo.trim();
}
if(tipo==null || "".equals(tipo)) {
throw new UtilsException("Formato non valido (regola '"+regola+"'); atteso tipo=restrizione");
}
String restrizione = nomeValore[1];
if(restrizione!=null) {
restrizione = restrizione.trim();
}
if(restrizione==null || "".equals(restrizione)) {
throw new UtilsException("Formato non valido (regola '"+regola+"'); atteso tipo=restrizione");
}
try {
if(TYPE.equalsIgnoreCase(tipo)) {
schema.setType(restrizione);
}
else if(FORMAT.equalsIgnoreCase(tipo)) {
schema.setFormat(restrizione);
}
else if(MINIMUM.equalsIgnoreCase(tipo)) {
schema.setMinimum(new BigDecimal(restrizione));
}
else if(EXCLUSIVE_MINIMUM.equalsIgnoreCase(tipo)) {
schema.setExclusiveMinimum(Boolean.parseBoolean(restrizione));
}
else if(MAXIMUM.equalsIgnoreCase(tipo)) {
schema.setMaximum(new BigDecimal(restrizione));
}
else if(EXCLUSIVE_MAXIMUM.equalsIgnoreCase(tipo)) {
schema.setExclusiveMaximum(Boolean.parseBoolean(restrizione));
}
else if(MULTIPLE_OF.equalsIgnoreCase(tipo)) {
schema.setMultipleOf(new BigDecimal(restrizione));
}
else if(MIN_LENGTH.equalsIgnoreCase(tipo)) {
schema.setMinLength(Long.valueOf(restrizione));
}
else if(MAX_LENGTH.equalsIgnoreCase(tipo)) {
schema.setMaxLength(Long.valueOf(restrizione));
}
else if(PATTERN.equalsIgnoreCase(tipo)) {
schema.setPattern(restrizione);
}
else if(ENUM_VALUES.equalsIgnoreCase(tipo)) {
String [] values = restrizione.split(",");
if(values!=null && values.length>0) {
List<String> l = new ArrayList<>();
for (String v : values) {
if(v!=null) {
v = v.trim();
l.add(v);
}
}
if(!l.isEmpty()) {
schema.setEnumValues(l);
}
}
}
else if(ARRAY_PARAMETER.equalsIgnoreCase(tipo)) {
schema.setArrayParameter(Boolean.parseBoolean(restrizione));
}
else if(STYLE.equalsIgnoreCase(tipo)) {
schema.setStyle(restrizione);
}
else if(EXPLODE.equalsIgnoreCase(tipo)) {
schema.setExplode(restrizione);
}
else {
throw new UtilsException("Trovata regola '"+regola+"' con un tipo '"+tipo+"' sconosciuto");
}
}
catch(UtilsException u) {
throw u;
}
catch(Exception e) {
throw new UtilsException("Trovata regola '"+regola+"' con una restrizione non valida: "+e.getMessage());
}
}
return schema;
}
public static String toString(ApiSchemaTypeRestriction restriction) throws UtilsException {
return restriction.toString();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
if(this.type!=null) {
sb.append(TYPE).append("=").append(this.type);
}
if(this.format!=null) {
if(sb.length()>0) {
sb.append("; ");
}
sb.append(FORMAT).append("=").append(this.format);
}
if(this.minimum!=null) {
if(sb.length()>0) {
sb.append("; ");
}
sb.append(MINIMUM).append("=").append(this.minimum);
}
if(this.exclusiveMinimum!=null) {
if(sb.length()>0) {
sb.append("; ");
}
sb.append(EXCLUSIVE_MINIMUM).append("=").append(this.exclusiveMinimum);
}
if(this.maximum!=null) {
if(sb.length()>0) {
sb.append("; ");
}
sb.append(MAXIMUM).append("=").append(this.maximum);
}
if(this.exclusiveMaximum!=null) {
if(sb.length()>0) {
sb.append("; ");
}
sb.append(EXCLUSIVE_MAXIMUM).append("=").append(this.exclusiveMaximum);
}
if(this.multipleOf!=null) {
if(sb.length()>0) {
sb.append("; ");
}
sb.append(MULTIPLE_OF).append("=").append(this.multipleOf);
}
if(this.minLength!=null) {
if(sb.length()>0) {
sb.append("; ");
}
sb.append(MIN_LENGTH).append("=").append(this.minLength);
}
if(this.maxLength!=null) {
if(sb.length()>0) {
sb.append("; ");
}
sb.append(MAX_LENGTH).append("=").append(this.maxLength);
}
if(this.pattern!=null) {
if(sb.length()>0) {
sb.append("; ");
}
sb.append(PATTERN).append("=").append(this.pattern);
}
if(this.enumValues!=null && !this.enumValues.isEmpty()) {
if(sb.length()>0) {
sb.append("; ");
}
StringBuilder sbList = new StringBuilder();
for (Object object : this.enumValues) {
if(sbList.length()>0) {
sbList.append(",");
}
sbList.append(object);
}
sb.append(ENUM_VALUES).append("=").append(sbList.toString());
}
if(this.arrayParameter!=null) {
if(sb.length()>0) {
sb.append("; ");
}
sb.append(ARRAY_PARAMETER).append("=").append(this.arrayParameter);
}
if(this.style!=null) {
if(sb.length()>0) {
sb.append("; ");
}
sb.append(STYLE).append("=").append(this.style);
}
if(this.explode!=null) {
if(sb.length()>0) {
sb.append("; ");
}
sb.append(EXPLODE).append("=").append(this.explode);
}
return sb.toString();
}
public Object getSchema() {
return this.schema;
}
public void setSchema(Object schema) {
this.schema = schema;
}
public String getFormat() {
return this.format;
}
public void setFormat(String format) {
this.format = format;
}
public String getType() {
return this.type;
}
public void setType(String type) {
this.type = type;
}
public boolean isTypeObject() {
return TYPE_OBJECT.equals(this.type);
}
public boolean isTypeArray() {
return TYPE_ARRAY.equals(this.type);
}
public BigDecimal getMinimum() {
return this.minimum;
}
public void setMinimum(BigDecimal minimum) {
this.minimum = minimum;
}
public BigDecimal getMaximum() {
return this.maximum;
}
public void setMaximum(BigDecimal maximum) {
this.maximum = maximum;
}
public Boolean getExclusiveMinimum() {
return this.exclusiveMinimum;
}
public void setExclusiveMinimum(Boolean exclusiveMinimum) {
this.exclusiveMinimum = exclusiveMinimum;
}
public Boolean getExclusiveMaximum() {
return this.exclusiveMaximum;
}
public void setExclusiveMaximum(Boolean exclusiveMaximum) {
this.exclusiveMaximum = exclusiveMaximum;
}
public BigDecimal getMultipleOf() {
return this.multipleOf;
}
public void setMultipleOf(BigDecimal multipleOf) {
this.multipleOf = multipleOf;
}
public Long getMinLength() {
return this.minLength;
}
public void setMinLength(Long minLength) {
this.minLength = minLength;
}
public Long getMaxLength() {
return this.maxLength;
}
public void setMaxLength(Long maxLength) {
this.maxLength = maxLength;
}
public String getPattern() {
return this.pattern;
}
public void setPattern(String pattern) {
this.pattern = pattern;
}
public List<?> getEnumValues() {
return this.enumValues;
}
public void setEnumValues(List<?> enumValues) {
this.enumValues = enumValues;
}
public Boolean getArrayParameter() {
return this.arrayParameter;
}
public boolean isArrayParameter() {
return this.arrayParameter!=null && this.arrayParameter;
}
public void setArrayParameter(Boolean arrayParameter) {
this.arrayParameter = arrayParameter;
}
public String getStyle() {
return this.style;
}
public void setStyle(String style) {
this.style = style;
}
public boolean isStylePathSimple() {
return STYLE_PATH_SIMPLE.equals(this.style);
}
public boolean isStylePathLabel() {
return STYLE_PATH_LABEL.equals(this.style);
}
public boolean isStylePathMatrix() {
return STYLE_PATH_MATRIX.equals(this.style);
}
public boolean isStyleQueryForm() {
return STYLE_QUERY_FORM.equals(this.style);
}
public boolean isStyleQuerySpaceDelimited() {
return STYLE_QUERY_SPACE_DELIMITED.equals(this.style);
}
public boolean isStyleQueryPipeDelimited() {
return STYLE_QUERY_PIPE_DELIMITED.equals(this.style);
}
public boolean isStyleQueryDeepObject() {
return STYLE_QUERY_DEEP_OBJECT.equals(this.style);
}
public boolean isStyleHeaderSimple() {
return STYLE_HEADER_SIMPLE.equals(this.style);
}
public boolean isStyleCookieForm() {
return STYLE_COOKIE_FORM.equals(this.style);
}
public String getExplode() {
return this.explode;
}
public void setExplode(String explode) {
this.explode = explode;
}
public boolean isExplodeEnabled() {
return "true".equals(this.explode);
}
public boolean isExplodeDisabled() {
return "false".equals(this.explode);
}
}