001 /**
002 *
003 * Licensed to the Apache Software Foundation (ASF) under one or more
004 * contributor license agreements. See the NOTICE file distributed with
005 * this work for additional information regarding copyright ownership.
006 * The ASF licenses this file to You under the Apache License, Version 2.0
007 * (the "License"); you may not use this file except in compliance with
008 * the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 package org.apache.camel.util;
019 import java.net.InetAddress;
020 import java.net.ServerSocket;
021 import java.util.logging.Level;
022 import java.util.logging.Logger;
023
024 /**
025 * Generator for Globally unique Strings.
026 */
027
028 public class UIdGenerator{
029
030 private static final Logger log = Logger.getLogger(UIdGenerator.class.getName());
031 private static final String UNIQUE_STUB;
032 private static int instanceCount;
033 private static String hostName;
034 private String seed;
035 private long sequence;
036
037 static {
038 String stub = "";
039 boolean canAccessSystemProps = true;
040 try{
041 SecurityManager sm = System.getSecurityManager();
042 if(sm != null){
043 sm.checkPropertiesAccess();
044 }
045 }catch(SecurityException se){
046 canAccessSystemProps = false;
047 }
048
049 if ( canAccessSystemProps) {
050 try {
051 hostName = InetAddress.getLocalHost().getHostName();
052 ServerSocket ss = new ServerSocket(0);
053 stub="-" + ss.getLocalPort() + "-" + System.currentTimeMillis() + "-";
054 Thread.sleep(100);
055 ss.close();
056 }catch(Exception ioe){
057 log.log(Level.WARNING, "could not generate unique stub",ioe);
058 }
059 }else{
060 hostName="localhost";
061 stub = "-1-" +System.currentTimeMillis() +"-";
062 }
063 UNIQUE_STUB = stub;
064 }
065
066 /**
067 * As we have to find the hostname as a side-affect of generating
068 * a unique stub, we allow it's easy retrevial here
069 * @return the local host name
070 */
071
072 public static String getHostName(){
073 return hostName;
074 }
075
076 /**
077 * Construct an IdGenerator
078 *
079 */
080
081 public UIdGenerator(String prefix){
082 synchronized(UNIQUE_STUB){
083 this.seed = prefix + UNIQUE_STUB +(instanceCount++) +":";
084 }
085 }
086
087 public UIdGenerator(){
088 this("ID:" + hostName);
089 }
090
091 /**
092 * Generate a unqiue id
093 * @return a unique id
094 */
095
096 public synchronized String generateId(){
097 return this.seed + (this.sequence++);
098 }
099
100 /**
101 * Generate a unique ID - that is friendly for a URL or file system
102 * @return a unique id
103 */
104 public String generateSanitizedId(){
105 String result = generateId();
106 result = result.replace(':', '-');
107 result = result.replace('_', '-');
108 result = result.replace('.', '-');
109 return result;
110 }
111
112 }