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

prerna.util.gson.IHeadersDataRowAdapter Maven / Gradle / Ivy

The newest version!
package prerna.util.gson;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Base64;

import com.google.gson.GsonBuilder;
import com.google.gson.JsonParser;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;

import prerna.engine.api.IHeadersDataRow;

public class IHeadersDataRowAdapter extends AbstractSemossTypeAdapter {
	
	private enum ValueType {

		// String
		STRING,
		
		// Null
		NULL,
		
		// The primitive types
		INT,
		DOUBLE,
		LONG,
		FLOAT,
		BOOLEAN,
		CHAR,
		BYTE,
		SHORT,
		
		// Anything else
		ENCODED;
	}
	
	@Override
	public IHeadersDataRow read(JsonReader in) throws IOException {
		if (in.peek() == JsonToken.NULL) {
			in.nextNull();
			return null;
		}
		
		// should start with the type
		in.beginObject();
		if (in.peek() != JsonToken.NAME || !in.nextName().equals("type")) {
			throw new IllegalArgumentException("Header is not serialized properly. Must start with type.");
		}

		String headerTypeString = in.nextString();
		IHeadersDataRow.HEADERS_DATA_ROW_TYPE headerType = IHeadersDataRow.convertStringToHeaderType(headerTypeString);
		
		TypeAdapter reader = IHeadersDataRow.getAdapterForHeader(headerType);
		return reader.read(in);
	}
	
	@Override
	public void write(JsonWriter out, IHeadersDataRow value) throws IOException {
		if (value == null) {
			out.nullValue();
			return;
		}
		
		// go to the specific instance impl to write it
		IHeadersDataRow.HEADERS_DATA_ROW_TYPE headerType = value.getHeaderType();
		TypeAdapter reader = IHeadersDataRow.getAdapterForHeader(headerType);
				
		reader.write(out, value);
	}
	
	//////////////////////////////////////////////////////////////////////////////////////////
	///////////////// Methods for serializing and deserializing row values ///////////////////
	
	public static SerializedValuesAndTypes serializeValues(Object[] values) {
		return new SerializedValuesAndTypes(values);
	}
	
	public static Object[] deserializeValues(String[] serializedValues, String[] serializedValueTypes) {
		Object[] deserializedValues = new Object[serializedValues.length];
		for (int i = 0; i < serializedValues.length; i++) {
			ValueType valueType = ValueType.valueOf(serializedValueTypes[i]);
			String serializedValue = serializedValues[i];
			switch (valueType) {
				case STRING:
					deserializedValues[i] = serializedValue;
					break;
				case NULL:
					deserializedValues[i] = null;
					break;
				case INT:
					deserializedValues[i] = Integer.parseInt(serializedValue);
					break;
				case DOUBLE:
					deserializedValues[i] = Double.parseDouble(serializedValue);
					break;
				case LONG:
					deserializedValues[i] = Long.parseLong(serializedValue);
					break;
				case FLOAT:
					deserializedValues[i] = Float.parseFloat(serializedValue);
					break;
				case BOOLEAN:
					deserializedValues[i] = Boolean.parseBoolean(serializedValue);
					break;
				case CHAR:
					deserializedValues[i] = serializedValue.charAt(0);
					break;
				case BYTE:
					deserializedValues[i] = Byte.parseByte(serializedValue);
					break;
				case SHORT:
					deserializedValues[i] = Short.parseShort(serializedValue);
					break;
				case ENCODED:
					deserializedValues[i] = fromEncodedString(serializedValue);
					break;
				default:
					deserializedValues[i] = serializedValue;
					break;
			}
		}
		return deserializedValues;
	}
		
	public static class SerializedValuesAndTypes {
		
		private String[] serializedValues;
		private String[] serializedValueTypes;
		
