View Javadoc

1   package com.atlassian.jira.workflow.function;
2   
3   import java.util.Iterator;
4   import java.util.Map;
5   
6   import com.atlassian.jira.ManagerFactory;
7   import com.atlassian.jira.issue.Issue;
8   import com.atlassian.jira.issue.ModifiedValue;
9   import com.atlassian.jira.issue.MutableIssue;
10  import com.atlassian.jira.issue.fields.FieldManager;
11  import com.atlassian.jira.issue.fields.OrderableField;
12  import com.atlassian.jira.workflow.function.issue.GenerateChangeHistoryFunction;
13  import com.opensymphony.module.propertyset.PropertySet;
14  import com.opensymphony.workflow.FunctionProvider;
15  
16  public abstract class AInheritFromParentFunction implements FunctionProvider {
17  	
18  	protected boolean storeModifiedFields = false;
19  	protected boolean storeWithHistory = false;
20  
21  	public void execute(Map transientVars, Map args, PropertySet ps) {
22  		MutableIssue issue = (MutableIssue) transientVars.get("issue");
23  		Issue parent = issue.getParentObject();		
24  		inheritFromParent(issue, parent);		
25  		issue.store();
26  
27  		if (storeModifiedFields) {
28  			if (storeWithHistory) {
29  				storeModifiedFields(transientVars, args, ps);
30  			}  else {
31  				storeModifiedFields(issue);
32  			}			
33  		}
34  	}
35  
36  	/** storeModifiedFields without History
37  	 *  @TODO Verify if it is finally done in issue.store()
38  	 * @param issue Issue to Update
39  	 */
40  	protected void storeModifiedFields(MutableIssue issue) {
41        FieldManager fieldManager = ManagerFactory.getFieldManager();
42        // Maybe move this code to the issue.store() method
43        Map modifiedFields = issue.getModifiedFields();
44        for (Iterator iterator = modifiedFields.keySet().iterator(); iterator.hasNext();)
45        {
46            String fieldId = (String) iterator.next();
47            if (fieldManager.isOrderableField(fieldId))
48            {
49                OrderableField field = fieldManager.getOrderableField(fieldId);
50                Object newValue = ((ModifiedValue) modifiedFields.get(fieldId)).getNewValue();
51                if (newValue != null) field.createValue(issue, newValue);
52            }
53        }
54        // Reset the fields as they all have been persisted to the db. Maybe move this code to the "createValue"
55        // method of the issue, so that the fields removes itself from the modified list as soon as it is persisted.
56        issue.resetModifiedFields();
57  	}
58  
59  	/** storeModifiedFields with History
60  	 * @param transientVars
61  	 * @param args
62  	 * @param ps
63  	 */
64  	protected void storeModifiedFields(Map transientVars, Map args, PropertySet ps) {
65  		GenerateChangeHistoryFunction gchFunction = new GenerateChangeHistoryFunction();
66  		gchFunction.execute(transientVars, args, ps);
67  	}
68  	
69  	protected abstract void inheritFromParent(MutableIssue _issue, Issue _parent);
70  }