/* *************************************************************************************** * 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.pattern; import com.espertech.esper.collection.Pair; import com.espertech.esper.epl.spec.*; import com.espertech.esper.pattern.guard.GuardFactory; import com.espertech.esper.pattern.observer.ObserverFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Map; /** * Resolves pattern object namespace and name to guard or observer factory class, using configuration. */ public class PatternObjectResolutionServiceImpl implements PatternObjectResolutionService { private static final Logger log = LoggerFactory.getLogger(PatternObjectResolutionServiceImpl.class); private final PluggableObjectCollection patternObjects; /** * Ctor. * * @param patternObjects is the pattern plug-in objects configured */ public PatternObjectResolutionServiceImpl(PluggableObjectCollection patternObjects) { this.patternObjects = patternObjects; } public ObserverFactory create(PatternObserverSpec spec) throws PatternObjectException { Object result = createFactory(spec, PluggableObjectType.PATTERN_OBSERVER); ObserverFactory factory; try { factory = (ObserverFactory) result; if (log.isDebugEnabled()) { log.debug(".create Successfully instantiated observer"); } } catch (ClassCastException e) { String message = "Error casting observer factory instance to " + ObserverFactory.class.getName() + " interface for observer '" + spec.getObjectName() + "'"; throw new PatternObjectException(message, e); } return factory; } public GuardFactory create(PatternGuardSpec spec) throws PatternObjectException { Object result = createFactory(spec, PluggableObjectType.PATTERN_GUARD); GuardFactory factory; try { factory = (GuardFactory) result; if (log.isDebugEnabled()) { log.debug(".create Successfully instantiated guard"); } } catch (ClassCastException e) { String message = "Error casting guard factory instance to " + GuardFactory.class.getName() + " interface for guard '" + spec.getObjectName() + "'"; throw new PatternObjectException(message, e); } return factory; } private Object createFactory(ObjectSpec spec, PluggableObjectType type) throws PatternObjectException { if (log.isDebugEnabled()) { log.debug(".create Creating factory, spec=" + spec.toString()); } // Find the factory class for this pattern object Class factoryClass = null; Map<String, Pair<Class, PluggableObjectEntry>> namespaceMap = patternObjects.getPluggables().get(spec.getObjectNamespace()); if (namespaceMap != null) { Pair<Class, PluggableObjectEntry> pair = namespaceMap.get(spec.getObjectName()); if (pair != null) { if (pair.getSecond().getType() == type) { factoryClass = pair.getFirst(); } else { // invalid type: expecting observer, got guard if (type == PluggableObjectType.PATTERN_GUARD) { throw new PatternObjectException("Pattern observer function '" + spec.getObjectName() + "' cannot be used as a pattern guard"); } else { throw new PatternObjectException("Pattern guard function '" + spec.getObjectName() + "' cannot be used as a pattern observer"); } } } } if (factoryClass == null) { if (type == PluggableObjectType.PATTERN_GUARD) { String message = "Pattern guard name '" + spec.getObjectName() + "' is not a known pattern object name"; throw new PatternObjectException(message); } else if (type == PluggableObjectType.PATTERN_OBSERVER) { String message = "Pattern observer name '" + spec.getObjectName() + "' is not a known pattern object name"; throw new PatternObjectException(message); } else { throw new PatternObjectException("Pattern object type '" + type + "' not known"); } } Object result; try { result = factoryClass.newInstance(); } catch (IllegalAccessException e) { String message = "Error invoking pattern object factory constructor for object '" + spec.getObjectName(); message += "', no invocation access for Class.newInstance"; throw new PatternObjectException(message, e); } catch (InstantiationException e) { String message = "Error invoking pattern object factory constructor for object '" + spec.getObjectName(); message += "' using Class.newInstance"; throw new PatternObjectException(message, e); } return result; } }