2727import com .google .common .base .Function ;
2828import java .util .HashMap ;
2929import java .util .Map ;
30- import sun . reflect . generics . reflectiveObjects . NotImplementedException ;
30+ import java . util . NoSuchElementException ;
3131
3232public class ResourceCleaner {
3333 private final Compute compute ;
@@ -46,13 +46,9 @@ private class ManagedResource<T> {
4646 final T res ;
4747 Function <T , Void > func ;
4848
49- private ManagedResource (T res ) {
49+ private ManagedResource (T res , Function < T , Void > func ) {
5050 this .res = res ;
51-
52- @ SuppressWarnings ("unchecked" )
53- Function <T , Void > localFunc = (Function <T , Void >) getDeleteMethod (res );
54-
55- this .func = localFunc ;
51+ this .func = func ;
5652 }
5753
5854 public void delete () {
@@ -69,142 +65,115 @@ public void cleanUp() {
6965 }
7066
7167 public ResourceCleaner add (AddressId addressId ) {
72- ManagedResource <AddressId > r = new ManagedResource <>(addressId );
68+ ManagedResource <AddressId > r =
69+ new ManagedResource <>(
70+ addressId ,
71+ new Function <AddressId , Void >() {
72+ @ Override
73+ public Void apply (AddressId addressId ) {
74+ compute .deleteAddress (addressId );
75+ return null ;
76+ }
77+ });
7378 resources .put (addressId , r );
7479 return this ;
7580 }
7681
77- public ResourceCleaner remove (AddressId addressId ) {
78- resources .remove (addressId );
79- return this ;
80- }
81-
8282 public ResourceCleaner add (DiskId diskId ) {
83- ManagedResource <DiskId > r = new ManagedResource <>(diskId );
83+ ManagedResource <DiskId > r =
84+ new ManagedResource <>(
85+ diskId ,
86+ new Function <DiskId , Void >() {
87+ @ Override
88+ public Void apply (DiskId diskId ) {
89+ compute .deleteDisk (diskId );
90+ return null ;
91+ }
92+ });
8493 resources .put (diskId , r );
8594 return this ;
8695 }
8796
88- public ResourceCleaner remove (DiskId diskId ) {
89- resources .remove (diskId );
90- return this ;
91- }
92-
9397 public ResourceCleaner add (SnapshotId snapshotId ) {
94- ManagedResource <SnapshotId > r = new ManagedResource <>(snapshotId );
98+ ManagedResource <SnapshotId > r =
99+ new ManagedResource <>(
100+ snapshotId ,
101+ new Function <SnapshotId , Void >() {
102+ @ Override
103+ public Void apply (SnapshotId snapshotId ) {
104+ compute .deleteSnapshot (snapshotId );
105+ return null ;
106+ }
107+ });
95108 resources .put (snapshotId , r );
96109 return this ;
97110 }
98111
99- public ResourceCleaner remove (SnapshotId snapshotId ) {
100- resources .remove (snapshotId );
101- return this ;
102- }
103-
104112 public ResourceCleaner add (NetworkId networkId ) {
105- ManagedResource <NetworkId > r = new ManagedResource <>(networkId );
113+ ManagedResource <NetworkId > r =
114+ new ManagedResource <>(
115+ networkId ,
116+ new Function <NetworkId , Void >() {
117+ @ Override
118+ public Void apply (NetworkId networkId ) {
119+ compute .deleteNetwork (networkId );
120+ return null ;
121+ }
122+ });
106123 resources .put (networkId , r );
107124 return this ;
108125 }
109126
110- public ResourceCleaner remove (NetworkId networkId ) {
111- resources .remove (networkId );
112- return this ;
113- }
114-
115127 public ResourceCleaner add (SubnetworkId subnetworkId ) {
116- ManagedResource <SubnetworkId > r = new ManagedResource <>(subnetworkId );
128+ ManagedResource <SubnetworkId > r =
129+ new ManagedResource <>(
130+ subnetworkId ,
131+ new Function <SubnetworkId , Void >() {
132+ @ Override
133+ public Void apply (SubnetworkId subnetworkId ) {
134+ compute .deleteSubnetwork (subnetworkId );
135+ return null ;
136+ }
137+ });
117138 resources .put (subnetworkId , r );
118139 return this ;
119140 }
120141
121- public ResourceCleaner remove (SubnetworkId subnetworkId ) {
122- resources .remove (subnetworkId );
123- return this ;
124- }
125-
126142 public ResourceCleaner add (ImageId imageId ) {
127- ManagedResource <ImageId > r = new ManagedResource <>(imageId );
143+ ManagedResource <ImageId > r =
144+ new ManagedResource <>(
145+ imageId ,
146+ new Function <ImageId , Void >() {
147+ @ Override
148+ public Void apply (ImageId imageId ) {
149+ compute .deleteImage (imageId );
150+ return null ;
151+ }
152+ });
128153 resources .put (imageId , r );
129154 return this ;
130155 }
131156
132- public ResourceCleaner remove (ImageId imageId ) {
133- resources .remove (imageId );
134- return this ;
135- }
136-
137157 public ResourceCleaner add (InstanceId instanceId ) {
138- ManagedResource <InstanceId > r = new ManagedResource <>(instanceId );
158+ ManagedResource <InstanceId > r =
159+ new ManagedResource <>(
160+ instanceId ,
161+ new Function <InstanceId , Void >() {
162+ @ Override
163+ public Void apply (InstanceId instanceId ) {
164+ compute .deleteInstance (instanceId );
165+ return null ;
166+ }
167+ });
139168 resources .put (instanceId , r );
140169 return this ;
141170 }
142171
143- public ResourceCleaner remove (InstanceId instanceId ) {
144- resources .remove (instanceId );
145- return this ;
146- }
147-
148- private <T > Function <?, Void > getDeleteMethod (T res ) {
149-
150- if (res instanceof AddressId ) {
151- return new Function <AddressId , Void >() {
152- @ Override
153- public Void apply (AddressId addressId ) {
154- compute .deleteAddress (addressId );
155- return null ;
156- }
157- };
158- } else if (res instanceof DiskId ) {
159- return new Function <DiskId , Void >() {
160- @ Override
161- public Void apply (DiskId diskId ) {
162- compute .deleteDisk (diskId );
163- return null ;
164- }
165- };
166- } else if (res instanceof SnapshotId ) {
167- return new Function <SnapshotId , Void >() {
168- @ Override
169- public Void apply (SnapshotId snapshotId ) {
170- compute .deleteSnapshot (snapshotId );
171- return null ;
172- }
173- };
174- } else if (res instanceof NetworkId ) {
175- return new Function <NetworkId , Void >() {
176- @ Override
177- public Void apply (NetworkId networkId ) {
178- compute .deleteNetwork (networkId );
179- return null ;
180- }
181- };
182- } else if (res instanceof SubnetworkId ) {
183- return new Function <SubnetworkId , Void >() {
184- @ Override
185- public Void apply (SubnetworkId subnetworkId ) {
186- compute .deleteSubnetwork (subnetworkId );
187- return null ;
188- }
189- };
190- } else if (res instanceof ImageId ) {
191- return new Function <ImageId , Void >() {
192- @ Override
193- public Void apply (ImageId imageId ) {
194- compute .deleteImage (imageId );
195- return null ;
196- }
197- };
198- } else if (res instanceof InstanceId ) {
199- return new Function <InstanceId , Void >() {
200- @ Override
201- public Void apply (InstanceId instanceId ) {
202- compute .deleteInstance (instanceId );
203- return null ;
204- }
205- };
206- } else {
207- throw new NotImplementedException ();
172+ public <T > ResourceCleaner remove (T resourceId ) {
173+ if (!resources .containsKey (resourceId )) {
174+ throw new NoSuchElementException (resourceId + " has not been added to managed resources" );
208175 }
176+ resources .remove (resourceId );
177+ return this ;
209178 }
210179}
0 commit comments