/*
* Copyright 2010 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.drools.core.marshalling.impl;
import org.drools.core.common.BaseNode;
import org.drools.core.common.InternalWorkingMemory;
import org.drools.core.impl.InternalKnowledgeBase;
import org.drools.core.phreak.PhreakTimerNode.TimerNodeJobContext;
import org.drools.core.phreak.PhreakTimerNode.TimerNodeTimerOutputMarshaller;
import org.drools.core.reteoo.LeftTuple;
import org.drools.core.reteoo.ObjectTypeNode.ExpireJobContext;
import org.drools.core.reteoo.ObjectTypeNode.ExpireJobContextTimerOutputMarshaller;
import org.drools.core.rule.SlidingTimeWindow;
import org.drools.core.rule.SlidingTimeWindow.BehaviorJobContextTimerOutputMarshaller;
import org.kie.api.marshalling.ObjectMarshallingStrategy;
import org.kie.api.marshalling.ObjectMarshallingStrategyStore;
import org.kie.api.runtime.Environment;
import org.kie.api.runtime.EnvironmentName;
import org.kie.internal.marshalling.MarshallerFactory;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.Map;
public class MarshallerWriteContext extends ObjectOutputStream {
public final MarshallerWriteContext stream;
public final InternalKnowledgeBase kBase;
public final InternalWorkingMemory wm;
public final Map<Integer, BaseNode> sinks;
public long clockTime;
public final Map<Class< ? >, TimersOutputMarshaller> writersByClass;
public final PrintStream out = System.out;
public final ObjectMarshallingStrategyStore objectMarshallingStrategyStore;
public final Map<ObjectMarshallingStrategy, Integer> usedStrategies;
public final Map<ObjectMarshallingStrategy, ObjectMarshallingStrategy.Context> strategyContext;
public final Map<LeftTuple, Integer> terminalTupleMap;
public final boolean marshalProcessInstances;
public final boolean marshalWorkItems;
public final Environment env;
public Object parameterObject;
public MarshallerWriteContext(OutputStream stream,
InternalKnowledgeBase kBase,
InternalWorkingMemory wm,
Map<Integer, BaseNode> sinks,
ObjectMarshallingStrategyStore resolverStrategyFactory,
Environment env) throws IOException {
this( stream,
kBase,
wm,
sinks,
resolverStrategyFactory,
true,
true,
env );
}
public MarshallerWriteContext(OutputStream stream,
InternalKnowledgeBase kBase,
InternalWorkingMemory wm,
Map<Integer, BaseNode> sinks,
ObjectMarshallingStrategyStore resolverStrategyFactory,
boolean marshalProcessInstances,
boolean marshalWorkItems,
Environment env) throws IOException {
super( stream );
this.stream = this;
this.kBase = kBase;
this.wm = wm;
this.sinks = sinks;
this.writersByClass = new HashMap<Class< ? >, TimersOutputMarshaller>();
this.writersByClass.put( SlidingTimeWindow.BehaviorJobContext.class, new BehaviorJobContextTimerOutputMarshaller() );
this.writersByClass.put( ExpireJobContext.class, new ExpireJobContextTimerOutputMarshaller() );
this.writersByClass.put( TimerNodeJobContext.class, new TimerNodeTimerOutputMarshaller() );
if ( resolverStrategyFactory == null ) {
ObjectMarshallingStrategy[] strats = (ObjectMarshallingStrategy[]) env.get( EnvironmentName.OBJECT_MARSHALLING_STRATEGIES );
if ( strats == null ) {
strats = new ObjectMarshallingStrategy[]{MarshallerFactory.newSerializeMarshallingStrategy()};
}
this.objectMarshallingStrategyStore = new ObjectMarshallingStrategyStoreImpl( strats );
}
else {
this.objectMarshallingStrategyStore = resolverStrategyFactory;
}
this.usedStrategies = new HashMap<ObjectMarshallingStrategy, Integer>();
this.strategyContext = new HashMap<ObjectMarshallingStrategy, ObjectMarshallingStrategy.Context>();
this.terminalTupleMap = new IdentityHashMap<LeftTuple, Integer>();
this.marshalProcessInstances = marshalProcessInstances;
this.marshalWorkItems = marshalWorkItems;
this.env = env;
}
public Integer getStrategyIndex(ObjectMarshallingStrategy strategy) {
Integer index = usedStrategies.get( strategy );
if ( index == null ) {
index = Integer.valueOf( usedStrategies.size() );
usedStrategies.put( strategy, index );
strategyContext.put( strategy, strategy.createContext() );
}
return index;
}
}