org.pentaho.platform.util.UUIDUtil.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.platform.util.UUIDUtil.java

Source

/*!
 * This program is free software; you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
 * Foundation.
 *
 * You should have received a copy of the GNU Lesser General Public License along with this
 * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
 * or from the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * This program 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.
 *
 * Copyright (c) 2002-2013 Pentaho Corporation..  All rights reserved.
 */

package org.pentaho.platform.util;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.pentaho.platform.util.messages.Messages;
import org.safehaus.uuid.UUID;
import org.safehaus.uuid.UUIDGenerator;

import java.net.NetworkInterface;
import java.util.Enumeration;

public class UUIDUtil {
    private static final Log log = LogFactory.getLog(UUIDUtil.class);

    static boolean nativeInitialized = false;

    static UUIDGenerator ug;

    static org.safehaus.uuid.EthernetAddress eAddr;

    static {
        UUIDUtil.ug = UUIDGenerator.getInstance();
        /*
         * Add support for running in clustered environments. In this way, the MAC address of the running server can be
         * added to the environment with a -DMAC_ADDRESS=00:50:56:C0:00:01
         */
        if (UUIDUtil.eAddr == null) {
            String macAddr = System.getProperty("MAC_ADDRESS"); //$NON-NLS-1$
            if (macAddr != null) {
                // On Windows machines, people would be inclined to get the MAC
                // address with ipconfig /all. The format of this would be
                // something like 00-50-56-C0-00-08. So, replace '-' with ':' before
                // creating the address.
                //
                macAddr = macAddr.replace('-', ':');
                UUIDUtil.eAddr = new org.safehaus.uuid.EthernetAddress(macAddr);
            }
        }

        // No explicit override - let's try the new Java 6 methods...
        if (UUIDUtil.eAddr == null) {
            try {
                // Use reflection to check for getHardwardAddress with no parameters...
                NetworkInterface.class.getMethod("getHardwareAddress", new Class[] {}); //$NON-NLS-1$
                // Yep - running Java6 or later - keep going.
                String macAddr = getActiveNetworkMacAddress();
                if (macAddr != null) {
                    // Would be here if machine is completely disconnected from all networks - there
                    // is no active network adapter.
                    UUIDUtil.eAddr = new org.safehaus.uuid.EthernetAddress(macAddr);
                }
            } catch (Exception ignored) {
                // Not running on Java 6 - interesting...
            }
        }

        // Hmmm - not running in Java6 - use the Dummy one.
        if (UUIDUtil.eAddr == null) {
            // Still don't have an Ethernet Address - generate a dummy one.
            UUIDUtil.eAddr = UUIDUtil.ug.getDummyAddress();
        }

        // Generate a UUID to make sure everything is running OK.
        UUID olduuId = UUIDUtil.ug.generateTimeBasedUUID(UUIDUtil.eAddr);
        if (olduuId == null) {
            UUIDUtil.log.error(Messages.getInstance().getErrorString("UUIDUtil.ERROR_0003_GENERATEFAILED")); //$NON-NLS-1$
        }

    }

    public static String getUUIDAsString() {
        return UUIDUtil.getUUID().toString();
    }

    public static UUID getUUID() {
        UUID uuId = UUIDUtil.ug.generateTimeBasedUUID(UUIDUtil.eAddr);
        // while (uuId.toString().equals(olduuId.toString())) {
        // uuId = ug.generateTimeBasedUUID(eAddr);
        // }
        // olduuId = uuId;
        return uuId;
    }

    private static String getInterfaceInfo(NetworkInterface nif) throws Exception {
        return getInterfaceInfo(nif, ":");
    }

    private static String getInterfaceInfo(NetworkInterface nif, String sep) throws Exception {
        byte[] addrBytes = nif.getHardwareAddress(); // get the MAC address
        StringBuffer buff = new StringBuffer();
        for (int i = 0; i < addrBytes.length; i++) {
            buff.append(String.format("%02X%s", addrBytes[i], (i < addrBytes.length - 1) ? sep : "")); //$NON-NLS-1$ //$NON-NLS-2$
        }
        return buff.toString();
    }

    public static String getActiveNetworkMacAddress() throws Exception {
        Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
        while (interfaces.hasMoreElements()) {
            NetworkInterface nif = interfaces.nextElement();
            // Obvious what the next IF is doing, but it must be connected, non-PPP, non-loopback, and non-virtual
            if ((nif.isUp()) && (!nif.isPointToPoint()) && (!nif.isLoopback()) && (!nif.isVirtual())) {
                return getInterfaceInfo(nif);
            }
        }
        return null;
    }

}