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

com.espertech.esper.avro.util.support.SupportAvroUtil Maven / Gradle / Ivy

The newest version!
/*
 ***************************************************************************************
 *  Copyright (C) 2006 EsperTech, Inc. All rights reserved.                            *
 *  http://www.espertech.com/esper                                                     *
 *  http://www.espertech.com                                                           *
 *  ---------------------------------------------------------------------------------- *
 *  The software in this package is published under the terms of the GPL license       *
 *  a copy of which has been included with this distribution in the license.txt file.  *
 ***************************************************************************************
 */
package com.espertech.esper.avro.util.support;

import com.espertech.esper.avro.core.AvroEventType;
import com.espertech.esper.client.EPServiceProvider;
import com.espertech.esper.client.EventBean;
import com.espertech.esper.client.EventType;
import com.espertech.esper.core.support.SupportEventAdapterService;
import com.espertech.esper.event.EventTypeMetadata;
import com.espertech.esper.event.avro.AvroSchemaEventType;
import org.apache.avro.Schema;
import org.apache.avro.generic.GenericData;
import org.apache.avro.generic.GenericDatumReader;
import org.apache.avro.generic.GenericDatumWriter;
import org.apache.avro.io.*;

import java.io.*;
import java.util.HashSet;
import java.util.Set;

public class SupportAvroUtil {

    public static String avroToJson(EventBean theEvent) {
        Schema schema = (Schema) ((AvroSchemaEventType) theEvent.getEventType()).getSchema();
        GenericData.Record record = (GenericData.Record) theEvent.getUnderlying();
        return avroToJson(schema, record);
    }

    public static  String avroToJson(Schema schema, GenericData.Record datum) {
        DatumWriter writer = new GenericDatumWriter(schema);
        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            JsonEncoder encoder = EncoderFactory.get().jsonEncoder(schema, bos);
            writer.write(datum, encoder);
            encoder.flush();
            return new String(bos.toByteArray());
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }
    }

    public static GenericData.Record parseQuoted(Schema schema, String json) {
        return parse(schema, json.replace("'", "\""));
    }

    public static GenericData.Record parse(Schema schema, String json) {
        InputStream input = new ByteArrayInputStream(json.getBytes());
        DataInputStream din = new DataInputStream(input);
        try {
            Decoder decoder = DecoderFactory.get().jsonDecoder(schema, din);
            DatumReader reader = new GenericDatumReader<>(schema);
            return (GenericData.Record) reader.read(null, decoder);
        } catch (IOException ex) {
            throw new RuntimeException("Failed to parse json: " + ex.getMessage(), ex);
        }
    }

    public static String compareSchemas(Schema schemaOne, Schema schemaTwo) {
        Set names = new HashSet<>();
        addSchemaFieldNames(names, schemaOne);
        addSchemaFieldNames(names, schemaTwo);

        for (String name : names) {
            Schema.Field fieldOne = schemaOne.getField(name);
            Schema.Field fieldTwo = schemaTwo.getField(name);
            if (fieldOne == null) {
                return "Failed to find field '" + name + " in schema-one";
            }
            if (fieldTwo == null) {
                return "Failed to find field '" + name + " in schema-one";
            }
            if (!fieldOne.schema().equals(fieldTwo.schema())) {
                return "\nSchema-One: " + fieldOne.schema() + "\n" +
                        "Schema-Two: " + fieldTwo.schema();
            }
        }
        return null;
    }

    public static Schema getAvroSchema(EPServiceProvider epService, String eventTypeName) {
        return getAvroSchema(epService.getEPAdministrator().getConfiguration().getEventType(eventTypeName));
    }

    public static AvroEventType makeAvroSupportEventType(Schema schema) {
        EventTypeMetadata metadata = EventTypeMetadata.createNonPojoApplicationType(EventTypeMetadata.ApplicationType.AVRO, "typename", true, true, true, false, false);
        return new AvroEventType(metadata, "typename", 1, SupportEventAdapterService.getService(), schema, null, null, null, null);
    }

    private static void addSchemaFieldNames(Set names, Schema schema) {
        for (Schema.Field field : schema.getFields()) {
            names.add(field.name());
        }
    }

    public static Schema getAvroSchema(EventBean event) {
        return getAvroSchema(event.getEventType());
    }

    public static Schema getAvroSchema(EventType eventType) {
        return ((AvroEventType) eventType).getSchemaAvro();
    }
}