<commit_before>/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.ocelotds.marshalling;

import org.ocelotds.marshalling.exceptions.JsonMarshallerException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.StringReader;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonObject;
import javax.json.JsonReader;
import javax.json.JsonValue;
import org.ocelotds.marshalling.annotations.JsonMarshaller;
import org.ocelotds.marshalling.exceptions.JsonMarshallingException;
import org.ocelotds.marshalling.exceptions.JsonUnmarshallingException;

/**
 *
 * @author hhfrancois
 */
public class ArgumentServices {
	
	@Inject
	JsonMarshallerServices jsonMarshallerServices;
	
	@Inject
	ObjectMapper objectMapper;

	public List<String> getJsonParameters(Object[] parameters) throws JsonMarshallingException, JsonMarshallerException, JsonProcessingException {
		List<String> jsonArgs = new ArrayList<>();
		for (Object arg : parameters) {
			if(arg.getClass().isAnnotationPresent(JsonMarshaller.class)) {
				jsonArgs.add(getJsonResultFromSpecificMarshaller(arg.getClass().getAnnotation(JsonMarshaller.class), arg));
			} else {
				jsonArgs.add(objectMapper.writeValueAsString(arg));
			}
		}
		return jsonArgs;
	}
	
	/**
	 *
	 * @param jm
	 * @param result
	 * @return
	 * @throws JsonMarshallingException
	 * @throws org.ocelotds.marshalling.exceptions.JsonMarshallerException
	 */
	public String getJsonResultFromSpecificMarshaller(JsonMarshaller jm, Object result) throws JsonMarshallingException, JsonMarshallerException {
		IJsonMarshaller marshaller = jsonMarshallerServices.getIJsonMarshallerInstance(jm.value());
		String res;
		switch (jm.type()) {
			case LIST:
				res = getJsonResultFromSpecificMarshallerIterable((Iterable) result, marshaller);
				break;
			case MAP:
				res = getJsonResultFromSpecificMarshallerMap((Map) result, marshaller);
				break;
			default:
				res = marshaller.toJson(result);
		}
		return res;
	}

	public String getJsonResultFromSpecificMarshallerIterable(Iterable list, IJsonMarshaller marshaller) throws JsonMarshallingException {
		StringBuilder json = new StringBuilder();
		json.append("[");
		boolean first = true;
		for (Object object : list) {
			if (!first) {
				json.append(",");
			}
			json.append(marshaller.toJson(object));
			first = false;
		}
		json.append("]");
		return json.toString();
	}

	String getJsonResultFromSpecificMarshallerMap(Map map, IJsonMarshaller marshaller) throws JsonMarshallingException {
		StringBuilder json = new StringBuilder();
		json.append("{");
		boolean first = true;
		for (Map.Entry entry : (Set<Map.Entry>) map.entrySet()) {
			if (!first) {
				json.append(",");
			}
			json.append("\"").append(entry.getKey()).append("\"").append(":");
			json.append(marshaller.toJson(entry.getValue()));
			first = false;
		}
		json.append("}");
		return json.toString();
	}
	
	public List getJavaResultFromSpecificUnmarshallerIterable(String json, IJsonMarshaller marshaller) throws JsonUnmarshallingException {
		try {
			List result = new ArrayList<>();
			JsonReader createReader = Json.createReader(new StringReader(json));
			JsonArray readArray = createReader.readArray();
			for (JsonValue jsonValue : readArray) {
				result.add(marshaller.toJava(jsonValue.toString()));
			}
			return result;
		} catch(Throwable t) {
			throw new JsonUnmarshallingException(t.getMessage());
		}
	}

