001/**
002 * Copyright 2005-2016 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.rice.kew.engine.node;
017
018import java.io.Serializable;
019import java.util.ArrayList;
020import java.util.Iterator;
021import java.util.List;
022
023import javax.persistence.CascadeType;
024import javax.persistence.Column;
025import javax.persistence.Entity;
026import javax.persistence.FetchType;
027import javax.persistence.GeneratedValue;
028import javax.persistence.Id;
029import javax.persistence.JoinColumn;
030import javax.persistence.ManyToOne;
031import javax.persistence.OneToMany;
032import javax.persistence.OneToOne;
033import javax.persistence.Table;
034import javax.persistence.Version;
035
036import org.hibernate.annotations.Fetch;
037import org.hibernate.annotations.FetchMode;
038import org.hibernate.annotations.GenericGenerator;
039import org.hibernate.annotations.Parameter;
040import org.kuali.rice.core.framework.persistence.jpa.OrmUtils;
041import org.kuali.rice.kew.service.KEWServiceLocator;
042
043/**
044 * Represents a branch in the routing path of the document.
045 * 
046 * @author Kuali Rice Team (rice.collab@kuali.org)
047 */
048@Entity
049//@Sequence(name="KREW_RTE_NODE_S",property="branchId")
050@Table(name="KREW_RTE_BRCH_T")
051public class Branch implements Serializable {
052
053        private static final long serialVersionUID = 7164561979112939112L;
054        
055        @Id
056        @GeneratedValue(generator="KREW_RTE_NODE_S")
057        @GenericGenerator(name="KREW_RTE_NODE_S",strategy="org.hibernate.id.enhanced.SequenceStyleGenerator",parameters={
058                        @Parameter(name="sequence_name",value="KREW_RTE_NODE_S"),
059                        @Parameter(name="value_column",value="id")
060        })
061        @Column(name="RTE_BRCH_ID")
062        private String branchId;
063        @ManyToOne(fetch=FetchType.EAGER,cascade=CascadeType.PERSIST)
064        @JoinColumn(name="PARNT_ID")
065        private Branch parentBranch;
066        @Column(name="NM")
067        private String name;
068    @OneToMany(fetch=FetchType.EAGER,cascade={CascadeType.PERSIST,CascadeType.MERGE}, mappedBy="branch", orphanRemoval=true)
069    @Fetch(value=FetchMode.SELECT)
070        private List<BranchState> branchState = new ArrayList<BranchState>();
071//        apache lazy list commented out due to not being serializable
072//    private List branchState = ListUtils.lazyList(new ArrayList(),
073//            new Factory() {
074//                              public Object create() {
075//                                      return new BranchState();
076//                              }
077//                      });
078    @OneToOne(fetch=FetchType.EAGER,cascade={CascadeType.PERSIST})
079        @JoinColumn(name="INIT_RTE_NODE_INSTN_ID")
080        private RouteNodeInstance initialNode;
081    @ManyToOne(fetch=FetchType.EAGER,cascade=CascadeType.PERSIST)
082        @JoinColumn(name="SPLT_RTE_NODE_INSTN_ID")
083        private RouteNodeInstance splitNode;
084        @ManyToOne(fetch=FetchType.EAGER,cascade={CascadeType.PERSIST,CascadeType.MERGE})
085        @JoinColumn(name="JOIN_RTE_NODE_INSTN_ID")
086        private RouteNodeInstance joinNode;
087                
088        @Version
089        @Column(name="VER_NBR")
090        private Integer lockVerNbr;
091        
092        public String getName() {
093                return name;
094        }
095        
096        public void setName(String name) {
097                this.name = name;       
098        }
099        
100    public RouteNodeInstance getSplitNode() {
101        return splitNode;
102    }
103    public void setSplitNode(RouteNodeInstance splitNode) {
104        this.splitNode = splitNode;
105    }
106    public RouteNodeInstance getInitialNode() {
107                return initialNode;
108        }
109        public void setInitialNode(RouteNodeInstance activeNode) {
110                this.initialNode = activeNode;
111        }
112        public String getBranchId() {
113                return branchId;
114        }
115        public void setBranchId(String branchId) {
116                this.branchId = branchId;
117        }
118        public RouteNodeInstance getJoinNode() {
119                return joinNode;
120        }
121        public void setJoinNode(RouteNodeInstance joinNode) {
122                this.joinNode = joinNode;
123        }
124        public Branch getParentBranch() {
125                return parentBranch;
126        }
127        public void setParentBranch(Branch parentBranch) {
128                this.parentBranch = parentBranch;
129        }
130    public BranchState getBranchState(String key) {
131        for (Iterator iter = branchState.iterator(); iter.hasNext();) {
132            BranchState branchState = (BranchState) iter.next();
133            if (branchState.getKey().equals(key)) {
134                return branchState;
135            }
136        }
137        return null;
138    }
139    public void addBranchState(BranchState state) {
140        branchState.add(state);
141        state.setBranch(this);
142    }
143    public List<BranchState> getBranchState() {
144        return branchState;
145    }
146    public void setBranchState(List<BranchState> branchState) {
147        this.branchState.clear();
148        this.branchState.addAll(branchState);
149        //this.branchState = branchState;
150    }
151    
152    public BranchState getDocBranchState(int index){
153        while (branchState.size() <= index) {
154            branchState.add(new BranchState());
155        }
156        return (BranchState) branchState.get(index);
157   
158    }
159    
160        public Integer getLockVerNbr() {
161        return lockVerNbr;
162    }
163    public void setLockVerNbr(Integer lockVerNbr) {
164        this.lockVerNbr = lockVerNbr;
165    }
166
167    public String toString() {
168        return "[Branch: branchId=" + branchId +
169                      ", parentBranch=" + (parentBranch == null ? "null" : parentBranch.getBranchId()) +
170                      "]";
171    }
172
173        //@PrePersist
174    public void beforeInsert(){
175        OrmUtils.populateAutoIncValue(this, KEWServiceLocator.getEntityManagerFactory().createEntityManager());
176    }    
177}
178