2 * PartsListVisitorStrategy.java
4 package net.sf.openrocket.gui.print.visitor;
6 import com.itextpdf.text.Document;
7 import com.itextpdf.text.pdf.PdfWriter;
8 import net.sf.openrocket.rocketcomponent.BodyTube;
9 import net.sf.openrocket.rocketcomponent.Coaxial;
10 import net.sf.openrocket.rocketcomponent.ComponentVisitor;
11 import net.sf.openrocket.rocketcomponent.EllipticalFinSet;
12 import net.sf.openrocket.rocketcomponent.FreeformFinSet;
13 import net.sf.openrocket.rocketcomponent.InnerTube;
14 import net.sf.openrocket.rocketcomponent.LaunchLug;
15 import net.sf.openrocket.rocketcomponent.NoseCone;
16 import net.sf.openrocket.rocketcomponent.RadiusRingComponent;
17 import net.sf.openrocket.rocketcomponent.RingComponent;
18 import net.sf.openrocket.rocketcomponent.RocketComponent;
19 import net.sf.openrocket.rocketcomponent.Transition;
20 import net.sf.openrocket.rocketcomponent.TrapezoidFinSet;
22 import java.util.HashMap;
27 * A visitor strategy for creating documentation about a parts list.
29 public class PartsListVisitorStrategy extends BaseVisitorStrategy {
32 * Accumulator for parts data.
34 private Map<PartsAccumulator, PartsAccumulator> crap = new HashMap<PartsAccumulator, PartsAccumulator>();
37 * Construct a strategy for visiting a parts hierarchy for the purposes of collecting details on those parts.
39 * @param doc The iText document
40 * @param theWriter The direct iText writer
41 * @param theStagesToVisit The stages to be visited by this strategy
43 public PartsListVisitorStrategy (Document doc, PdfWriter theWriter, Set<Integer> theStagesToVisit) {
44 super(doc, theWriter, theStagesToVisit);
51 public void visit (final RingComponent visitable) {
52 final PartsAccumulator key = new PartsAccumulator(visitable);
53 PartsAccumulator pa = crap.get(key);
59 RocketComponent[] rc = visitable.getChildren();
67 public void visit (final InnerTube visitable) {
68 final PartsAccumulator key = new PartsAccumulator(visitable);
69 PartsAccumulator pa = crap.get(key);
75 RocketComponent[] rc = visitable.getChildren();
83 public void visit (final LaunchLug visitable) {
84 final PartsAccumulator key = new PartsAccumulator(visitable);
85 PartsAccumulator pa = crap.get(key);
97 public void visit (final Transition visitable) {
98 final PartsAccumulator key = new PartsAccumulator(visitable);
99 PartsAccumulator pa = crap.get(key);
105 RocketComponent[] rc = visitable.getChildren();
113 public void visit (final RadiusRingComponent visitable) {
114 final PartsAccumulator key = new PartsAccumulator(visitable);
115 PartsAccumulator pa = crap.get(key);
121 RocketComponent[] rc = visitable.getChildren();
129 public void visit (final NoseCone visitable) {
130 final PartsAccumulator key = new PartsAccumulator(visitable);
131 PartsAccumulator pa = crap.get(key);
137 RocketComponent[] rc = visitable.getChildren();
145 public void visit (final BodyTube visitable) {
146 final PartsAccumulator key = new PartsAccumulator(visitable);
147 PartsAccumulator pa = crap.get(key);
153 RocketComponent[] rc = visitable.getChildren();
161 public void visit (final TrapezoidFinSet visitable) {
168 public void visit (final EllipticalFinSet visitable) {
175 public void visit (final FreeformFinSet visitable) {
182 public void setParent (final ComponentVisitor theParent) {
190 public void close () {
191 for (PartsAccumulator partsAccumulator : crap.keySet()) {
192 System.err.println(partsAccumulator.component.getComponentName() + " " + partsAccumulator.quantity);
198 class PartsAccumulator {
202 RocketComponent component;
204 PartsAccumulator (RocketComponent theComponent) {
205 component = theComponent;
216 public boolean equals (final Object o1) {
221 RocketComponent that;
222 if (o1 instanceof net.sf.openrocket.gui.print.visitor.PartsAccumulator) {
223 that = ((net.sf.openrocket.gui.print.visitor.PartsAccumulator)o1).component;
225 else if (o1 instanceof RocketComponent) {
226 that = (RocketComponent)o1;
232 if (this.component.getClass().equals(that.getClass())) {
234 if (that.getLength() == this.component.getLength()) {
235 if (that.getMass() == this.component.getMass()) {
239 if (this.component instanceof Coaxial &&
240 that instanceof Coaxial) {
241 Coaxial cThis = (Coaxial)this.component;
242 Coaxial cThat = (Coaxial)that;
243 if (cThis.getInnerRadius() == cThat.getInnerRadius() &&
244 cThis.getOuterRadius() == cThat.getOuterRadius()) {
253 public int hashCode() {
254 return component.getComponentName().hashCode();