/* * Copyright 2015 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. * * 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.jbpm.integrationtests; import org.drools.compiler.integrationtests.SerializationHelper; import org.drools.core.SessionConfiguration; import org.drools.core.impl.EnvironmentFactory; import org.drools.core.impl.StatefulKnowledgeSessionImpl; import org.drools.core.util.DroolsStreamUtils; import org.kie.api.marshalling.Marshaller; import org.kie.api.marshalling.ObjectMarshallingStrategy; import org.kie.api.runtime.KieSession; import org.kie.internal.marshalling.MarshallerFactory; import org.kie.internal.runtime.StatefulKnowledgeSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; /** * Marshalling helper class to perform serialize/de-serialize a given object */ public class JbpmSerializationHelper extends SerializationHelper { private static final Logger logger = LoggerFactory.getLogger(JbpmSerializationHelper.class); public static <T> T serializeObject(T obj) throws IOException, ClassNotFoundException { return serializeObject( obj, null ); } public static StatefulKnowledgeSession getSerialisedStatefulKnowledgeSession(KieSession ksession) throws Exception { return SerializationHelper.getSerialisedStatefulKnowledgeSession(ksession, true); } @SuppressWarnings("unchecked") public static <T> T serializeObject(T obj, ClassLoader classLoader) throws IOException, ClassNotFoundException { return (T) DroolsStreamUtils.streamIn( DroolsStreamUtils.streamOut( obj ), classLoader ); } public static StatefulKnowledgeSession getSerialisedStatefulKnowledgeSession(StatefulKnowledgeSession ksession, boolean dispose) throws Exception { return getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newSerializeMarshallingStrategy(), dispose ); } public static StatefulKnowledgeSession getSerialisedStatefulKnowledgeSession(StatefulKnowledgeSession ksession, ObjectMarshallingStrategy strategy, boolean dispose) throws Exception { ObjectMarshallingStrategy [] strategies = new ObjectMarshallingStrategy[] { strategy }; return getSerialisedStatefulKnowledgeSession(ksession, strategies, dispose); } public static StatefulKnowledgeSession getSerialisedStatefulKnowledgeSession(StatefulKnowledgeSession ksession, ObjectMarshallingStrategy [] strategies, boolean dispose) throws Exception { Marshaller marshaller = MarshallerFactory.newMarshaller( ksession.getKieBase(), strategies ); final byte [] b1 = serializeKnowledgeSession(marshaller, ksession); StatefulKnowledgeSession ksession2 = deserializeKnowledgeSession(marshaller, b1); final byte[] b2 = serializeKnowledgeSession(marshaller, ksession2); // bytes should be the same. if ( !areByteArraysEqual( b1, b2 ) ) { // throw new IllegalArgumentException( "byte streams for serialisation test are not equal" ); } ((StatefulKnowledgeSessionImpl) ksession2).setGlobalResolver( ((StatefulKnowledgeSessionImpl) ksession).getGlobalResolver() ); if ( dispose ) { ksession.dispose(); } return ksession2; } public static byte [] serializeKnowledgeSession(Marshaller marshaller, StatefulKnowledgeSession ksession) throws Exception { ByteArrayOutputStream bos = new ByteArrayOutputStream(); marshaller.marshall( bos, ksession ); byte[] ksessionBytes = bos.toByteArray(); bos.close(); return ksessionBytes; } public static StatefulKnowledgeSession deserializeKnowledgeSession(Marshaller marshaller, byte [] serializedKsession) throws Exception { ByteArrayInputStream bais = new ByteArrayInputStream( serializedKsession ); StatefulKnowledgeSession deserializedKsession = (StatefulKnowledgeSession) marshaller.unmarshall( bais, SessionConfiguration.newInstance(), EnvironmentFactory.newEnvironment() ); bais.close(); return deserializedKsession; } public static boolean areByteArraysEqual(byte[] b1, byte[] b2) { if ( b1.length != b2.length ) { logger.info( "Different length: b1={} b2={}", b1.length, b2.length ); return false; } for ( int i = 0, length = b1.length; i < length; i++ ) { if ( b1[i] != b2[i] ) { logger.info( "Difference at {} : [{}] != [{}]", i, b1[i], b2[i]); return false; } } return true; } }