/* * Copyright 2010 Proofpoint, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.airlift.event.client; import com.fasterxml.jackson.core.JsonGenerator; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.primitives.Primitives; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.format.DateTimeFormatter; import org.joda.time.format.ISODateTimeFormat; import java.io.IOException; import java.math.BigDecimal; import java.math.BigInteger; import java.net.InetAddress; import java.time.Instant; import java.util.Map; import static java.time.format.DateTimeFormatter.ISO_INSTANT; import static java.util.Objects.requireNonNull; @SuppressWarnings("UnusedDeclaration") enum EventDataType { STRING(String.class) { public void writeFieldValue(JsonGenerator jsonGenerator, Object value) throws IOException { validateFieldValueType(value, String.class); jsonGenerator.writeString((String) value); } }, BOOLEAN(Boolean.class) { public void writeFieldValue(JsonGenerator jsonGenerator, Object value) throws IOException { validateFieldValueType(value, Boolean.class); jsonGenerator.writeBoolean((Boolean) value); } }, BYTE(Byte.class) { public void writeFieldValue(JsonGenerator jsonGenerator, Object value) throws IOException { validateFieldValueType(value, Byte.class); jsonGenerator.writeNumber((Byte) value); } }, SHORT(Short.class) { public void writeFieldValue(JsonGenerator jsonGenerator, Object value) throws IOException { validateFieldValueType(value, Short.class); jsonGenerator.writeNumber((Short) value); } }, INTEGER(Integer.class) { public void writeFieldValue(JsonGenerator jsonGenerator, Object value) throws IOException { validateFieldValueType(value, Integer.class); jsonGenerator.writeNumber((Integer) value); } }, LONG(Long.class) { public void writeFieldValue(JsonGenerator jsonGenerator, Object value) throws IOException { validateFieldValueType(value, Long.class); jsonGenerator.writeNumber((Long) value); } }, FLOAT(Float.class) { public void writeFieldValue(JsonGenerator jsonGenerator, Object value) throws IOException { validateFieldValueType(value, Float.class); jsonGenerator.writeNumber((Float) value); } }, DOUBLE(Double.class) { public void writeFieldValue(JsonGenerator jsonGenerator, Object value) throws IOException { validateFieldValueType(value, Double.class); jsonGenerator.writeNumber((Double) value); } }, BIG_DECIMAL(BigDecimal.class) { public void writeFieldValue(JsonGenerator jsonGenerator, Object value) throws IOException { validateFieldValueType(value, BigDecimal.class); jsonGenerator.writeNumber((BigDecimal) value); } }, BIG_INTEGER(BigInteger.class) { public void writeFieldValue(JsonGenerator jsonGenerator, Object value) throws IOException { validateFieldValueType(value, BigInteger.class); jsonGenerator.writeNumber(new BigDecimal((BigInteger) value)); } }, INSTANT(Instant.class) { public void writeFieldValue(JsonGenerator jsonGenerator, Object value) throws IOException { validateFieldValueType(value, Instant.class); jsonGenerator.writeString(ISO_INSTANT.format((Instant) value)); } }, DATETIME(DateTime.class) { public void writeFieldValue(JsonGenerator jsonGenerator, Object value) throws IOException { validateFieldValueType(value, DateTime.class); jsonGenerator.writeString(ISO_DATETIME_FORMAT.print((DateTime) value)); } }, ENUM(Enum.class) { public void writeFieldValue(JsonGenerator jsonGenerator, Object value) throws IOException { validateFieldValueType(value, Enum.class); jsonGenerator.writeString(value.toString()); } }, INET_ADDRESS(InetAddress.class) { public void writeFieldValue(JsonGenerator jsonGenerator, Object value) throws IOException { validateFieldValueType(value, InetAddress.class); jsonGenerator.writeString(((InetAddress) value).getHostAddress()); } }, UUID(java.util.UUID.class) { public void writeFieldValue(JsonGenerator jsonGenerator, Object value) throws IOException { validateFieldValueType(value, java.util.UUID.class); jsonGenerator.writeString(value.toString()); } }; private static final DateTimeFormatter ISO_DATETIME_FORMAT = ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC); private static final Map<Class<?>, EventDataType> byType; static { ImmutableMap.Builder<Class<?>, EventDataType> builder = ImmutableMap.builder(); for (EventDataType eventDataType : EventDataType.values()) { Class<?> dataType = eventDataType.getType(); builder.put(dataType, eventDataType); if (Primitives.isWrapperType(dataType)) { builder.put(Primitives.unwrap(dataType), eventDataType); } } byType = builder.build(); } public static EventDataType getEventDataType(Class<?> type) { return byType.get(type); } private final Class<?> type; EventDataType(Class<?> type) { this.type = type; } public Class<?> getType() { return type; } static void validateFieldValueType(Object value, Class<?> expectedType) { requireNonNull(value, "value is null"); Preconditions.checkArgument(expectedType.isInstance(value), "Expected 'value' to be a " + expectedType.getSimpleName() + " but it is a " + value.getClass().getName()); } public abstract void writeFieldValue(JsonGenerator jsonGenerator, Object value) throws IOException; }