	public Map getJavaResultFromSpecificUnmarshallerMap(String json, IJsonMarshaller marshaller) throws JsonUnmarshallingException {
		try {
			Map<String, Object> result = new HashMap();
			JsonReader createReader = Json.createReader(new StringReader(json));
			JsonObject readObject = createReader.readObject();
			for (Map.Entry<String, JsonValue> entry : readObject.entrySet()) {
				String key = entry.getKey();
				JsonValue jsonValue = entry.getValue();
				result.put(key, marshaller.toJava(jsonValue.toString()));
			}
			return result;
		} catch(Throwable t) {
			throw new JsonUnmarshallingException(t.getMessage());
		}
	}

	public void checkType(Object object, Type paramType) throws JsonUnmarshallingException {
		Class cls;
		if (ParameterizedType.class.isInstance(paramType)) {
			cls = (Class) ((ParameterizedType) paramType).getRawType();
		} else if (Class.class.isInstance(paramType)) {
			cls = (Class) paramType;
		} else { // GenericArrayType, TypeVariable<D>, WildcardType
			throw new JsonUnmarshallingException(object + " is not instance of " + paramType);
		}
		checkClass(object, cls);
	}

	void checkClass(Object object, Class cls) throws JsonUnmarshallingException {
		if (!cls.isInstance(object)) {
			throw new JsonUnmarshallingException(object + " is not instance of " + cls);
		}
	}
}<commit_msg>move getIJsonMarshallerInstance in argumentServices fix getJsonMarshaller from parameters<commit_after>/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.ocelotds.marshalling;

import org.ocelotds.marshalling.exceptions.JsonMarshallerException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.StringReader;
import java.lang.annotation.Annotation;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.enterprise.inject.spi.CDI;
import javax.inject.Inject;
import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonObject;
import javax.json.JsonReader;
import javax.json.JsonValue;
import org.ocelotds.annotations.OcelotLogger;
import org.ocelotds.marshalling.annotations.JsonMarshaller;
import org.ocelotds.marshalling.exceptions.JsonMarshallingException;
import org.ocelotds.marshalling.exceptions.JsonUnmarshallingException;
import org.slf4j.Logger;

/**
 *
 * @author hhfrancois
 */
public class ArgumentServices {

	@Inject
	@OcelotLogger
	Logger logger;

	@Inject
	ObjectMapper objectMapper;

	public List<String> getJsonParameters(Object[] parameters, Annotation[][] annotationss) throws JsonMarshallingException, JsonMarshallerException, JsonProcessingException {
		List<String> jsonArgs = new ArrayList<>();
		int idx = 0;
		for (Object arg : parameters) {
			JsonMarshaller marshaller = getJsonMarshaller(annotationss[idx++]);
			if (marshaller != null) {
				jsonArgs.add(getJsonResultFromSpecificMarshaller(marshaller, arg));
			} else {
				jsonArgs.add(objectMapper.writeValueAsString(arg));
			}
		}
		return jsonArgs;
	}

	JsonMarshaller getJsonMarshaller(Annotation[] annotations) {
		for (Annotation annotation : annotations) {
			if (annotation.annotationType().equals(JsonMarshaller.class)) {
				return (JsonMarshaller) annotation;
			}
		}
		return null;
	}
	
	/**
	 * Get Instance of IJsonMarshaller from CDI
	 * @param cls
	 * @return
	 * @throws JsonMarshallerException 
	 */
	public IJsonMarshaller getIJsonMarshallerInstance(Class<? extends IJsonMarshaller> cls) throws JsonMarshallerException {
		if(logger.isDebugEnabled()) {
			logger.debug("Try to get {} by CDI.select Unsatisfied: {}", cls.getName(), CDI.current().select(cls).isUnsatisfied());
		}
		if(CDI.current().select(cls).isUnsatisfied()) {
			throw new JsonMarshallerException(cls.getName()+" is Unsatisfied");
		}
		return CDI.current().select(cls).get();
	}
	/**
	 *
	 * @param jm
	 * @param result
	 * @return
	 * @throws JsonMarshallingException
	 * @throws org.ocelotds.marshalling.exceptions.JsonMarshallerException
	 */
	public String getJsonResultFromSpecificMarshaller(JsonMarshaller jm, Object result) throws JsonMarshallingException, JsonMarshallerException {
		IJsonMarshaller marshaller = getIJsonMarshallerInstance(jm.value());
		String res;
		switch (jm.type()) {
			case LIST:
				res = getJsonResultFromSpecificMarshallerIterable((Iterable) result, marshaller);
				break;
			case MAP:
				res = getJsonResultFromSpecificMarshallerMap((Map) result, marshaller);
				break;
			default:
				res = marshaller.toJson(result);
		}
		return res;
	}

