001// Licensed under the Apache License, Version 2.0 (the "License");
002// you may not use this file except in compliance with the License.
003// You may obtain a copy of the License at
004//
005//     http://www.apache.org/licenses/LICENSE-2.0
006//
007// Unless required by applicable law or agreed to in writing, software
008// distributed under the License is distributed on an "AS IS" BASIS,
009// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
010// See the License for the specific language governing permissions and
011// limitations under the License.
012
013package org.apache.tapestry5.internal.services;
014
015import org.apache.tapestry5.ValueEncoder;
016import org.apache.tapestry5.commons.services.TypeCoercer;
017import org.apache.tapestry5.ioc.internal.util.InternalUtils;
018import org.apache.tapestry5.services.ValueEncoderFactory;
019
020/**
021 * Provides {@link org.apache.tapestry5.ValueEncoder} instances that are backed by the {@link
022 * org.apache.tapestry5.commons.services.TypeCoercer} service.
023 */
024public class TypeCoercedValueEncoderFactory implements ValueEncoderFactory<Object>
025{
026    private final TypeCoercer typeCoercer;
027
028    public TypeCoercedValueEncoderFactory(TypeCoercer typeCoercer)
029    {
030        this.typeCoercer = typeCoercer;
031    }
032
033    public ValueEncoder<Object> create(final Class<Object> type)
034    {
035        final boolean blankToNull =
036                Boolean.class.isAssignableFrom(type) ||
037                Number.class.isAssignableFrom(type);
038
039        return new ValueEncoder<Object>()
040        {
041            public String toClient(Object value)
042            {
043                return typeCoercer.coerce(value, String.class);
044            }
045
046            public Object toValue(String clientValue)
047            {
048                if (blankToNull && InternalUtils.isBlank(clientValue)) {
049                    return null;
050                }
051
052                return typeCoercer.coerce(clientValue, type);
053            }
054        };
055    }
056}