/*
* *************************************************************************************
* Copyright (C) 2008 EsperTech, Inc. All rights reserved. *
* http://esper.codehaus.org *
* 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.event.arr;
import com.espertech.esper.client.ConfigurationEventTypeObjectArray;
import com.espertech.esper.client.EventBean;
import com.espertech.esper.client.EventPropertyDescriptor;
import com.espertech.esper.client.EventType;
import com.espertech.esper.collection.Pair;
import com.espertech.esper.event.*;
import com.espertech.esper.event.property.IndexedProperty;
import com.espertech.esper.event.property.MappedProperty;
import com.espertech.esper.event.property.Property;
import com.espertech.esper.event.property.PropertyParser;
import com.espertech.esper.util.CollectionUtil;
import java.util.*;
public class ObjectArrayEventType extends BaseNestableEventType {
protected Map<String, Pair<EventPropertyDescriptor, ObjectArrayEventBeanPropertyWriter>> propertyWriters;
protected EventPropertyDescriptor[] writablePropertyDescriptors;
public ObjectArrayEventType(EventTypeMetadata metadata, String eventTypeName, int eventTypeId, EventAdapterService eventAdapterService, Map<String, Object> properyTypes, ConfigurationEventTypeObjectArray typeDef, EventType[] optionalSuperTypes, Set<EventType> optionalDeepSupertypes) {
super(metadata, eventTypeName, eventTypeId, eventAdapterService, properyTypes, optionalSuperTypes, optionalDeepSupertypes, typeDef, getGetterFactory(eventTypeName, properyTypes, optionalSuperTypes));
}
protected void postUpdateNestableTypes() {
EventTypeNestableGetterFactoryObjectArray factory = (EventTypeNestableGetterFactoryObjectArray) super.getterFactory;
Map<String, Integer> indexPerProperty = factory.getPropertiesIndex();
int index = findMax(indexPerProperty) + 1;
for (Map.Entry<String, Object> entry : nestableTypes.entrySet()) {
if (indexPerProperty.containsKey(entry.getKey())) {
continue;
}
indexPerProperty.put(entry.getKey(), index);
index++;
}
}
public Map<String, Integer> getPropertiesIndexes() {
return ((EventTypeNestableGetterFactoryObjectArray) super.getterFactory).getPropertiesIndex();
}
public final Class getUnderlyingType() {
return Object[].class;
}
public EventBeanCopyMethod getCopyMethod(String[] properties) {
BaseNestableEventUtil.MapIndexedPropPair pair = BaseNestableEventUtil.getIndexedAndMappedProps(properties);
if (pair.getMapProperties().isEmpty() && pair.getArrayProperties().isEmpty()) {
return new ObjectArrayEventBeanCopyMethod(this, eventAdapterService);
}
else {
return new ObjectArrayEventBeanCopyMethodWithArrayMap(this, eventAdapterService, pair.getMapProperties(), pair.getArrayProperties(), getPropertiesIndexes());
}
}
public EventBeanReader getReader() {
return null;
}
public ObjectArrayEventBeanPropertyWriter getWriter(String propertyName)
{
if (writablePropertyDescriptors == null)
{
initializeWriters();
}
Pair<EventPropertyDescriptor, ObjectArrayEventBeanPropertyWriter> pair = propertyWriters.get(propertyName);
if (pair != null) {
return pair.getSecond();
}
Property property = PropertyParser.parse(propertyName, false);
if (property instanceof MappedProperty) {
MappedProperty mapProp = (MappedProperty) property;
Integer index = getPropertiesIndexes().get(mapProp.getPropertyNameAtomic());
if (index == null) {
return null;
}
return new ObjectArrayEventBeanPropertyWriterMapProp(index, mapProp.getKey());
}
if (property instanceof IndexedProperty) {
IndexedProperty indexedProp = (IndexedProperty) property;
Integer index = getPropertiesIndexes().get(indexedProp.getPropertyNameAtomic());
if (index == null) {
return null;
}
return new ObjectArrayEventBeanPropertyWriterIndexedProp(index, indexedProp.getIndex());
}
return null;
}
public EventPropertyDescriptor getWritableProperty(String propertyName)
{
if (writablePropertyDescriptors == null)
{
initializeWriters();
}
Pair<EventPropertyDescriptor, ? extends EventPropertyWriter> pair = propertyWriters.get(propertyName);
if (pair != null) {
return pair.getFirst();
}
Property property = PropertyParser.parse(propertyName, false);
if (property instanceof MappedProperty) {
EventPropertyWriter writer = getWriter(propertyName);
if (writer == null) {
return null;
}
MappedProperty mapProp = (MappedProperty) property;
return new EventPropertyDescriptor(mapProp.getPropertyNameAtomic(), Object.class, null, false, true, false, true, false);
}
if (property instanceof IndexedProperty) {
EventPropertyWriter writer = getWriter(propertyName);
if (writer == null) {
return null;
}
IndexedProperty indexedProp = (IndexedProperty) property;
return new EventPropertyDescriptor(indexedProp.getPropertyNameAtomic(), Object.class, null, true, false, true, false, false);
}
return null;
}
public EventPropertyDescriptor[] getWriteableProperties()
{
if (writablePropertyDescriptors == null)
{
initializeWriters();
}
return writablePropertyDescriptors;
}
public EventBeanWriter getWriter(String[] properties)
{
if (writablePropertyDescriptors == null)
{
initializeWriters();
}
boolean allSimpleProps = true;
ObjectArrayEventBeanPropertyWriter[] writers = new ObjectArrayEventBeanPropertyWriter[properties.length];
List<Integer> indexes = new ArrayList<Integer>();
Map<String, Integer> indexesPerProperty = getPropertiesIndexes();
for (int i = 0; i < properties.length; i++)
{
Pair<EventPropertyDescriptor, ObjectArrayEventBeanPropertyWriter> writerPair = propertyWriters.get(properties[i]);
if (writerPair != null) {
writers[i] = writerPair.getSecond();
indexes.add(indexesPerProperty.get(writerPair.getFirst().getPropertyName()));
}
else {
writers[i] = getWriter(properties[i]);
if (writers[i] == null) {
return null;
}
allSimpleProps = false;
}
}
if (allSimpleProps) {
int[] propertyIndexes = CollectionUtil.intArray(indexes);
return new ObjectArrayEventBeanWriterSimpleProps(propertyIndexes);
}
else {
return new ObjectArrayEventBeanWriterPerProp(writers);
}
}
private void initializeWriters()
{
List<EventPropertyDescriptor> writeableProps = new ArrayList<EventPropertyDescriptor>();
Map<String, Pair<EventPropertyDescriptor, ObjectArrayEventBeanPropertyWriter>> propertWritersMap = new HashMap<String, Pair<EventPropertyDescriptor, ObjectArrayEventBeanPropertyWriter>>();
for (EventPropertyDescriptor prop : propertyDescriptors)
{
if (prop.isFragment() || prop.isIndexed() || prop.isMapped())
{
continue;
}
writeableProps.add(prop);
final String propertyName = prop.getPropertyName();
Integer index = getPropertiesIndexes().get(prop.getPropertyName());
if (index == null) {
continue;
}
ObjectArrayEventBeanPropertyWriter eventPropertyWriter = new ObjectArrayEventBeanPropertyWriter(index);
propertWritersMap.put(propertyName, new Pair<EventPropertyDescriptor, ObjectArrayEventBeanPropertyWriter>(prop, eventPropertyWriter));
}
propertyWriters = propertWritersMap;
writablePropertyDescriptors = writeableProps.toArray(new EventPropertyDescriptor[writeableProps.size()]);
}
private static EventTypeNestableGetterFactory getGetterFactory(String eventTypeName, Map<String, Object> propertyTypes, EventType[] optionalSupertypes) {
Map<String, Integer> indexPerProperty = new HashMap<String, Integer>();
int index = 0;
if (optionalSupertypes != null) {
for (EventType superType : optionalSupertypes) {
ObjectArrayEventType objectArraySuperType = (ObjectArrayEventType) superType;
for (String propertyName : objectArraySuperType.getPropertyNames()) {
if (indexPerProperty.containsKey(propertyName)) {
continue;
}
indexPerProperty.put(propertyName, index);
index++;
}
}
}
for (Map.Entry<String, Object> entry : propertyTypes.entrySet()) {
indexPerProperty.put(entry.getKey(), index);
index++;
}
return new EventTypeNestableGetterFactoryObjectArray(eventTypeName, indexPerProperty);
}
private static int findMax(Map<String, Integer> indexPerProperty) {
int max = -1;
for (Map.Entry<String, Integer> entry : indexPerProperty.entrySet()) {
if (entry.getValue() > max) {
max = entry.getValue();
}
}
return max;
}
public static Object[] convertEvent(EventBean theEvent, ObjectArrayEventType targetType) {
Map<String, Integer> indexesTarget = targetType.getPropertiesIndexes();
Map<String, Integer> indexesSource = ((ObjectArrayEventType) theEvent.getEventType()).getPropertiesIndexes();
Object[] dataTarget = new Object[indexesTarget.size()];
Object[] dataSource = (Object[]) theEvent.getUnderlying();
for (Map.Entry<String, Integer> sourceEntry : indexesSource.entrySet()) {
String propertyName = sourceEntry.getKey();
Integer targetIndex = indexesTarget.get(propertyName);
if (targetIndex == null) {
continue;
}
Object value = dataSource[sourceEntry.getValue()];
dataTarget[targetIndex] = value;
}
return dataTarget;
}
}