/* # Licensed Materials - Property of IBM # Copyright IBM Corp. 2016 */ package com.ibm.streamsx.topology.internal.functional; import static com.ibm.streamsx.topology.internal.functional.FunctionalHelper.getLogicObject; import java.io.IOException; import com.ibm.streams.operator.logging.TraceLevel; import com.ibm.streamsx.topology.function.FunctionContext; import com.ibm.streamsx.topology.function.Initializable; import com.ibm.streamsx.topology.internal.logic.WrapperFunction; public abstract class FunctionalHandler<T> { private final FunctionContext context; private final String serializedLogic; public FunctionalHandler(FunctionContext context, String serializedLogic) throws Exception { this.context = context; this.serializedLogic = serializedLogic; } public FunctionContext getFunctionContext() { return context; } public T initialLogic() throws Exception { T initialLogic = getLogicObject(serializedLogic); return initialLogic; } public abstract T getLogic(); public void close() throws IOException { closeLogic(getLogic()); } protected void initializeLogic() throws Exception { initializeLogic(getFunctionContext(), getLogic()); } static void initializeLogic(FunctionContext context, Object logicInstance) throws Exception { for (;;) { if (logicInstance instanceof Initializable) { ((Initializable) logicInstance).initialize(context); } if (logicInstance instanceof WrapperFunction) { logicInstance = ((WrapperFunction) logicInstance).getWrappedFunction(); } else { break; } } } /** * If logicInstance implements AutoCloseable * then shut it down by calling it close() method. */ static void closeLogic(Object logicInstance) { for (;;) { if (logicInstance instanceof AutoCloseable) { try { synchronized (logicInstance) { ((AutoCloseable) logicInstance).close(); } } catch (Exception e) { FunctionalHelper.trace.log(TraceLevel.ERROR, "Exception " + e.getMessage() + " closing function instance:" + logicInstance, e); } } if (logicInstance instanceof WrapperFunction) { logicInstance = ((WrapperFunction) logicInstance).getWrappedFunction(); } else { break; } } } }