1
14
15 package com.liferay.taglib.faces.converter;
16
17 import com.liferay.portal.kernel.language.LanguageUtil;
18
19 import java.util.Locale;
20
21 import javax.faces.application.FacesMessage;
22 import javax.faces.component.StateHolder;
23 import javax.faces.component.UIComponent;
24 import javax.faces.context.ExternalContext;
25 import javax.faces.context.FacesContext;
26 import javax.faces.convert.Converter;
27 import javax.faces.convert.ConverterException;
28
29
42 public class PhoneNumberConverter implements Converter, StateHolder {
43
44 public boolean isTransient() {
45 return _transient;
46 }
47
48 public void setTransient(boolean value) {
49 _transient = value;
50 }
51
52 public String getUnitedStatesFormat() {
53 return _unitedStatesFormat;
54 }
55
56 public void setUnitedStatesFormat(String unitedStatesFormat) {
57 _unitedStatesFormat = unitedStatesFormat;
58 }
59
60 public Object getAsObject(
61 FacesContext facesContext, UIComponent uiComponent, String value) {
62
63 if (value != null) {
64 StringBuilder integerChars = new StringBuilder(value.length());
65 StringBuilder invalidChars = new StringBuilder(value.length());
66
67 for (int i = 0; i < value.length(); i++) {
68 char curChar = value.charAt(i);
69
70 if (Character.isDigit(curChar)) {
71 integerChars.append(curChar);
72 }
73 else if ((curChar != '-') && (curChar != '(') &&
74 (curChar != ')') && (curChar != '.') &&
75 (curChar != '+') && (curChar != ' ')) {
76
77 invalidChars.append(curChar);
78 }
79 }
80
81 if (invalidChars.length() > 0) {
82 ExternalContext externalContext =
83 facesContext.getExternalContext();
84
85 Locale locale = externalContext.getRequestLocale();
86
87 String summary = LanguageUtil.get(
88 locale, "the-following-are-invalid-characters");
89
90 summary += " " + invalidChars.toString();
91
92 FacesMessage facesMessage = new FacesMessage(
93 FacesMessage.SEVERITY_ERROR, summary, null);
94
95 throw new ConverterException(facesMessage);
96 }
97 else if ((integerChars.length() == 10)) {
98 StringBuilder unitedStatesPhoneNumber = new StringBuilder(
99 _unitedStatesFormat.length());
100
101 int integerDigitIndex = 0;
102
103 for (int i = 0; i < _unitedStatesFormat.length(); i++) {
104 char curChar = _unitedStatesFormat.charAt(i);
105
106 if (curChar == '#') {
107 unitedStatesPhoneNumber.append(
108 integerChars.charAt(integerDigitIndex++));
109 }
110 else {
111 unitedStatesPhoneNumber.append(curChar);
112 }
113 }
114
115 return unitedStatesPhoneNumber.toString();
116 }
117 }
118
119 return value;
120 }
121
122 public String getAsString(
123 FacesContext facesContext, UIComponent uiComponent, Object value)
124 throws ConverterException {
125
126
128 return (String)value;
129 }
130
131 public void restoreState(FacesContext facesContext, Object obj) {
132 Object[] values = (Object[])obj;
133
134 _unitedStatesFormat = (String)values[0];
135 }
136
137 public Object saveState(FacesContext facesContext) {
138 Object[] values = new Object[1];
139
140 values[0] = _unitedStatesFormat;
141
142 return values;
143 }
144
145 private boolean _transient;
146 private String _unitedStatesFormat;
147
148 }