/* * 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.persistence.processinstance; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import javax.persistence.Entity; import org.drools.persistence.info.EntityHolder; import org.drools.persistence.info.SessionInfo; import org.drools.persistence.info.WorkItemInfo; import org.hibernate.search.annotations.Field; import org.hibernate.search.annotations.Indexed; import org.infinispan.commons.util.Base64; import org.jbpm.persistence.correlation.CorrelationKeyInfo; import org.jbpm.persistence.correlation.CorrelationPropertyInfo; import org.kie.internal.process.CorrelationProperty; @Entity @Indexed public class ProcessEntityHolder extends EntityHolder { @Field private String processInstanceEventTypes; @Field private Long processInstanceId; @Field private Date processInstanceLastModificationDate; @Field private Date processInstanceLastReadDate; @Field private String processId; @Field private String processInstanceByteArray; @Field private Date processInstanceStartDate; @Field private Integer processInstanceState; @Field private Integer processInstanceVersion; @Field private long correlationKeyId; @Field private String correlationKeyName; @Field private String correlationKeyProperties; public ProcessEntityHolder(String key, SessionInfo sessionInfo) { super(key, sessionInfo); } public ProcessEntityHolder(String key, WorkItemInfo workItemInfo) { super(key, workItemInfo); } public ProcessEntityHolder(String key, ProcessInstanceInfo processInstanceInfo) { super(key, "processInstanceInfo"); this.processInstanceEventTypes = generateString(processInstanceInfo.getEventTypes()); this.processInstanceId = processInstanceInfo.getId(); this.processInstanceLastModificationDate = processInstanceInfo.getLastModificationDate(); this.processInstanceLastReadDate = processInstanceInfo.getLastReadDate(); this.processId = processInstanceInfo.getProcessId(); processInstanceInfo.transform(); this.processInstanceByteArray = Base64.encodeBytes(processInstanceInfo.getProcessInstanceByteArray()); this.processInstanceStartDate = processInstanceInfo.getStartDate(); this.processInstanceState = processInstanceInfo.getState(); this.processInstanceVersion = processInstanceInfo.getVersion(); } public ProcessEntityHolder(String key, CorrelationKeyInfo correlationKeyInfo) { super(key, "correlationInfo"); this.correlationKeyId = correlationKeyInfo.getId() == 0 ? correlationKeyInfo.getProperties().size() : correlationKeyInfo.getId(); this.correlationKeyName = correlationKeyInfo.getName(); this.processInstanceId = correlationKeyInfo.getProcessInstanceId(); this.correlationKeyProperties = generateString(correlationKeyInfo.getProperties()); } private void set(Object obj, String fieldName, Object value) { java.lang.reflect.Field field; try { field = obj.getClass().getDeclaredField(fieldName); field.setAccessible(true); field.set(obj, value); } catch (Exception e) { throw new RuntimeException("Cant set field " + fieldName, e); } } public ProcessInstanceInfo getProcessInstanceInfo() { ProcessInstanceInfo info = new ProcessInstanceInfo(); info.setId(this.processInstanceId); set(info, "lastModificationDate", this.processInstanceLastModificationDate); set(info, "lastReadDate", this.processInstanceLastReadDate); set(info, "processId", this.processId); set(info, "processInstanceByteArray", Base64.decode(this.processInstanceByteArray)); set(info, "startDate", this.processInstanceStartDate); set(info, "state", this.processInstanceState); set(info, "version", this.processInstanceVersion); set(info, "eventTypes", toSet(this.processInstanceEventTypes)); return info; } public CorrelationKeyInfo getCorrelationKeyInfo() { CorrelationKeyInfo info = new CorrelationKeyInfo(); info.setName(this.correlationKeyName); info.setProcessInstanceId(this.processInstanceId); List<CorrelationPropertyInfo> props = toProperties(this.correlationKeyProperties); for (CorrelationPropertyInfo prop : props) { info.addProperty(prop); } set(info, "id", this.correlationKeyId); return info; } public static String generateString(List<CorrelationProperty<?>> properties) { StringBuilder sb = new StringBuilder(); if (properties != null) { for (Iterator<CorrelationProperty<?>> iter = properties.iterator(); iter.hasNext();) { CorrelationProperty<?> cp = iter.next(); sb.append(cp.getName()).append("=").append(cp.getValue()); if (iter.hasNext()) { sb.append(","); } } } return sb.toString(); } public static String generateString(Set<String> setOfStrings) { StringBuilder sb = new StringBuilder(); if (setOfStrings != null) { for (Iterator<String> iter = setOfStrings.iterator(); iter.hasNext(); ) { sb.append(iter.next()); if (iter.hasNext()) { sb.append(","); } } } return sb.toString(); } public static Set<String> toSet(String setOfStringsString) { if (setOfStringsString != null) { String[] splitted = setOfStringsString.split(","); return new HashSet<String>(Arrays.asList(splitted)); } else { return new HashSet<String>(); } } public static List<CorrelationPropertyInfo> toProperties(String properties) { String[] props = properties.split(","); List<CorrelationPropertyInfo> retval = new ArrayList<CorrelationPropertyInfo>(props.length); for (String prop : props) { String[] sub = prop.split("="); String key = sub[0]; String value = ""; if (sub.length == 2) { value = sub[1]; } retval.add(new CorrelationPropertyInfo(key, value)); } return retval; } public String getProcessInstanceEventTypes() { return processInstanceEventTypes; } public void setProcessInstanceEventTypes(String processInstanceEventTypes) { this.processInstanceEventTypes = processInstanceEventTypes; } public Date getProcessInstanceLastModificationDate() { return processInstanceLastModificationDate; } public void setProcessInstanceLastModificationDate( Date processInstanceLastModificationDate) { this.processInstanceLastModificationDate = processInstanceLastModificationDate; } public Date getProcessInstanceLastReadDate() { return processInstanceLastReadDate; } public void setProcessInstanceLastReadDate(Date processInstanceLastReadDate) { this.processInstanceLastReadDate = processInstanceLastReadDate; } public String getProcessId() { return processId; } public void setProcessId(String processId) { this.processId = processId; } public String getProcessInstanceByteArray() { return processInstanceByteArray; } public void setProcessInstanceByteArray(String processInstanceByteArray) { this.processInstanceByteArray = processInstanceByteArray; } public Date getProcessInstanceStartDate() { return processInstanceStartDate; } public void setProcessInstanceStartDate(Date processInstanceStartDate) { this.processInstanceStartDate = processInstanceStartDate; } public Integer getProcessInstanceState() { return processInstanceState; } public void setProcessInstanceState(Integer processInstanceState) { this.processInstanceState = processInstanceState; } public Integer getProcessInstanceVersion() { return processInstanceVersion; } public void setProcessInstanceVersion(Integer processInstanceVersion) { this.processInstanceVersion = processInstanceVersion; } public Long getProcessInstanceId() { return processInstanceId; } public void setProcessInstanceId(Long processInstanceId) { this.processInstanceId = processInstanceId; } public long getCorrelationKeyId() { return correlationKeyId; } public void setCorrelationKeyId(long correlationKeyId) { this.correlationKeyId = correlationKeyId; } public String getCorrelationKeyName() { return correlationKeyName; } public void setCorrelationKeyName(String correlationKeyName) { this.correlationKeyName = correlationKeyName; } public String getCorrelationKeyProperties() { return correlationKeyProperties; } public void setCorrelationKeyProperties(String correlationKeyProperties) { this.correlationKeyProperties = correlationKeyProperties; } }