/*
* Copyright 2011 Red Hat Inc.
*
* 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.persistence.marshalling.util;
import static org.drools.persistence.marshalling.util.MarshallingTestUtil.PROCESS_INSTANCE_INFO_CLASS_NAME;
import static org.drools.persistence.marshalling.util.MarshallingTestUtil.STORE_KNOWLEDGE_BASE;
import static org.drools.persistence.marshalling.util.MarshallingTestUtil.byteArrayHashCode;
import static org.drools.persistence.marshalling.util.MarshallingTestUtil.getProcessInstanceInfoByteArray;
import static org.drools.persistence.marshalling.util.MarshallingTestUtil.getTestMethodName;
import static org.drools.persistence.marshalling.util.MarshallingTestUtil.getWorkItemByteArray;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.concurrent.atomic.AtomicInteger;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.SequenceGenerator;
import javax.persistence.Transient;
import org.junit.Assert;
import org.drools.core.util.DroolsStreamUtils;
import org.drools.persistence.info.SessionInfo;
import org.drools.persistence.info.WorkItemInfo;
import org.kie.api.KieBase;
@Entity
@SequenceGenerator(name="marshalledDataIdSeq", sequenceName="MARSHALLEDDATA_ID_SEQ")
public class MarshalledData {
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="marshalledDataIdSeq")
public Integer id;
@Lob
public byte[] byteArray;
@Lob
public byte[] serializedKnowledgeBase;
public String testMethodName;
public Integer snapshotNumber;
public String marshalledObjectClassName;
public Long marshalledObjectId;
@Transient
private static HashMap<String, AtomicInteger> testMethodSnapshotNumMap = new HashMap<String, AtomicInteger>();
public MarshalledData() {
// for the ORM/persistence which requires a default constructor to initialize entity classes
}
public MarshalledData(Object marshalledClassInstance) {
this.testMethodName = getTestMethodName();
initializeObject(marshalledClassInstance);
}
public MarshalledData(String testMethodName, Object marshalledClassInstance) {
if( testMethodName != null ) {
this.testMethodName = getTestMethodName();
}
else {
this.testMethodName = testMethodName;
}
initializeObject(marshalledClassInstance);
}
private void initializeObject(Object marshalledClassInstance) {
// snapshot number
if( testMethodSnapshotNumMap.get(this.testMethodName) == null ) {
testMethodSnapshotNumMap.put(this.testMethodName, new AtomicInteger(-1));
}
this.snapshotNumber = testMethodSnapshotNumMap.get(this.testMethodName).incrementAndGet();
// marshalled object class name
String className = marshalledClassInstance.getClass().getName();
this.marshalledObjectClassName = className;
// Object specific actions
if( className.equals(SessionInfo.class.getName()) ) {
SessionInfo sessionInfo = (SessionInfo) marshalledClassInstance;
this.byteArray = sessionInfo.getData();
this.marshalledObjectId = sessionInfo.getId().longValue();
if( STORE_KNOWLEDGE_BASE ) {
try {
storeAssociatedKnowledgeBase(sessionInfo);
} catch(IOException ioe ) {
Assert.fail("Unable to retrieve marshalled data or id for " + className + " object: ["
+ ioe.getClass().getSimpleName() + ", " + ioe.getMessage() );
}
}
}
else if( className.equals(WorkItemInfo.class.getName()) ) {
WorkItemInfo workItemInfo = (WorkItemInfo) marshalledClassInstance;
this.byteArray = getWorkItemByteArray(workItemInfo);
this.marshalledObjectId = workItemInfo.getId();
}
else if( PROCESS_INSTANCE_INFO_CLASS_NAME.equals(className) ) {
Class<?> processInstanceInfoClass = null;
try {
this.byteArray = getProcessInstanceInfoByteArray(marshalledClassInstance);
processInstanceInfoClass = Class.forName(className);
Method getIdMethod = processInstanceInfoClass.getMethod("getId", (Class []) null);
Object idObject = getIdMethod.invoke(marshalledClassInstance, (Object []) null);
this.marshalledObjectId = (Long) idObject;
} catch (Exception e) {
Assert.fail("Unable to retrieve marshalled data or id for " + className + " object: ["
+ e.getClass().getSimpleName() + ", " + e.getMessage() );
}
}
}
private void storeAssociatedKnowledgeBase(SessionInfo sessionInfo) throws IOException {
KieBase kbase = sessionInfo.getJPASessionMashallingHelper().getKbase();
this.serializedKnowledgeBase = DroolsStreamUtils.streamOut(kbase);
}
public static Integer getCurrentTestMethodSnapshotNumber() {
String testMethodName = getTestMethodName();
if( testMethodSnapshotNumMap.get(testMethodName) != null ) {
return testMethodSnapshotNumMap.get(testMethodName).intValue();
}
return null;
}
public String getTestMethodAndSnapshotNum() {
return this.testMethodName + ":" + this.snapshotNumber;
}
public String toString() {
StringBuilder string = new StringBuilder();
string.append( (id != null ? id : "") + ":");
if( byteArray != null ) {
string.append(byteArrayHashCode(byteArray));
}
string.append( ":" );
string.append( (testMethodName != null ? testMethodName : "") + ":" );
string.append( (snapshotNumber != null ? snapshotNumber : "") + ":" );
string.append( (marshalledObjectClassName != null ? marshalledObjectClassName : "") + ":" );
string.append( (marshalledObjectId != null ? marshalledObjectId : "") );
return string.toString();
}
}