/*
* Copyright 2009 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.powermock.classloading;
import com.thoughtworks.xstream.XStream;
import org.powermock.classloading.spi.DeepClonerSPI;
/**
* The purpose of the deep cloner is to create a deep clone of an object. An
* object can also be cloned to a different class-loader.
* <p>
*/
public class DeepCloner implements DeepClonerSPI {
private final XStream xStream;
/**
* Clone using the supplied ClassLoader.
*/
public DeepCloner(ClassLoader classLoader) {
xStream = new XStream();
xStream.omitField(SingleClassloaderExecutor.class, "classloader");
xStream.setClassLoader(classLoader);
}
/**
* Clone using the current ContextClassLoader.
*/
public DeepCloner() {
this(Thread.currentThread().getContextClassLoader());
}
/**
* Clones an object.
*
* @return A deep clone of the object to clone.
*/
@SuppressWarnings("unchecked")
public <T> T clone(T objectToClone) {
final String serialized = xStream.toXML(objectToClone);
return (T) xStream.fromXML(serialized);
}
}