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 org.apache.camel.bam.rules.ActivityRules;
020    import org.apache.commons.logging.Log;
021    import org.apache.commons.logging.LogFactory;
022    
023    import javax.persistence.CascadeType;
024    import javax.persistence.Entity;
025    import javax.persistence.FetchType;
026    import javax.persistence.GeneratedValue;
027    import javax.persistence.Id;
028    import javax.persistence.ManyToOne;
029    import javax.persistence.OneToMany;
030    import java.util.Collection;
031    import java.util.Date;
032    import java.util.HashSet;
033    
034    /**
035     * Represents a single business process
036     *
037     * @version $Revision: $
038     */
039    @Entity
040    public class ProcessInstance extends TemporalEntity {
041        private static final transient Log log = LogFactory.getLog(ProcessInstance.class);
042        private ProcessDefinition processDefinition;
043        private Collection<ActivityState> activityStates = new HashSet<ActivityState>();
044        private String correlationKey;
045    
046        public ProcessInstance() {
047            setTimeStarted(new Date());
048        }
049    
050        public String toString() {
051            return getClass().getName() + "[id: " + getId() + ", key: " + getCorrelationKey() + "]";
052        }
053    
054        // This crap is required to work around a bug in hibernate
055        @Override
056        @Id
057        @GeneratedValue
058        public Long getId() {
059            return super.getId();
060        }
061    
062        @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST})
063        public ProcessDefinition getProcessDefinition() {
064            return processDefinition;
065        }
066    
067        public void setProcessDefinition(ProcessDefinition processDefinition) {
068            this.processDefinition = processDefinition;
069        }
070    
071        @OneToMany(mappedBy = "processInstance", fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
072        public Collection<ActivityState> getActivityStates() {
073            return activityStates;
074        }
075    
076        public void setActivityStates(Collection<ActivityState> activityStates) {
077            this.activityStates = activityStates;
078        }
079    
080        public String getCorrelationKey() {
081            return correlationKey;
082        }
083    
084        public void setCorrelationKey(String correlationKey) {
085            this.correlationKey = correlationKey;
086        }
087    
088        // Helper methods
089        //-------------------------------------------------------------------------
090    
091        /**
092         * Returns the activity state for the given activity
093         *
094         * @param activityRules the activity to find the state for
095         * @return the activity state or null if no state could be found for the
096         *         given activity
097         */
098        public ActivityState getActivityState(ActivityRules activityRules) {
099            for (ActivityState activityState : getActivityStates()) {
100                if (activityState.isActivity(activityRules)) {
101                    return activityState;
102                }
103            }
104            return null;
105        }
106    
107        public ActivityState getOrCreateActivityState(ActivityRules activityRules) {
108            ActivityState state = getActivityState(activityRules);
109    
110            if (state == null) {
111                state = createActivityState();
112                state.setProcessInstance(this);
113                state.setActivityDefinition(activityRules.getActivityDefinition());
114                // we don't need to do: getTemplate().persist(state);
115            }
116    
117            return state;
118        }
119    
120        protected ActivityState createActivityState() {
121            return new ActivityState();
122        }
123    }