| // |
| // ======================================================================== |
| // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. |
| // ------------------------------------------------------------------------ |
| // All rights reserved. This program and the accompanying materials |
| // are made available under the terms of the Eclipse Public License v1.0 |
| // and Apache License v2.0 which accompanies this distribution. |
| // |
| // The Eclipse Public License is available at |
| // http://www.eclipse.org/legal/epl-v10.html |
| // |
| // The Apache License v2.0 is available at |
| // http://www.opensource.org/licenses/apache2.0.php |
| // |
| // You may elect to redistribute this code under either of these licenses. |
| // ======================================================================== |
| // |
| |
| package org.eclipse.jetty.util; |
| |
| import java.lang.reflect.InvocationTargetException; |
| import java.lang.reflect.Method; |
| |
| /** |
| * Provide for a Uptime class that is compatible with Android, GAE, and the new Java 8 compact profiles |
| */ |
| public class Uptime |
| { |
| public static final int NOIMPL = -1; |
| |
| public static interface Impl |
| { |
| public long getUptime(); |
| } |
| |
| public static class DefaultImpl implements Impl |
| { |
| public Object mxBean; |
| public Method uptimeMethod; |
| |
| public DefaultImpl() |
| { |
| ClassLoader cl = Thread.currentThread().getContextClassLoader(); |
| try |
| { |
| Class<?> mgmtFactory = Class.forName("java.lang.management.ManagementFactory",true,cl); |
| Class<?> runtimeClass = Class.forName("java.lang.management.RuntimeMXBean",true,cl); |
| Class<?> noparams[] = new Class<?>[0]; |
| Method mxBeanMethod = mgmtFactory.getMethod("getRuntimeMXBean",noparams); |
| if (mxBeanMethod == null) |
| { |
| throw new UnsupportedOperationException("method getRuntimeMXBean() not found"); |
| } |
| mxBean = mxBeanMethod.invoke(mgmtFactory); |
| if (mxBean == null) |
| { |
| throw new UnsupportedOperationException("getRuntimeMXBean() method returned null"); |
| } |
| uptimeMethod = runtimeClass.getMethod("getUptime",noparams); |
| if (mxBean == null) |
| { |
| throw new UnsupportedOperationException("method getUptime() not found"); |
| } |
| } |
| catch (ClassNotFoundException | |
| NoClassDefFoundError | |
| NoSuchMethodException | |
| SecurityException | |
| IllegalAccessException | |
| IllegalArgumentException | |
| InvocationTargetException e) |
| { |
| throw new UnsupportedOperationException("Implementation not available in this environment",e); |
| } |
| } |
| |
| @Override |
| public long getUptime() |
| { |
| try |
| { |
| return (long)uptimeMethod.invoke(mxBean); |
| } |
| catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) |
| { |
| return NOIMPL; |
| } |
| } |
| } |
| |
| private static final Uptime INSTANCE = new Uptime(); |
| |
| public static Uptime getInstance() |
| { |
| return INSTANCE; |
| } |
| |
| private Impl impl; |
| |
| private Uptime() |
| { |
| try |
| { |
| impl = new DefaultImpl(); |
| } |
| catch (UnsupportedOperationException e) |
| { |
| System.err.printf("Defaulting Uptime to NOIMPL due to (%s) %s%n",e.getClass().getName(),e.getMessage()); |
| impl = null; |
| } |
| } |
| |
| public Impl getImpl() |
| { |
| return impl; |
| } |
| |
| public void setImpl(Impl impl) |
| { |
| this.impl = impl; |
| } |
| |
| public static long getUptime() |
| { |
| Uptime u = getInstance(); |
| if (u == null || u.impl == null) |
| { |
| return NOIMPL; |
| } |
| return u.impl.getUptime(); |
| } |
| } |