/** * Finds or waits for the {@link org.jclouds.compute.ComputeService} that matches the specified name. */ public ComputeService getOrWait(String name) { assertValid(); computeServices.putIfAbsent(name, new DynamicReference<ComputeService>(name, COMPUTE_SERVICE_WAIT, TimeUnit.MILLISECONDS)); return computeServices.get(name).get(); }
@Override public T call() throws Exception { return callInternal(); }
@Override public ComputeService getIfPresent(String name) { assertValid(); computeServices.putIfAbsent(name, new DynamicReference<ComputeService>(name, COMPUTE_SERVICE_WAIT, TimeUnit.MILLISECONDS)); return computeServices.get(name).getIfPresent(); }
@Override public T addingService(ServiceReference<T> reference) { T service = super.addingService(reference); dynamicReference.bind(service); return service; }
void bindComputeService(ComputeService computeService) { String name = computeService.getContext().unwrap().getName(); if (!Strings.isEmpty(name)) { computeServices.putIfAbsent(name, new DynamicReference<ComputeService>(name, COMPUTE_SERVICE_WAIT, TimeUnit.MILLISECONDS)); computeServices.get(name).bind(computeService); } }
@Override public void removedService(ServiceReference<T> reference, T service) { super.removedService(reference, service); dynamicReference.unbind(service); } };
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { try { T service = dynamicReference.get(); return method.invoke(service, args); } catch (InvocationTargetException e) { throw e.getTargetException(); } }
DelegatingInvocationHandler(BundleContext context, Class<T> type, long timeout, TimeUnit unit) { dynamicReference = new DynamicReference<T>(type.getSimpleName(), timeout, unit); tracker = new ServiceTracker<T, T>(context, type, null) { @Override public T addingService(ServiceReference<T> reference) { T service = super.addingService(reference); dynamicReference.bind(service); return service; } @Override public void modifiedService(ServiceReference<T> reference, T service) { super.modifiedService(reference, service); dynamicReference.bind(service); } @Override public void removedService(ServiceReference<T> reference, T service) { super.removedService(reference, service); dynamicReference.unbind(service); } }; tracker.open(); }
/** * Binds the reference. */ public void bind(T value) { currentRevision().bind(value); }
@Override public List<ComputeService> list() { assertValid(); List<ComputeService> list = new ArrayList<ComputeService>(); for (Map.Entry<String,DynamicReference<ComputeService>> entry : computeServices.entrySet()) { ComputeService computeService = entry.getValue().getIfPresent(); if (computeService != null) { list.add(computeService); } } return list; }
@Override public T addingService(ServiceReference<T> reference) { T service = super.addingService(reference); dynamicReference.bind(service); return service; }
/** * Removes the {@link org.jclouds.compute.ComputeService} that matches the specified name. */ public void remove(String name) { assertValid(); DynamicReference<ComputeService> ref = computeServices.get(name); if (ref != null) { ref.unbind(null); } }
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { try { T service = dynamicReference.get(); return method.invoke(service, args); } catch (InvocationTargetException e) { throw e.getTargetException(); } }
DelegatingInvocationHandler(BundleContext context, Class<T> type, long timeout, TimeUnit unit) { dynamicReference = new DynamicReference<T>(type.getSimpleName(), timeout, unit); tracker = new ServiceTracker<T, T>(context, type, null) { @Override public T addingService(ServiceReference<T> reference) { T service = super.addingService(reference); dynamicReference.bind(service); return service; } @Override public void modifiedService(ServiceReference<T> reference, T service) { super.modifiedService(reference, service); dynamicReference.bind(service); } @Override public void removedService(ServiceReference<T> reference, T service) { super.removedService(reference, service); dynamicReference.unbind(service); } }; tracker.open(); }
/** * Returns the value if present. * @return The value or Null. */ public T getIfPresent() { return currentRevision().getIfPresent(); }
@Override public void modifiedService(ServiceReference<T> reference, T service) { super.modifiedService(reference, service); dynamicReference.bind(service); }
@Override public void removedService(ServiceReference<T> reference, T service) { super.removedService(reference, service); dynamicReference.unbind(service); } };
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { try { T service = dynamicReference.get(); return method.invoke(service, args); } catch (InvocationTargetException e) { throw e.getTargetException(); } }
DelegatingInvocationHandler(BundleContext context, Class<T> type, long timeout, TimeUnit unit) { dynamicReference = new DynamicReference<T>(type.getSimpleName(), timeout, unit); tracker = new ServiceTracker<T, T>(context, type, null) { @Override public T addingService(ServiceReference<T> reference) { T service = super.addingService(reference); dynamicReference.bind(service); return service; } @Override public void modifiedService(ServiceReference<T> reference, T service) { super.modifiedService(reference, service); dynamicReference.bind(service); } @Override public void removedService(ServiceReference<T> reference, T service) { super.removedService(reference, service); dynamicReference.unbind(service); } }; tracker.open(); }
/** * Binds the reference. */ public void bind(T value) { currentRevision().bind(value); }