create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / optimization / general / OptimizationControllerDelegator.java
1 package net.sf.openrocket.optimization.general;
2
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.List;
6
7 /**
8  * An OptimizationController that delegates control actions to multiple other controllers.
9  * The optimization is stopped if any of the controllers stops it.
10  * 
11  * @author Sampo Niskanen <sampo.niskanen@iki.fi>
12  */
13 public class OptimizationControllerDelegator implements OptimizationController {
14         
15         private final List<OptimizationController> controllers = new ArrayList<OptimizationController>();
16         
17         /**
18          * Construct the controlled based on an array of controllers.
19          * 
20          * @param controllers   the controllers to use.
21          */
22         public OptimizationControllerDelegator(OptimizationController... controllers) {
23                 for (OptimizationController c : controllers) {
24                         this.controllers.add(c);
25                 }
26         }
27         
28         /**
29          * Construct the controller based on a collection of controllers.
30          * 
31          * @param controllers   the controllers to use.
32          */
33         public OptimizationControllerDelegator(Collection<OptimizationController> controllers) {
34                 this.controllers.addAll(controllers);
35         }
36         
37         
38         /**
39          * Control whether to continue optimization.  This method returns false if any of the
40          * used controllers returns false.  However, all controllers will be called even if
41          * an earlier one stops the optimization.
42          */
43         @Override
44         public boolean stepTaken(Point oldPoint, double oldValue, Point newPoint, double newValue, double stepSize) {
45                 boolean ret = true;
46                 
47                 for (OptimizationController c : controllers) {
48                         if (!c.stepTaken(oldPoint, oldValue, newPoint, newValue, stepSize)) {
49                                 ret = false;
50                         }
51                 }
52                 
53                 return ret;
54         }
55         
56 }