diff --git a/drools-core/src/main/java/org/drools/core/marshalling/impl/ProcessMarshaller.java b/drools-core/src/main/java/org/drools/core/marshalling/impl/ProcessMarshaller.java index 3a7ec653bcc..d8119ee4b8d 100644 --- a/drools-core/src/main/java/org/drools/core/marshalling/impl/ProcessMarshaller.java +++ b/drools-core/src/main/java/org/drools/core/marshalling/impl/ProcessMarshaller.java @@ -4,6 +4,7 @@ import java.util.List; import org.kie.api.runtime.process.ProcessInstance; +import org.drools.core.process.instance.WorkItem; public interface ProcessMarshaller { @@ -21,4 +22,8 @@ public interface ProcessMarshaller { void init(MarshallerReaderContext context); + void writeWorkItem( MarshallerWriteContext context, WorkItem workItem); + + WorkItem readWorkItem(MarshallerReaderContext context); + } diff --git a/drools-core/src/main/java/org/drools/core/marshalling/impl/ProtobufInputMarshaller.java b/drools-core/src/main/java/org/drools/core/marshalling/impl/ProtobufInputMarshaller.java index 35d37657d24..a74f9bdc5b3 100644 --- a/drools-core/src/main/java/org/drools/core/marshalling/impl/ProtobufInputMarshaller.java +++ b/drools-core/src/main/java/org/drools/core/marshalling/impl/ProtobufInputMarshaller.java @@ -59,6 +59,7 @@ import org.drools.core.phreak.RuleAgendaItem; import org.drools.core.phreak.RuleExecutor; import org.drools.core.phreak.StackEntry; +import org.drools.core.process.instance.WorkItem; import org.drools.core.reteoo.InitialFactImpl; import org.drools.core.reteoo.LeftTuple; import org.drools.core.reteoo.ObjectTypeConf; @@ -724,6 +725,10 @@ public static Trigger readTrigger(MarshallerReaderContext inCtx, } + public static WorkItem readWorkItem( MarshallerReaderContext context ) { + return processMarshaller.readWorkItem( context ); + } + public static class PBActivationsFilter implements ActivationsFilter, diff --git a/drools-core/src/main/java/org/drools/core/marshalling/impl/ProtobufOutputMarshaller.java b/drools-core/src/main/java/org/drools/core/marshalling/impl/ProtobufOutputMarshaller.java index 1dbf5871c3e..3bad8a9d3e0 100644 --- a/drools-core/src/main/java/org/drools/core/marshalling/impl/ProtobufOutputMarshaller.java +++ b/drools-core/src/main/java/org/drools/core/marshalling/impl/ProtobufOutputMarshaller.java @@ -59,6 +59,7 @@ import org.drools.core.marshalling.impl.ProtobufMessages.Timers.Timer; import org.drools.core.marshalling.impl.ProtobufMessages.Tuple; import org.drools.core.phreak.RuleAgendaItem; +import org.drools.core.process.instance.WorkItem; import org.drools.core.reteoo.AccumulateNode.AccumulateContext; import org.drools.core.reteoo.AccumulateNode.AccumulateMemory; import org.drools.core.reteoo.BetaMemory; @@ -900,4 +901,8 @@ public static ProtobufMessages.Trigger writeTrigger(Trigger trigger, throw new RuntimeException( "Unable to serialize Trigger for type: " + trigger.getClass() ); } + public static void writeWorkItem( MarshallerWriteContext context, WorkItem workItem ) { + processMarshaller.writeWorkItem( context, workItem ); + } + } diff --git a/drools-persistence-jpa/src/main/java/org/drools/persistence/info/WorkItemInfo.java b/drools-persistence-jpa/src/main/java/org/drools/persistence/info/WorkItemInfo.java index 9d7b3b1ec5f..afffe00731b 100644 --- a/drools-persistence-jpa/src/main/java/org/drools/persistence/info/WorkItemInfo.java +++ b/drools-persistence-jpa/src/main/java/org/drools/persistence/info/WorkItemInfo.java @@ -21,13 +21,21 @@ import org.drools.core.marshalling.impl.MarshallerReaderContext; import org.drools.core.marshalling.impl.MarshallerWriteContext; import org.drools.core.marshalling.impl.OutputMarshaller; +import org.drools.core.marshalling.impl.ProcessMarshaller; +import org.drools.core.marshalling.impl.ProcessMarshallerFactory; +import org.drools.core.marshalling.impl.ProtobufInputMarshaller; +import org.drools.core.marshalling.impl.ProtobufOutputMarshaller; import org.drools.core.process.instance.WorkItem; import org.kie.api.runtime.Environment; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Entity @SequenceGenerator(name="workItemInfoIdSeq", sequenceName="WORKITEMINFO_ID_SEQ") public class WorkItemInfo { - + + private static final Logger logger = LoggerFactory.getLogger(WorkItemInfo.class); + @Id @GeneratedValue(strategy = GenerationType.AUTO, generator="workItemInfoIdSeq") private Long workItemId; @@ -100,12 +108,33 @@ public WorkItem getWorkItem(Environment env, InternalRuleBase ruleBase) { null, null, null, - env); - workItem = InputMarshaller.readWorkItem( context ); + env); + try { + workItem = ProtobufInputMarshaller.readWorkItem(context); + } catch (Exception e) { + // for backward compatibility to be able to restore 5.x data + try { + context.close(); + bais = new ByteArrayInputStream( workItemByteArray ); + context = new MarshallerReaderContext( bais, + ruleBase, + null, + null, + null, + env); + + workItem = InputMarshaller.readWorkItem( context ); + } catch (IOException e1) { + logger.error("Unable to read work item with InputMarshaller", e1); + // throw the original exception produced by failed protobuf op + throw new RuntimeException("Unable to read work item ", e); + } + } + context.close(); } catch ( IOException e ) { e.printStackTrace(); - throw new IllegalArgumentException( "IOException while loading process instance: " + e.getMessage() ); + throw new IllegalArgumentException( "IOException while loading work item: " + e.getMessage() ); } } return workItem; @@ -116,6 +145,9 @@ public WorkItem getWorkItem(Environment env, InternalRuleBase ruleBase) { @PreUpdate public void update() { this.state = workItem.getState(); + + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { MarshallerWriteContext context = new MarshallerWriteContext( baos, @@ -124,9 +156,7 @@ public void update() { null, null, this.env); - - OutputMarshaller.writeWorkItem( context, - workItem ); + ProtobufOutputMarshaller.writeWorkItem(context, workItem); context.close(); this.workItemByteArray = baos.toByteArray(); @@ -138,5 +168,6 @@ public void update() { public void setId(Long id){ this.workItemId = id; } - + + }