Bug 6564: Fix UndeclaredThrowableException from Proxy
[controller.git] / opendaylight / md-sal / sal-dom-config / src / main / java / org / opendaylight / controller / config / yang / config / legacy_entity_ownership_service_provider / LegacyEntityOwnershipServiceProviderModule.java
1 /*
2  * Copyright (c) 2016 Brocade Communications Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.config.yang.config.legacy_entity_ownership_service_provider;
9
10 import com.google.common.reflect.AbstractInvocationHandler;
11 import com.google.common.reflect.Reflection;
12 import java.lang.reflect.InvocationTargetException;
13 import java.lang.reflect.Method;
14 import org.opendaylight.controller.config.api.DependencyResolver;
15 import org.opendaylight.controller.config.api.ModuleIdentifier;
16 import org.opendaylight.controller.config.api.osgi.WaitingServiceTracker;
17 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
18 import org.osgi.framework.BundleContext;
19
20 /**
21  * @deprecated Replaced by blueprint wiring
22  */
23 @Deprecated
24 public class LegacyEntityOwnershipServiceProviderModule extends AbstractLegacyEntityOwnershipServiceProviderModule {
25     private BundleContext bundleContext;
26
27     public LegacyEntityOwnershipServiceProviderModule(ModuleIdentifier identifier, DependencyResolver dependencyResolver) {
28         super(identifier, dependencyResolver);
29     }
30
31     public LegacyEntityOwnershipServiceProviderModule(ModuleIdentifier identifier, DependencyResolver dependencyResolver,
32             LegacyEntityOwnershipServiceProviderModule oldModule, java.lang.AutoCloseable oldInstance) {
33         super(identifier, dependencyResolver, oldModule, oldInstance);
34     }
35
36     @Override
37     public void customValidation() {
38         // add custom validation form module attributes here.
39     }
40
41     @Override
42     public AutoCloseable createInstance() {
43         final WaitingServiceTracker<EntityOwnershipService> tracker = WaitingServiceTracker.create(
44                 EntityOwnershipService.class, bundleContext);
45         final EntityOwnershipService service = tracker.waitForService(WaitingServiceTracker.FIVE_MINUTES);
46
47         return Reflection.newProxy(AutoCloseableEntityOwnershipService.class, new AbstractInvocationHandler() {
48             @Override
49             protected Object handleInvocation(Object proxy, Method method, Object[] args) throws Throwable {
50                 if (method.getName().equals("close")) {
51                     tracker.close();
52                     return null;
53                 } else {
54                     try {
55                         return method.invoke(service, args);
56                     } catch (InvocationTargetException e) {
57                         // https://bugs.opendaylight.org/show_bug.cgi?id=6564
58                         // http://stackoverflow.com/a/10719613/421602
59                         // https://amitstechblog.wordpress.com/2011/07/24/java-proxies-and-undeclaredthrowableexception/
60                         throw e.getCause();
61                     }
62                 }
63             }
64         });
65     }
66
67     public void setBundleContext(final BundleContext bundleContext) {
68         this.bundleContext = bundleContext;
69     }
70
71     private interface AutoCloseableEntityOwnershipService extends EntityOwnershipService, AutoCloseable {
72     }
73
74 }