View Javadoc

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 //		for (IPhysicalVolume physvol : this)
109 //		{
110 //			if (physvol.getName().equals(name))
111 //			{
112 //				physvols.add(physvol);
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 }