		public SerializedValuesAndTypes(Object[] values) {
			serializedValueTypes = new String[values.length];
			serializedValues = new String[values.length];
			for (int i = 0; i < values.length; i++) {
				Object value = values[i];
				if (value == null) {
					serializedValueTypes[i] = ValueType.NULL.name();
					serializedValues[i] = null;
				} else if (value instanceof String) {
					serializedValueTypes[i] = ValueType.STRING.name();
					serializedValues[i] = value.toString();
				} else if (value instanceof Integer) {
					serializedValueTypes[i] = ValueType.INT.name();
					serializedValues[i] = value.toString();
				} else if (value instanceof Double) {
					serializedValueTypes[i] = ValueType.DOUBLE.name();
					serializedValues[i] = value.toString();
				} else if (value instanceof Long) {
					serializedValueTypes[i] = ValueType.LONG.name();
					serializedValues[i] = value.toString();
				} else if (value instanceof Float) {
					serializedValueTypes[i] = ValueType.FLOAT.name();
					serializedValues[i] = value.toString();
				} else if (value instanceof Boolean) {
					serializedValueTypes[i] = ValueType.BOOLEAN.name();
					serializedValues[i] = value.toString();
				} else if (value instanceof Character) {
					serializedValueTypes[i] = ValueType.CHAR.name();
					serializedValues[i] = value.toString();
				} else if (value instanceof Byte) {
					serializedValueTypes[i] = ValueType.BYTE.name();
					serializedValues[i] = value.toString();
				} else if (value instanceof Short) {
					serializedValueTypes[i] = ValueType.SHORT.name();
					serializedValues[i] = value.toString();
				} else {
					serializedValueTypes[i] = ValueType.ENCODED.name();
					serializedValues[i] = toEncodedString(value);
				}
			}
		}
		
		public String[] getSerializedValues() {
			return serializedValues;
		}
		
		public String[] getSerializedValueTypes() {
			return serializedValueTypes;
		}
	}
	
	//////////////////////////////////////////////////////////////////////////////////////////
	//////////////////////////////// Helper methods //////////////////////////////////////////
	
	private static Object fromEncodedString(String s) {
		if (s == null) {
			return null;
		} else try {
			byte[] data = Base64.getDecoder().decode(s);
			ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data));
			Object o = ois.readObject();
			ois.close();
			return o;
		} catch (IOException | ClassNotFoundException e) {
			return null;
		}
	}

	private static String toEncodedString(Object o) {
		
		// If null or not serializable, then return null
		if (o == null || !(o instanceof Serializable)) {
			return null;
			
		// Else try encoding in base 64
		} else try {
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			ObjectOutputStream oos = new ObjectOutputStream(baos);
			oos.writeObject(o);
			oos.close();
			return Base64.getEncoder().encodeToString(baos.toByteArray());
		} catch (IOException e) {
			return null;
		}
	}

	public static String toPrettyFormat(String jsonString) {
		return new GsonBuilder().setPrettyPrinting().create()
				.toJson(new JsonParser().parse(jsonString).getAsJsonObject());
	}
	
//	public static void main(String[] args) throws IOException {
//		String[] headers = new String[] {"STRING_H", "NULL_H", "INT_H", "DOUBLE_H", "LONG_H", "FLOAT_H", "BOOLEAN_H", "CHAR_H", "BYTE_H", "SHORT_H", "ENCODED_H"};
//		String[] rawHeaders = new String[] {"R_STRING_H", "R_NULL_H", "R_INT_H", "R_DOUBLE_H", "R_LONG_H", "R_FLOAT_H", "R_BOOLEAN_H", "R_CHAR_H", "R_BYTE_H", "R_SHORT_H", "R_ENCODED_H"};
//		Object[] values = new Object[] {"foo", null, 1, 2.1D, 3L, 4.1F, true, 'a', new Byte("0"), new Short("1"), new Date()};
//		Object[] rawValues = new Object[] {"R_foo", null, 2, 3000000000.0D, 4L, 5.1F, false, 'b', new Byte("1"), new Short("0"), new Date()};
//		System.out.println(">>>");
//		for (int i = 0; i < 3; i++) {
//			SerializedValuesAndTypes result = serializeValues(values);
//			System.out.println(Arrays.toString(values));
//			System.out.println(Arrays.toString(result.getSerializedValues()));
//			System.out.println(Arrays.toString(result.getSerializedValueTypes()));
//			values = deserializeValues(result.getSerializedValues(), result.getSerializedValueTypes());
//			System.out.println(">>>");
//		}
//		IHeadersDataRow dataRow = new HeadersDataRow(headers, rawHeaders, values, rawValues);
//		System.out.println(dataRow.toRawString());
//		System.out.println(">>>");
//		IHeadersDataRowAdapter adapter = new IHeadersDataRowAdapter();
//		System.out.println(toPrettyFormat(adapter.toJson(dataRow)));
//		System.out.println(">>>");
//		IHeadersDataRow dataRow2 = adapter.fromJson(adapter.toJson(dataRow));
//		System.out.println(dataRow2.toRawString());
//		System.out.println(">>>");
//		System.out.println(dataRow.toRawString().equals(dataRow2.toRawString()));
//		System.out.println(">>>");
//	}
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy