1 package org.lcsim.detector;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.List;
6
7 public class PhysicalVolumeContainer
8 extends ArrayList<IPhysicalVolume>
9 implements IPhysicalVolumeContainer
10 {
11 public boolean uniqPhysVol=false;
12 public boolean uniqName=false;
13 public boolean uniqCopyNum=false;
14
15 public class PhysicalVolumeContainerException extends Exception
16 {
17 public PhysicalVolumeContainerException(String mesg)
18 {
19 super(mesg);
20 }
21 }
22
23 public class DuplicatePhysicalVolumeException extends PhysicalVolumeContainerException
24 {
25 public DuplicatePhysicalVolumeException(IPhysicalVolume pv)
26 {
27 super("The PhysicalVolume " + pv + " is already in this container!");
28 }
29 }
30
31 public class DuplicateNameException extends PhysicalVolumeContainerException
32 {
33 public DuplicateNameException(IPhysicalVolume pv)
34 {
35 super("This container already has a PhysicalVolume called <" + pv.getName() + ">!");
36 }
37 }
38
39 public class DuplicateCopyNumberException extends PhysicalVolumeContainerException
40 {
41 public DuplicateCopyNumberException(IPhysicalVolume pv)
42 {
43 super("This container already has a PhysicalVolume with copy number <" + pv.getCopyNumber() + ">!");
44 }
45 }
46
47 public PhysicalVolumeContainer()
48 {}
49
50 private HashMap<String,List<IPhysicalVolume>> map = new HashMap<String,List<IPhysicalVolume>>();
51
52 public PhysicalVolumeContainer(
53 boolean uniqPhysVol,
54 boolean uniqName,
55 boolean uniqCopyNum)
56 {
57 this.uniqPhysVol = uniqPhysVol;
58 this.uniqName = uniqName;
59 this.uniqCopyNum= uniqCopyNum;
60 }
61
62 @Override
63 public boolean add(IPhysicalVolume physvol)
64 {
65 try {
66 checkAdd(physvol);
67
68 String name = physvol.getName();
69
70 List<IPhysicalVolume> l;
71 if (map.containsKey(name)) {
72 l = map.get(name);
73 }
74
75 else {
76 l = new ArrayList<IPhysicalVolume>();
77 }
78 l.add(physvol);
79 map.put(name, l);
80 super.add(physvol);
81 }
82 catch ( PhysicalVolumeContainerException x )
83 {
84 throw new RuntimeException(x);
85 }
86 return true;
87 }
88
89 private void checkAdd(IPhysicalVolume physvol) throws PhysicalVolumeContainerException
90 {
91 if ( uniqPhysVol && contains(physvol))
92 {
93 throw new DuplicatePhysicalVolumeException(physvol);
94 }
95 else if (uniqName && findByName(physvol.getName()).size() != 0)
96 {
97 throw new DuplicateNameException(physvol);
98 }
99 else if (uniqCopyNum && findByCopyNum(physvol.getCopyNumber()).size() != 0)
100 {
101 throw new DuplicateCopyNumberException(physvol);
102 }
103 }
104
105 public PhysicalVolumeContainer findByName(String name)
106 {
107 PhysicalVolumeContainer physvols = new PhysicalVolumeContainer();
108
109
110
111
112
113
114
115 if (map.containsKey(name))
116 physvols.addAll(map.get(name));
117 return physvols;
118 }
119
120 public PhysicalVolumeContainer findByCopyNum(int copyNum)
121 {
122 PhysicalVolumeContainer physvols = new PhysicalVolumeContainer();
123 for (IPhysicalVolume physvol : this)
124 {
125 if (physvol.getCopyNumber() == copyNum)
126 {
127 physvols.add(physvol);
128 }
129 }
130 return physvols;
131 }
132 }