--- /dev/null
+//
+// ========================================================================
+// Copyright (c) 1995-2016 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();
+ }
+}