001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.camel.bam.model; 018 019 import java.util.Collection; 020 import java.util.Date; 021 import java.util.HashSet; 022 import javax.persistence.*; 023 024 import org.apache.camel.bam.rules.ActivityRules; 025 import org.apache.commons.logging.Log; 026 import org.apache.commons.logging.LogFactory; 027 028 /** 029 * Represents a single business process 030 * 031 * @version $Revision: $ 032 */ 033 @Entity 034 public class ProcessInstance { 035 private static final transient Log LOG = LogFactory.getLog(ProcessInstance.class); 036 private ProcessDefinition processDefinition; 037 private Collection<ActivityState> activityStates = new HashSet<ActivityState>(); 038 private String correlationKey; 039 private Date timeStarted; 040 private Date timeCompleted; 041 042 public ProcessInstance() { 043 setTimeStarted(new Date()); 044 } 045 046 public String toString() { 047 return "ProcessInstance[" + getCorrelationKey() + "]"; 048 } 049 050 @Id 051 public String getCorrelationKey() { 052 return correlationKey; 053 } 054 055 public void setCorrelationKey(String correlationKey) { 056 this.correlationKey = correlationKey; 057 } 058 059 @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST }) 060 public ProcessDefinition getProcessDefinition() { 061 return processDefinition; 062 } 063 064 public void setProcessDefinition(ProcessDefinition processDefinition) { 065 this.processDefinition = processDefinition; 066 } 067 068 @OneToMany(mappedBy = "processInstance", fetch = FetchType.LAZY, cascade = {CascadeType.ALL }) 069 public Collection<ActivityState> getActivityStates() { 070 return activityStates; 071 } 072 073 public void setActivityStates(Collection<ActivityState> activityStates) { 074 this.activityStates = activityStates; 075 } 076 077 078 @Transient 079 public boolean isStarted() { 080 return timeStarted != null; 081 } 082 083 @Transient 084 public boolean isCompleted() { 085 return timeCompleted != null; 086 } 087 088 @Temporal(TemporalType.TIME) 089 public Date getTimeStarted() { 090 return timeStarted; 091 } 092 093 public void setTimeStarted(Date timeStarted) { 094 this.timeStarted = timeStarted; 095 } 096 097 @Temporal(TemporalType.TIME) 098 public Date getTimeCompleted() { 099 return timeCompleted; 100 } 101 102 public void setTimeCompleted(Date timeCompleted) { 103 this.timeCompleted = timeCompleted; 104 } // Helper methods 105 //------------------------------------------------------------------------- 106 107 /** 108 * Returns the activity state for the given activity 109 * 110 * @param activityRules the activity to find the state for 111 * @return the activity state or null if no state could be found for the 112 * given activity 113 */ 114 public ActivityState getActivityState(ActivityRules activityRules) { 115 for (ActivityState activityState : getActivityStates()) { 116 if (activityState.isActivity(activityRules)) { 117 return activityState; 118 } 119 } 120 return null; 121 } 122 123 public ActivityState getOrCreateActivityState(ActivityRules activityRules) { 124 ActivityState state = getActivityState(activityRules); 125 126 if (state == null) { 127 state = createActivityState(); 128 state.setProcessInstance(this); 129 state.setActivityDefinition(activityRules.getActivityDefinition()); 130 // we don't need to do: getTemplate().persist(state); 131 } 132 133 return state; 134 } 135 136 protected ActivityState createActivityState() { 137 return new ActivityState(); 138 } 139 }