/*******************************************************************************
* Copyright (c) 2004, 2010 BREDEX GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* BREDEX GmbH - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.jubula.tools.internal.serialisation;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
import org.eclipse.jubula.tools.internal.exception.SerialisationException;
import org.eclipse.jubula.tools.internal.messagehandling.MessageIDs;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.XStreamException;
import com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider;
import com.thoughtworks.xstream.core.util.CompositeClassLoader;
import com.thoughtworks.xstream.io.xml.DomDriver;
/**
* The XStream implementation of the XML serializer.
*
* @author BREDEX GmbH
* @created 28.07.2005
*/
public class XStreamXmlSerializer implements IXmlSerializer {
/** static xml header */
private static final String XML_HEADER =
"<?xml version=\"1.0\"?>"; //$NON-NLS-1$
/** The XStream instance. This is the facade for all XStream operations. */
private final XStream m_stream;
/** A list of all class loaders which have been added to the XStream <code>CompositeClassLoader</code>. */
private final List m_addedClassLoaders;
/**
* The default constructor.
*/
public XStreamXmlSerializer() {
m_stream = new XStream(new PureJavaReflectionProvider(),
new DomDriver());
m_addedClassLoaders = new ArrayList();
}
/**
* {@inheritDoc}
* java.lang.Class)
*/
public Object deserialize(String text, Class clazz)
throws SerialisationException {
Validate.notNull(text);
Validate.notNull(clazz);
try {
ClassLoader streamClassLoader = m_stream.getClassLoader();
// If this is a CompositeClassLoader, the class loader that
// has loaded the passed clazz instance, will be added to
// the CompositeClassLoader. So we ensure that XStream
// loads the class correctly inside an Eclipse Plugin.
// If XStream doesn't return the CompositeClassLoader, there
// is no way to give XStream any class loader support.
if (streamClassLoader instanceof CompositeClassLoader) {
synchronized (this) {
ClassLoader classLoader = clazz.getClassLoader();
if (!m_addedClassLoaders.contains(classLoader)) {
((CompositeClassLoader)streamClassLoader)
.add(classLoader);
m_addedClassLoaders.add(classLoader);
}
}
}
// split into Header and Body
if (text.startsWith("<?")) { //$NON-NLS-1$
String xmlHeader = text.substring(0, text.indexOf(">") + 1); //$NON-NLS-1$
String xmlBody = StringUtils.substringAfter(text, ">"); //$NON-NLS-1$
return m_stream.fromXML(xmlBody);
}
return m_stream.fromXML(text);
} catch (XStreamException e) {
throw new SerialisationException(e.getMessage(),
MessageIDs.E_SERILIZATION_FAILED);
}
}
/**
* {@inheritDoc}
*/
public String serialize(Object object, boolean writeXmlHeader)
throws SerialisationException {
Validate.notNull(object);
try {
StringBuffer buffer = new StringBuffer();
if (writeXmlHeader) {
buffer.append(XML_HEADER);
}
buffer.append(m_stream.toXML(object));
return buffer.toString();
} catch (XStreamException e) {
throw new SerialisationException(e.getMessage(),
MessageIDs.E_SERILIZATION_FAILED);
}
}
/**
* {@inheritDoc}
*/
public Object getImplementation() {
return m_stream;
}
}