blob: c3d1f68483e32cde4cdc1057c3b40a6e6bff4ddf [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.myfaces.trinidaddemo.convertValidate;
import java.util.Collection;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import org.apache.myfaces.trinidad.convert.ClientConverter;
import org.apache.myfaces.trinidad.util.LabeledFacesMessage;
/**
* <p>Social Security number converter.</p>
*
*/
public class SSNConverter implements Converter, ClientConverter
{
public static final String CONVERTER_ID = "org.apache.myfaces.trinidaddemo.SSN";
public Object getAsObject(
FacesContext context,
UIComponent component,
String value)
{
// In a real app all the error messages would be translated
if ( value == null || value.trim().length() == 0)
return null;
String tValue = value.trim();
int length = tValue.length();
if ( length < 9 )
{
throw new ConverterException(_getMessage(component, _SHORT_ERROR_TEXT));
}
if ( length > 11 )
{
throw new ConverterException(_getMessage(component, _LONG_ERROR_TEXT));
}
if (length == 9)
{
try
{
return Integer.valueOf(tValue);
}
catch(NumberFormatException nfe)
{
throw new ConverterException(_getMessage(component,
_INVALID_ERROR_TEXT));
}
}
if ( length == 11 &&
tValue.charAt(3) == '-' &&
tValue.charAt(6) == '-')
{
String v = tValue.substring(0,3) +
tValue.substring(4,6) +
tValue.substring(7);
try
{
return Integer.valueOf(v);
}
catch(NumberFormatException nfe)
{
throw new ConverterException(_getMessage(component,
_INVALID_ERROR_TEXT));
}
}
throw new ConverterException(_getMessage(component, _INVALID_ERROR_TEXT));
}
public String getAsString(
FacesContext context,
UIComponent component,
Object value)
{
if ( value == null || !(value instanceof Integer))
return null;
Integer integerValue = (Integer)value;
String valueString = integerValue.toString();
String ssn = valueString.substring(0,3) + '-' +
valueString.substring(3,5) + '-' +
valueString.substring(5,9);
return ssn;
}
public Collection<String> getClientImportNames()
{
return null;
}
public String getClientLibrarySource(
FacesContext context)
{
return context.getExternalContext().getRequestContextPath() +
"/jsLibs/ssnConverter.js";
}
public String getClientConversion(
FacesContext context,
UIComponent component)
{
// in a real app the messages would be translated
return ("new SSNConverter({"
+ "SUM:'Invalid social security number.',"
+ "S:'Value \"{1}\" is too short.',"
+ "L:'Value \"{1}\" is too long.',"
+ "N:'Value \"{1}\" is not a valid social security number.'})"
);
}
@SuppressWarnings("unchecked")
public String getClientScript(
FacesContext context,
UIComponent component)
{
return null;
}
private LabeledFacesMessage _getMessage(
UIComponent component,
String text)
{
// Using the LabeledFacesMessage allows the <tr:messages> component to
// properly prepend the label as a link.
LabeledFacesMessage lfm =
new LabeledFacesMessage(FacesMessage.SEVERITY_ERROR,
"Conversion Error", text);
if (component != null)
{
Object label = null;
label = component.getAttributes().get("label");
if (label == null)
label = component.getValueExpression("label");
if (label != null)
lfm.setLabel(label);
}
return lfm;
}
private static final String _SHORT_ERROR_TEXT
= "The value is too short to be a social security number";
private static final String _LONG_ERROR_TEXT
= "The value is too long to be a social security number";
private static final String _INVALID_ERROR_TEXT
= "The value is not a valid social security number";
}