	public String getJsonResultFromSpecificMarshallerIterable(Iterable list, IJsonMarshaller marshaller) throws JsonMarshallingException {
		StringBuilder json = new StringBuilder();
		json.append("[");
		boolean first = true;
		for (Object object : list) {
			if (!first) {
				json.append(",");
			}
			json.append(marshaller.toJson(object));
			first = false;
		}
		json.append("]");
		return json.toString();
	}

	String getJsonResultFromSpecificMarshallerMap(Map map, IJsonMarshaller marshaller) throws JsonMarshallingException {
		StringBuilder json = new StringBuilder();
		json.append("{");
		boolean first = true;
		for (Map.Entry entry : (Set<Map.Entry>) map.entrySet()) {
			if (!first) {
				json.append(",");
			}
			json.append("\"").append(entry.getKey()).append("\"").append(":");
			json.append(marshaller.toJson(entry.getValue()));
			first = false;
		}
		json.append("}");
		return json.toString();
	}

	public List getJavaResultFromSpecificUnmarshallerIterable(String json, IJsonMarshaller marshaller) throws JsonUnmarshallingException {
		try {
			List result = new ArrayList<>();
			JsonReader createReader = Json.createReader(new StringReader(json));
			JsonArray readArray = createReader.readArray();
			for (JsonValue jsonValue : readArray) {
				result.add(marshaller.toJava(jsonValue.toString()));
			}
			return result;
		} catch (Throwable t) {
			throw new JsonUnmarshallingException(t.getMessage());
		}
	}

	public Map getJavaResultFromSpecificUnmarshallerMap(String json, IJsonMarshaller marshaller) throws JsonUnmarshallingException {
		try {
			Map<String, Object> result = new HashMap();
			JsonReader createReader = Json.createReader(new StringReader(json));
			JsonObject readObject = createReader.readObject();
			for (Map.Entry<String, JsonValue> entry : readObject.entrySet()) {
				String key = entry.getKey();
				JsonValue jsonValue = entry.getValue();
				result.put(key, marshaller.toJava(jsonValue.toString()));
			}
			return result;
		} catch (Throwable t) {
			throw new JsonUnmarshallingException(t.getMessage());
		}
	}

	public void checkType(Object object, Type paramType) throws JsonUnmarshallingException {
		Class cls;
		if (ParameterizedType.class.isInstance(paramType)) {
			cls = (Class) ((ParameterizedType) paramType).getRawType();
		} else if (Class.class.isInstance(paramType)) {
			cls = (Class) paramType;
		} else { // GenericArrayType, TypeVariable<D>, WildcardType
			throw new JsonUnmarshallingException(object + " is not instance of " + paramType);
		}
		checkClass(object, cls);
	}

	void checkClass(Object object, Class cls) throws JsonUnmarshallingException {
		if (!cls.isInstance(object)) {
			throw new JsonUnmarshallingException(object + " is not instance of " + cls);
		}
	}
}
{'fraction_non_alphanumeric': 0.11392738116119978, 'fraction_numerical': 0.0008770391159445711, 'mean_word_length': 4.9984218832193585, 'pattern_counts': {'":': 2, '<': 20, '<?xml version=': 0, '>': 20, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 4}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6273694', 'n_tokens_mistral': 3761, 'n_tokens_neox': 3495, 'n_words': 758}