/*
* Copyright 2002-2010 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.integration.util;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.UnsupportedEncodingException;
import java.util.UUID;
import org.springframework.core.convert.converter.Converter;
import org.springframework.util.ClassUtils;
/**
* Utility to help generate UUID instances from generic objects.
*
* @author Dave Syer
*/
public class UUIDConverter implements Converter<Object, UUID> {
public static final String DEFAULT_CHARSET = "UTF-8";
/**
* Convert the input to a UUID using the convenience method
* {@link #getUUID(Object)}.
*
* @see org.springframework.core.convert.converter.Converter#convert(java.lang.Object)
*/
public UUID convert(Object source) {
return getUUID(source);
}
/**
* Convenient utility to convert an object to a UUID. If the input is
* <ul>
* <li>null: returns null</li>
* <li>a UUID: returns the input unchanged</li>
* <li>a String formatted as a UUID: returns the result of
* {@link UUID#fromString(String)}</li>
* <li>any other String: returns {@link UUID#nameUUIDFromBytes(byte[])} with
* bytes generated from the input</li>
* <li>a primitive or primitive wrapper: converts to a String ans then uses
* the previous conversion method</li>
* <li>Serializable: returns the {@link UUID#nameUUIDFromBytes(byte[])} with
* the serialized bytes of the input</li>
* </ul>
* If none of the above applies there will be an exception trying to serialize.
*
* @param input an Object
* @return a UUID constructed from the input
*/
public static UUID getUUID(Object input) {
if (input == null) {
return null;
}
if (input instanceof UUID) {
return (UUID) input;
}
if (input instanceof String) {
try {
return UUID.fromString((String) input);
}
catch (Exception e) {
try {
return UUID.nameUUIDFromBytes(((String) input).getBytes(DEFAULT_CHARSET));
}
catch (UnsupportedEncodingException ex) {
throw new IllegalStateException("Cannot convert String using charset=" + DEFAULT_CHARSET, ex);
}
}
}
if (ClassUtils.isPrimitiveOrWrapper(input.getClass())) {
try {
return UUID.nameUUIDFromBytes(input.toString().getBytes(DEFAULT_CHARSET));
}
catch (UnsupportedEncodingException e) {
throw new IllegalStateException("Cannot convert primitive using charset=" + DEFAULT_CHARSET, e);
}
}
byte[] bytes = serialize(input);
return UUID.nameUUIDFromBytes(bytes);
}
private static byte[] serialize(Object object) {
if (object == null) {
return null;
}
ByteArrayOutputStream stream = new ByteArrayOutputStream();
try {
new ObjectOutputStream(stream).writeObject(object);
}
catch (IOException e) {
throw new IllegalArgumentException("Could not serialize object of type: " + object.getClass(), e);
}
return stream.toByteArray();
}
}