/* *************************************************************************************** * 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.event.util; import com.espertech.esper.client.EventPropertyDescriptor; import com.espertech.esper.client.EventPropertyGetter; import com.espertech.esper.client.EventType; import com.espertech.esper.client.FragmentEventType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Stack; /** * Renderer cache for event type metadata allows fast rendering of a given type of events. */ public class RendererMeta { private static final Logger log = LoggerFactory.getLogger(RendererMeta.class); private final GetterPair[] simpleProperties; private final GetterPair[] indexProperties; private final GetterPair[] mappedProperties; private final NestedGetterPair[] nestedProperties; /** * Ctor. * * @param eventType to render * @param stack the stack of properties to avoid looping * @param options rendering options */ public RendererMeta(EventType eventType, Stack<EventTypePropertyPair> stack, RendererMetaOptions options) { ArrayList<GetterPair> gettersSimple = new ArrayList<GetterPair>(); ArrayList<GetterPair> gettersIndexed = new ArrayList<GetterPair>(); ArrayList<GetterPair> gettersMapped = new ArrayList<GetterPair>(); ArrayList<NestedGetterPair> gettersNested = new ArrayList<NestedGetterPair>(); EventPropertyDescriptor[] descriptors = eventType.getPropertyDescriptors(); for (EventPropertyDescriptor desc : descriptors) { String propertyName = desc.getPropertyName(); if ((!desc.isIndexed()) && (!desc.isMapped()) && (!desc.isFragment())) { EventPropertyGetter getter = eventType.getGetter(propertyName); if (getter == null) { log.warn("No getter returned for event type '" + eventType.getName() + "' and property '" + propertyName + "'"); continue; } gettersSimple.add(new GetterPair(getter, propertyName, OutputValueRendererFactory.getOutputValueRenderer(desc.getPropertyType(), options))); } if (desc.isIndexed() && !desc.isRequiresIndex() && (!desc.isFragment())) { EventPropertyGetter getter = eventType.getGetter(propertyName); if (getter == null) { log.warn("No getter returned for event type '" + eventType.getName() + "' and property '" + propertyName + "'"); continue; } gettersIndexed.add(new GetterPair(getter, propertyName, OutputValueRendererFactory.getOutputValueRenderer(desc.getPropertyType(), options))); } if (desc.isMapped() && !desc.isRequiresMapkey() && (!desc.isFragment())) { EventPropertyGetter getter = eventType.getGetter(propertyName); if (getter == null) { log.warn("No getter returned for event type '" + eventType.getName() + "' and property '" + propertyName + "'"); continue; } gettersMapped.add(new GetterPair(getter, propertyName, OutputValueRendererFactory.getOutputValueRenderer(desc.getPropertyType(), options))); } if (desc.isFragment()) { EventPropertyGetter getter = eventType.getGetter(propertyName); FragmentEventType fragmentType = eventType.getFragmentType(propertyName); if (getter == null) { log.warn("No getter returned for event type '" + eventType.getName() + "' and property '" + propertyName + "'"); continue; } if (fragmentType == null) { log.warn("No fragment type returned for event type '" + eventType.getName() + "' and property '" + propertyName + "'"); continue; } EventTypePropertyPair pair = new EventTypePropertyPair(fragmentType.getFragmentType(), propertyName); if (options.isPreventLooping() && stack.contains(pair)) { continue; // prevent looping behavior on self-references } stack.push(pair); RendererMeta fragmentMetaData = new RendererMeta(fragmentType.getFragmentType(), stack, options); stack.pop(); gettersNested.add(new NestedGetterPair(getter, propertyName, fragmentMetaData, fragmentType.isIndexed())); } } simpleProperties = gettersSimple.toArray(new GetterPair[gettersSimple.size()]); indexProperties = gettersIndexed.toArray(new GetterPair[gettersIndexed.size()]); mappedProperties = gettersMapped.toArray(new GetterPair[gettersMapped.size()]); nestedProperties = gettersNested.toArray(new NestedGetterPair[gettersNested.size()]); } /** * Returns simple properties. * * @return properties */ public GetterPair[] getSimpleProperties() { return simpleProperties; } /** * Returns index properties. * * @return properties */ public GetterPair[] getIndexProperties() { return indexProperties; } /** * Returns nested properties. * * @return properties */ public NestedGetterPair[] getNestedProperties() { return nestedProperties; } /** * Returns mapped properties. * * @return mapped props */ public GetterPair[] getMappedProperties() { return mappedProperties; } }