Downloads Documentation Community Contribute Demo






Show Sidebar
Login | Register
Show
Ignore:
Timestamp:
05/24/08 14:37:02 (8 months ago)
Author:
bwolfe
Message:

Merging api-refactoring to trunk [3595]:[4355]

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • openmrs/trunk/src/api/org/openmrs/ProgramWorkflow.java

    r4095 r4358  
    1414package org.openmrs; 
    1515 
     16import java.util.ArrayList; 
    1617import java.util.Comparator; 
    1718import java.util.Date; 
     19import java.util.List; 
     20import java.util.Locale; 
    1821import java.util.Set; 
    1922import java.util.TreeSet; 
    20  
    21 import org.openmrs.api.context.Context; 
    22  
     23import java.util.HashSet; 
     24 
     25import org.apache.commons.logging.Log; 
     26import org.apache.commons.logging.LogFactory; 
     27import org.springframework.beans.support.PropertyComparator; 
     28 
     29/** 
     30 * ProgramWorkflow 
     31 */ 
    2332public class ProgramWorkflow implements java.io.Serializable { 
    2433 
    2534        private static final long serialVersionUID = 1L; 
     35        protected final Log log = LogFactory.getLog(getClass()); 
     36         
     37        // ****************** 
     38        // Properties 
     39        // ****************** 
    2640         
    2741        private Integer programWorkflowId; 
     
    3044        private User creator;  
    3145        private Date dateCreated; 
    32         private Boolean voided = false;  
    33         private User voidedBy; 
    34         private Date dateVoided;  
    35         private String voidReason; 
    36         private Set<ProgramWorkflowState> states; 
    37  
     46        private Boolean retired = false;  
     47        private User changedBy; 
     48        private Date dateChanged; 
     49        private Set<ProgramWorkflowState> states = new HashSet<ProgramWorkflowState>(); 
     50 
     51        // ****************** 
     52        // Constructors 
     53        // ****************** 
     54         
     55        /** Default Constructor */ 
    3856        public ProgramWorkflow() { } 
    3957         
     58        /** Constructor with id */ 
     59        public ProgramWorkflow(Integer programWorkflowId) { 
     60                setProgramWorkflowId(programWorkflowId); 
     61        } 
     62         
     63        // ****************** 
     64        // Instance methods 
     65        // ****************** 
     66         
     67        /** 
     68         * Adds a new {@link ProgramWorkflowState} to this ProgramWorkflow 
     69         * @param state - the {@link ProgramWorkflowState} to add 
     70         */ 
     71        public void addState(ProgramWorkflowState state) { 
     72                state.setProgramWorkflow(this); 
     73                getStates().add(state); 
     74        } 
     75 
     76        /** 
     77         * Removes a {@link ProgramWorkflowState} from this ProgramWorkflow 
     78         * @param state - the {@link ProgramWorkflowState} to remove 
     79         */ 
     80        public void removeState(ProgramWorkflowState state) { 
     81                if (getStates().contains(state)) { 
     82                        getStates().remove(state); 
     83                        state.setProgramWorkflow(null); 
     84                } 
     85        } 
     86         
     87        /** 
     88         * Retires a {@link ProgramWorkflowState} 
     89         * @param state - the {@link ProgramWorkflowState} to retire 
     90         */ 
     91        public void retireState(ProgramWorkflowState state) { 
     92                state.setRetired(true); 
     93        } 
     94 
     95        /** 
     96         * Returns a {@link ProgramWorkflowState} whose primary key id matches the input parameter 
     97         * @param programWorkflowStateId the primary key {@link Integer} id to match 
     98         * @return a {@link ProgramWorkflowState} whose identifier matches the passed <code>programWorkflowStateId</code> 
     99         */ 
     100        public ProgramWorkflowState getState(Integer programWorkflowStateId) { 
     101                for (ProgramWorkflowState s : getStates()) { 
     102                        if (s.getProgramWorkflowStateId().equals(programWorkflowStateId)) { 
     103                                return s; 
     104                        } 
     105                } 
     106                return null; 
     107        } 
     108         
     109        /** 
     110         * Returns a {@link ProgramWorkflowState} whose Concept matches the passed concept 
     111         * @param name the Concept to match 
     112         * @return a {@link ProgramWorkflowState} whose {@link Concept} matches the passed <code>concept</code> 
     113         */ 
     114        public ProgramWorkflowState getState(Concept concept) { 
     115                for (ProgramWorkflowState s : getStates()) { 
     116                        if (s.getConcept().equals(concept)) { 
     117                                return s; 
     118                        } 
     119                } 
     120                return null; 
     121        } 
     122         
     123        /** 
     124         * Returns a {@link ProgramWorkflowState} whose Concept name matches the passed name in any {@link Locale} 
     125         * @param name the Concept name to match in any {@link Locale} 
     126         * @return a {@link ProgramWorkflowState} whose {@link Concept} name matches the passed <code>name</code> 
     127         */ 
     128        public ProgramWorkflowState getState(String name) { 
     129                for (ProgramWorkflowState s : getStates()) { 
     130                        if (s.getConcept().isNamed(name)) { 
     131                                return s; 
     132                        } 
     133                } 
     134                return null; 
     135        } 
     136         
     137        /** 
     138         * Returns a {@link ProgramWorkflowState} whose {@link Concept} has any {@link ConceptName} that matches the given <code>name</name> 
     139         * @param name the {@link ProgramWorkflowState} name, in any {@link Locale} 
     140         * @return a {@link ProgramWorkflowState} which has the passed <code>name</code> in any {@link Locale} 
     141         */ 
     142        public ProgramWorkflowState getStateByName(String name) { 
     143                for (ProgramWorkflowState s : getStates()) { 
     144                        if (s.getConcept().isNamed(name)) { 
     145                                return s; 
     146                        } 
     147                } 
     148                return null; 
     149        } 
     150 
     151        /** 
     152         * Returns a {@link Set<ProgramWorkflowState>} including all non-retired ProgramWorkflowStates 
     153         * and all retired ProgramWorkflowStates in this ProgramWorkflow if <code>includeRetired</code> is true 
     154         * @param includeRetired - if false, returns only non-retired {@link ProgramWorkflowState} objects in this ProgramWorkflow 
     155         * @return Set<ProgramWorkflowState> - all ProgramWorkflowStates matching input parameters  
     156         */ 
     157        public Set<ProgramWorkflowState> getStates(boolean includeRetired) { 
     158                Set<ProgramWorkflowState> ret = new HashSet<ProgramWorkflowState>(); 
     159                for (ProgramWorkflowState s : getStates()) { 
     160                        if (includeRetired || !s.isRetired()) { 
     161                                ret.add(s); 
     162                        } 
     163                } 
     164                return ret; 
     165        } 
     166 
     167        /** 
     168         * Returns a {@link Set<ProgramWorkflowState>} including all ProgramWorkflowStates, sorted by {@link ConceptName} 
     169         * @return Set<ProgramWorkflowState> - all ProgramWorkflowStates, sorted by {@link ConceptName} 
     170         */ 
     171        @SuppressWarnings("unchecked") 
     172        public Set<ProgramWorkflowState> getSortedStates() { 
     173                Comparator c = new PropertyComparator("concept.name.name", true, true); 
     174                TreeSet<ProgramWorkflowState> sorted = new TreeSet<ProgramWorkflowState>(c); 
     175                if (getStates() != null ) { 
     176                        sorted.addAll(getStates()); 
     177                } 
     178                return sorted; 
     179        } 
     180         
     181        /** 
     182         * Returns a {@link List<ProgramWorkflowState>} including all possible next ProgramWorkflowStates,  
     183         * for the passed {@link PatientProgram} ordered by {@link ConceptName} 
     184         * @param - patientProgram - The PatientProgram to check 
     185         * @return List<ProgramWorkflowState> - all possible next ProgramWorkflowStates, for the passed {@link PatientProgram} ordered by {@link ConceptName} 
     186         */ 
     187        public List<ProgramWorkflowState> getPossibleNextStates(PatientProgram patientProgram) { 
     188                List<ProgramWorkflowState> ret = new ArrayList<ProgramWorkflowState>(); 
     189                PatientState currentState = patientProgram.getCurrentState(this); 
     190                for (ProgramWorkflowState st : getSortedStates()) { 
     191                        if (isLegalTransition(currentState == null ? null : currentState.getState(), st)) { 
     192                                ret.add(st); 
     193                        } 
     194                } 
     195                return ret; 
     196        } 
     197         
     198        /** 
     199         * Returns a {@link List<ProgramWorkflowState>} including all possible next ProgramWorkflowStates,  
     200         * for the passed {@link PatientProgram} ordered by {@link ConceptName} 
     201         * @param fromState - {@link ProgramWorkflowState} to check transition from 
     202         * @param toState - {@link ProgramWorkflowState} to check transition to 
     203         * @return boolean - true if it is allowable to transition from <code>fromState</code> to <code>toState</code> 
     204         */ 
     205        public boolean isLegalTransition(ProgramWorkflowState fromState, ProgramWorkflowState toState) { 
     206                if (fromState == null) { 
     207                        return toState.getInitial(); 
     208                } 
     209                if (fromState.equals(toState)) { 
     210                        return false; 
     211                } 
     212                return true; 
     213        } 
     214 
     215        /** @see Object#equals(Object) */ 
    40216        public boolean equals(Object obj) { 
    41                 if (obj instanceof ProgramWorkflow) { 
    42                         ProgramWorkflow wf = (ProgramWorkflow)obj; 
    43                         return (this.getProgramWorkflowId().equals(wf.getProgramWorkflowId())); 
     217                if (obj != null && obj instanceof ProgramWorkflow) { 
     218                        ProgramWorkflow p = (ProgramWorkflow)obj; 
     219                        if (this.getProgramWorkflowId() == null) { 
     220                                return p.getProgramWorkflowId() == null; 
     221                        } 
     222                        return (this.getProgramWorkflowId().equals(p.getProgramWorkflowId())); 
    44223                } 
    45224                return false; 
    46225        } 
    47226         
    48         /** 
    49          * @return A state that has the given name in any locale, or null if none does 
    50          */ 
    51         public ProgramWorkflowState getStateByName(String name) { 
    52                 for (ProgramWorkflowState state : getStates()) 
    53                         if (state.getConcept().isNamed(name)) 
    54                                 return state; 
    55                 return null; 
    56         } 
    57          
    58         public Date getDateVoided() { 
    59                 return dateVoided; 
    60         } 
    61  
    62         public void setDateVoided(Date dateVoided) { 
    63                 this.dateVoided = dateVoided; 
    64         } 
    65  
     227        /** @see Object#toString() */ 
     228        public String toString() { 
     229                return "ProgramWorkflow(id=" + getProgramWorkflowId() + ", concept=" + getConcept() + ", states=" + getStates() + ")"; 
     230        } 
     231         
     232        // ****************** 
     233        // Property Access 
     234        // ****************** 
     235         
    66236        public Set<ProgramWorkflowState> getStates() { 
    67237                return states; 
    68238        } 
    69  
    70         public Set<ProgramWorkflowState> getSortedStates() { 
    71                 TreeSet<ProgramWorkflowState> sorted = new TreeSet<ProgramWorkflowState>(new StateAlphaComparator()); 
    72                  
    73                 if ( this.getStates() != null ) { 
    74                         sorted.addAll(this.getStates()); 
    75                 } 
    76  
    77                 return sorted; 
    78         } 
    79239         
    80240        public void setStates(Set<ProgramWorkflowState> states) { 
    81241                this.states = states; 
    82242        } 
    83  
    84         public Boolean getVoided() { 
    85                 return voided; 
    86         } 
    87  
    88         public void setVoided(Boolean voided) { 
    89                 this.voided = voided; 
    90         } 
    91  
    92         public User getVoidedBy() { 
    93                 return voidedBy; 
    94         } 
    95  
    96         public void setVoidedBy(User voidedBy) { 
    97                 this.voidedBy = voidedBy; 
    98         } 
    99  
    100         public String getVoidReason() { 
    101                 return voidReason; 
    102         } 
    103  
    104         public void setVoidReason(String voidReason) { 
    105                 this.voidReason = voidReason; 
    106         } 
     243         
     244    public Boolean getRetired() { 
     245        return retired; 
     246    } 
     247     
     248    public Boolean isRetired() { 
     249        return getRetired(); 
     250    } 
     251 
     252    public void setRetired(Boolean retired) { 
     253        this.retired = retired; 
     254    } 
     255 
     256    public User getChangedBy() { 
     257        return changedBy; 
     258    } 
     259 
     260    public void setChangedBy(User changedBy) { 
     261        this.changedBy = changedBy; 
     262    } 
     263 
     264    public Date getDateChanged() { 
     265        return dateChanged; 
     266    } 
     267 
     268    public void setDateChanged(Date dateChanged) { 
     269        this.dateChanged = dateChanged; 
     270    } 
    107271 
    108272        public Concept getConcept() { 
     
    145309                this.programWorkflowId = programWorkflowId; 
    146310        } 
    147          
    148         public void addState(ProgramWorkflowState s) { 
    149                 s.setProgramWorkflow(this); 
    150                 states.add(s); 
    151         } 
    152          
    153         public String toString() { 
    154                 return "Workflow_" + programWorkflowId;  
    155         } 
    156          
    157         private class StateAlphaComparator implements Comparator<ProgramWorkflowState> { 
    158  
    159                 public int compare(ProgramWorkflowState s1, ProgramWorkflowState s2) { 
    160                         if ( s1 != null && s2 != null ) { 
    161                                 String name1 = s1.getConcept().getName(Context.getLocale()).getName(); 
    162                                 String name2 = s2.getConcept().getName(Context.getLocale()).getName(); 
    163                                 if ( name1 != null && name2 != null ) { 
    164                                         return name1.compareTo(name2); 
    165                                 } 
    166                         } 
    167                         return 0; 
    168                 } 
    169                  
    170         } 
    171311}