001: /*
002: * Copyright 2004-2007 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package org.springframework.binding.convert.support;
017:
018: import org.springframework.binding.convert.ConversionContext;
019: import org.springframework.binding.convert.ConversionException;
020: import org.springframework.binding.convert.Converter;
021:
022: /**
023: * Base class for converters provided as a convenience to implementors.
024: *
025: * @author Keith Donald
026: */
027: public abstract class AbstractConverter implements Converter {
028:
029: /**
030: * Convenience convert method that converts the provided source to the first
031: * target object supported by this converter. Useful when a converter only
032: * supports conversion to a single target.
033: * @param source the source to convert
034: * @return the converted object
035: * @throws ConversionException an exception occured converting the source
036: * value
037: */
038: public Object convert(Object source) throws ConversionException {
039: return convert(source, getTargetClasses()[0], null);
040: }
041:
042: /**
043: * Convenience convert method that converts the provided source to the
044: * target class specified with an empty conversion context.
045: * @param source the source to convert
046: * @param targetClass the target class to convert the source to, must be one
047: * of the supported <code>targetClasses</code>
048: * @return the converted object
049: * @throws ConversionException an exception occured converting the source
050: * value
051: */
052: public Object convert(Object source, Class targetClass)
053: throws ConversionException {
054: return convert(source, targetClass, null);
055: }
056:
057: /**
058: * Convenience convert method that converts the provided source to the first
059: * target object supported by this converter. Useful when a converter only
060: * supports conversion to a single target.
061: * @param source the source to convert
062: * @param context the conversion context, useful for influencing the
063: * behavior of the converter
064: * @return the converted object
065: * @throws ConversionException an exception occured converting the source
066: * value
067: */
068: public Object convert(Object source, ConversionContext context)
069: throws ConversionException {
070: return convert(source, getTargetClasses()[0], context);
071: }
072:
073: public Object convert(Object source, Class targetClass,
074: ConversionContext context) throws ConversionException {
075: try {
076: return doConvert(source, targetClass, context);
077: } catch (ConversionException e) {
078: throw e;
079: } catch (Throwable e) {
080: // wrap in a ConversionException
081: if (targetClass == null) {
082: targetClass = getTargetClasses()[0];
083: }
084: throw new ConversionException(source, targetClass, e);
085: }
086: }
087:
088: /**
089: * Template method subclasses should override to actually perform the type
090: * conversion.
091: * @param source the source to convert from
092: * @param targetClass the target type to convert to
093: * @param context an optional conversion context that may be used to
094: * influence the conversion process, could be null
095: * @return the converted source value
096: * @throws Exception an exception occured, will be wrapped in a conversion
097: * exception if necessary
098: */
099: protected abstract Object doConvert(Object source,
100: Class targetClass, ConversionContext context)
101: throws Exception;
102:
103: }
|