View Javadoc
1   package de.fhdw.wtf.common.task;
2   
3   import java.util.ArrayList;
4   import java.util.Collection;
5   import java.util.Iterator;
6   
7   import de.fhdw.wtf.common.exception.walker.CyclicDependencyException;
8   import de.fhdw.wtf.common.exception.walker.CyclicPartDefinitionException;
9   import de.fhdw.wtf.common.task.result.OKTaskResult;
10  import de.fhdw.wtf.common.task.result.TaskResult;
11  
12  /**
13   * A GroupDependencyTask groups multiple member tasks to a seperate unit. It may as well have dependencies and be a
14   * dependency for others.
15   * 
16   */
17  public class GroupDependencyTask extends DependencyTask {
18  	
19  	/**
20  	 * Members participating in this group.
21  	 */
22  	private final Collection<DependencyTask> members;
23  	
24  	/**
25  	 * Constructor of {@link GroupDependencyTask}.
26  	 * 
27  	 * @param taskmanager
28  	 *            taskmanager
29  	 */
30  	public GroupDependencyTask(final TaskExecutor taskmanager) {
31  		super(taskmanager);
32  		this.members = new ArrayList<>();
33  	}
34  	
35  	/**
36  	 * Creates a {@link GroupDependencyTask}-Object.
37  	 * 
38  	 * @param taskmanager
39  	 *            taskmanager
40  	 * @return The {@link GroupDependencyTask}-Object.
41  	 */
42  	public static GroupDependencyTask create(final TaskExecutor taskmanager) {
43  		return new GroupDependencyTask(taskmanager);
44  	}
45  	
46  	/**
47  	 * Adds this task as member of this group.
48  	 * 
49  	 * @param t
50  	 *            new group member
51  	 * @throws CyclicPartDefinitionException
52  	 *             when cycles would arise
53  	 */
54  	public void addMember(final DependencyTask t) throws CyclicPartDefinitionException {
55  		if (this.contains(t)) {
56  			throw CyclicPartDefinitionException.create();
57  		} else {
58  			try {
59  				super.addDependency(t);
60  				this.members.add(t);
61  				final Iterator<DependencyTask> i = this.getDependencies().getDependencies().iterator();
62  				while (i.hasNext()) {
63  					final DependencyTask current = i.next();
64  					if (!this.members.contains(current)) {
65  						t.addDependency(current);
66  					}
67  				}
68  			} catch (final CyclicDependencyException e) {
69  				throw CyclicPartDefinitionException.create();
70  			}
71  		}
72  	}
73  	
74  	/**
75  	 * Adds all tasks as member of this group task individually.
76  	 * 
77  	 * @param newMembers
78  	 *            list of independent multiple new members
79  	 * @throws CyclicPartDefinitionException
80  	 *             when cycles would arise
81  	 * @see {@link #addMember(DependencyTask)}
82  	 */
83  	public void addMembers(final DependencyTask... newMembers) throws CyclicPartDefinitionException {
84  		for (final DependencyTask newMember : newMembers) {
85  			this.addMember(newMember);
86  		}
87  	}
88  	
89  	@Override
90  	public void addDependency(final DependencyTask a) throws CyclicDependencyException {
91  		final Iterator<DependencyTask> i = this.members.iterator();
92  		while (i.hasNext()) {
93  			final DependencyTask current = i.next();
94  			current.addDependency(a);
95  		}
96  		super.addDependency(a);
97  	}
98  	
99  	@Override
100 	public boolean containsTransitive(final DependencyTask a) {
101 		final Iterator<DependencyTask> i = this.members.iterator();
102 		while (i.hasNext()) {
103 			final DependencyTask current = i.next();
104 			if (current.contains(a)) {
105 				return true;
106 			}
107 		}
108 		return false;
109 	}
110 	
111 	@Override
112 	public TaskResult doWork() {
113 		return new OKTaskResult();
114 	}
115 	
116 }