/*******************************************************************************
* Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2019)
*
* contact.vitam@culture.gouv.fr
*
* This software is a computer program whose purpose is to implement a digital archiving back-office system managing
* high volumetry securely and efficiently.
*
* This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free
* software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as
* circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info".
*
* As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license,
* users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the
* successive licensors have only limited liability.
*
* In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or
* developing or reproducing the software by the user in light of its specific status of free software, that may mean
* that it is complicated to manipulate, and that also therefore means that it is reserved for developers and
* experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the
* software's suitability as regards their requirements in conditions enabling the security of their systems and/or data
* to be ensured and, more generally, to use and operate it in the same conditions as regards security.
*
* The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you
* accept its terms.
*******************************************************************************/
/**
*
*/
package fr.gouv.vitam.common.database.parser.request;
import java.util.Iterator;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import fr.gouv.vitam.common.LocalDateUtil;
import fr.gouv.vitam.common.ParametersChecker;
import fr.gouv.vitam.common.database.builder.query.Query;
import fr.gouv.vitam.common.database.builder.request.configuration.GlobalDatas;
import fr.gouv.vitam.common.exception.InvalidParseOperationException;
/**
* Configuration for Parser
*
*/
public class GlobalDatasParser extends GlobalDatas {
/**
* Default limit for Request (sanity check)
*/
public static final int DEFAULT_LIMIT_REQUEST = 100000000;
/**
* Default limit for Request (sanity check)
*/
public static int limitRequest = DEFAULT_LIMIT_REQUEST;// NOSONAR Change can be done
/**
* Default limit for number of projections
*/
public static final int NB_ACTIONS = 10000;
/**
* Default max depth: should be 20 but let a great margin
*/
public static final int MAXDEPTH = 100;
protected GlobalDatasParser() {
// empty
}
/**
* Check the Request if conforms to sanity check
*
* @param arg String
* @throws InvalidParseOperationException if the sanity check is in error
*/
public static final void sanityRequestCheck(String arg)
throws InvalidParseOperationException {
GlobalDatas.sanityCheck(arg, GlobalDatasParser.limitRequest);
}
/**
* calculate JsonNode depth
*
* @param jsonNode JsonNode
* @return number of child of JsonNode
*/
public static final int getJsonNodedepth(JsonNode jsonNode) {
ParametersChecker.checkParameter("jsonNode is a mandatory parameter", jsonNode);
int depth = 0;
boolean hasArrayNode = false;
final Iterator<JsonNode> iterator = jsonNode.iterator();
while (iterator.hasNext()) {
final JsonNode node = iterator.next();
if (node instanceof ObjectNode || node instanceof ArrayNode) {
final int tempDepth = getJsonNodedepth(node);
if (tempDepth > depth) {
depth = tempDepth;
}
}
if (node instanceof ArrayNode) {
hasArrayNode = true;
}
}
if (hasArrayNode) {
return depth;
} else {
return 1 + depth;
}
}
/**
*
* @param value JsonNode
* @return the Object for Value
* @throws InvalidParseOperationException if value could not parse to JSON
*/
public static final Object getValue(final JsonNode value)
throws InvalidParseOperationException {
if (value == null || value.isArray()) {
throw new InvalidParseOperationException("Not correctly parsed");
}
if (value.isBoolean()) {
return value.asBoolean();
} else if (value.isFloat()) {
return value.floatValue();
} else if (value.isInt()) {
return value.asInt();
} else if (value.isDouble()) {
return value.asDouble();
} else if (value.canConvertToLong()) {
return value.asLong();
} else if (value.has(Query.DATE)) {
return LocalDateUtil.getDate(value.get(Query.DATE).asText());
} else {
return value.asText();
}
}
}