/**
* AnalyzerBeans
* Copyright (C) 2014 Neopost - Customer Information Management
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.eobjects.analyzer.util.convert;
import java.util.ArrayList;
import java.util.Collection;
import org.eobjects.analyzer.beans.api.Converter;
import org.eobjects.analyzer.configuration.InjectionManager;
import org.eobjects.analyzer.configuration.SimpleInjectionPoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Helper class for converting objects to and from string representations as
* used for example in serialized XML jobs.
*
* The string converter currently supports instances and arrays of:
* <ul>
* <li>Boolean</li>
* <li>Byte</li>
* <li>Short</li>
* <li>Integer</li>
* <li>Long</li>
* <li>Float</li>
* <li>Double</li>
* <li>Character</li>
* <li>String</li>
* <li>java.io.File</li>
* <li>java.util.Date</li>
* <li>java.sql.Date</li>
* <li>java.util.Calendar</li>
* <li>java.util.regex.Pattern</li>
* <li>org.eobjects.analyzer.reference.Dictionary</li>
* <li>org.eobjects.analyzer.reference.SynonymCatalog</li>
* <li>org.eobjects.analyzer.reference.StringPattern</li>
* <li>org.eobjects.analyzer.connection.Datastore</li>
* <li>org.apache.metamodel.schema.Column</li>
* <li>org.apache.metamodel.schema.Table</li>
* <li>org.apache.metamodel.schema.Schema</li>
* </ul>
*/
public final class StringConverter {
private static final Logger logger = LoggerFactory.getLogger(StringConverter.class);
private final InjectionManager _injectionManager;
public StringConverter(InjectionManager injectionManager) {
_injectionManager = injectionManager;
}
/**
* Serializes a Java object to a String representation.
*
* @param o
* the object to serialize
* @return a String representation of the Java object
*/
public final String serialize(final Object o) {
return serialize(o, new ArrayList<Class<? extends Converter<?>>>(0));
}
public final String serialize(final Object o, final Class<? extends Converter<?>> converterClass) {
final Collection<Class<? extends Converter<?>>> col = new ArrayList<Class<? extends Converter<?>>>();
if (converterClass != null) {
col.add(converterClass);
}
return serialize(o, col);
}
/**
* Serializes a Java object to a String representation.
*
* @param o
* the object to serialize
* @param converterClasses
* an optional collection of custom converter classes
* @return a String representation of the Java object
*/
public final String serialize(final Object o, final Collection<Class<? extends Converter<?>>> converterClasses) {
final DelegatingConverter delegatingConverter = new DelegatingConverter();
if (converterClasses != null) {
for (Class<? extends Converter<?>> converterClass : converterClasses) {
delegatingConverter.addConverter(createConverter(converterClass));
}
}
delegatingConverter.addConverter(new ConfigurationItemConverter());
delegatingConverter.addConverter(getResourceConverter());
delegatingConverter.addConverter(new StandardTypeConverter(delegatingConverter));
delegatingConverter.initializeAll(_injectionManager);
return delegatingConverter.toString(o);
}
private ResourceConverter getResourceConverter() {
if (_injectionManager == null) {
return new ResourceConverter();
} else {
ResourceConverter converter = _injectionManager.getInstance(SimpleInjectionPoint
.of(ResourceConverter.class));
if (converter == null) {
return new ResourceConverter();
}
return converter;
}
}
private Converter<?> createConverter(Class<? extends Converter<?>> converterClass) {
try {
Converter<?> converter = converterClass.newInstance();
return converter;
} catch (Exception e) {
if (e instanceof RuntimeException) {
throw (RuntimeException) e;
}
throw new IllegalStateException("Error occurred while using instantiating: " + converterClass, e);
}
}
/**
* Deserializes a String into a Java object of the particular type.
*
* @param str
* the serialized string representation
* @param type
* the requested type
* @return a Java object matching the String representation
*/
public final <E> E deserialize(String str, Class<E> type) {
return deserialize(str, type, new ArrayList<Class<? extends Converter<?>>>(0));
}
public final <E> E deserialize(String str, Class<E> type, Class<? extends Converter<?>> converterClass) {
Collection<Class<? extends Converter<?>>> col = new ArrayList<Class<? extends Converter<?>>>();
if (converterClass != null) {
col.add(converterClass);
}
return deserialize(str, type, col);
}
/**
* Deserializes a String into a Java object of the particular type.
*
* @param str
* the serialized string representation
* @param type
* the requested type
* @param converterClasses
* an optional collection of custom converters to apply when
* deserializing
* @return a Java object matching the String representation
*/
public final <E> E deserialize(String str, Class<E> type, Collection<Class<? extends Converter<?>>> converterClasses) {
logger.debug("deserialize(\"{}\", {})", str, type);
final DelegatingConverter delegatingConverter = new DelegatingConverter();
if (converterClasses != null) {
for (Class<? extends Converter<?>> converterClass : converterClasses) {
delegatingConverter.addConverter(createConverter(converterClass));
}
}
delegatingConverter.addConverter(new ConfigurationItemConverter());
delegatingConverter.addConverter(getResourceConverter());
delegatingConverter.addConverter(new StandardTypeConverter(delegatingConverter));
delegatingConverter.initializeAll(_injectionManager);
@SuppressWarnings("unchecked")
E result = (E) delegatingConverter.fromString(type, str);
return result;
}
}