Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * JBoss, Home of Professional Open Source
   * Copyright 2009, Red Hat Middleware LLC, and individual contributors
   * as indicated by the @author tags. See the copyright.txt file in the
   * distribution for a full listing of individual contributors.
   *
   * This is free software; you can redistribute it and/or modify it
   * under the terms of the GNU Lesser General Public License as
   * published by the Free Software Foundation; either version 2.1 of
  * the License, or (at your option) any later version.
  *
  * This software is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this software; if not, write to the Free
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
 package org.jboss.osgi.framework;
 
 
A Future that waits for the given service to come up and returns it's value. Use cautiously and only if there is no way to use direct service dependencies instead.

Author(s):
thomas.diesler@jboss.com
Since:
29-Mar-2011
 
 public final class FutureServiceValue<T> implements Future<T> {
 
     private static final Logger log = Logger.getLogger(FutureServiceValue.class);
 
     private ServiceController<T> controller;
 
     public FutureServiceValue(ServiceController<T> controller) {
         if (controller == null)
             throw new IllegalArgumentException("Null controller");
         this. = controller;
     }
 
     @Override
     public boolean cancel(boolean mayInterruptIfRunning) {
         return false;
     }
 
     @Override
     public boolean isCancelled() {
         return false;
     }
 
     @Override
     public boolean isDone() {
         return .getState() == .;
     }
 
     @Override
     public T get() throws ExecutionException {
         try {
             return get(5, .);
         } catch (TimeoutException ex) {
             throw new ExecutionException(ex);
         }
     }
 
     @Override
     public T get(long timeoutTimeUnit unitthrows ExecutionExceptionTimeoutException {
         return getValue(timeoutunit);
     }
 
     private T getValue(long timeoutTimeUnit unitthrows ExecutionExceptionTimeoutException {
 
         if (.getState() == .)
             return .getValue();
 
         final CountDownLatch latch = new CountDownLatch(1);
         final FutureServiceValue<T> futureServiceValue = this;
         final String serviceName = .getName().getCanonicalName();
         ServiceListener<T> listener = new AbstractServiceListener<T>() {
            @Override
            public void listenerAdded(ServiceController<? extends T> controller) {
                State state = controller.getState();
                if (state == . || state == .)
                    listenerDone(controller);
            }
            public void transition(final ServiceController<? extends T> controllerfinal ServiceController.Transition transition) {
                .tracef("transition %s %s => %s"futureServiceValueserviceNametransition);
                switch (transition) {
                    case :
                    case :
                        listenerDone(controller);
                        break;
                }
            }
            
            private void listenerDone(ServiceController<? extends T> controller) {
                controller.removeListener(this);
                latch.countDown();
            }
        };
        .addListener(listener);
        try {
            if (latch.await(timeoutunit) == false) {
                TimeoutException ex = new TimeoutException("Timeout getting " + serviceName);
                processTimeoutException(ex);
                throw ex;
            }
        } catch (InterruptedException e) {
            // ignore;
        }
        if (.getState() == .)
            return .getValue();
        StartException startException = .getStartException();
        Throwable cause = startException != null ? startException.getCause() : startException;
        if (cause instanceof RuntimeException) { 
            throw (RuntimeException)cause;
        }
        throw new ExecutionException("Cannot get service value for: " + serviceNamecause);
    }
    private void processTimeoutException(TimeoutException exception) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PrintStream out = new PrintStream(baos);
        String serviceName = .getName().getCanonicalName();
        .errorf("Cannot get service value for: %s\n%s"serviceNamenew String(baos.toByteArray()));
        ThreadMXBean bean = ManagementFactory.getThreadMXBean();
        ThreadInfo[] infos = bean.dumpAllThreads(truetrue);
        for (ThreadInfo info : infos) {
            if (info.getThreadName().contains("MSC")) {
                StringBuffer buffer = new StringBuffer();
                buffer.append("ThreadInfo: " + info);
                .errorf("%s"buffer);
            }
        }
    }
New to GrepCode? Check out our FAQ X