001: /*
002: * Copyright 2002-2006 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:
017: package org.springframework.beans.propertyeditors;
018:
019: import java.beans.PropertyEditorSupport;
020:
021: import org.springframework.util.StringUtils;
022:
023: /**
024: * Editor for a {@link java.lang.Character}, to populate a property
025: * of type <code>Character</code> or <code>char</code> from a String value.
026: *
027: * <p>Note that the JDK does not contain a default
028: * {@link java.beans.PropertyEditor property editor} for <code>char</code>!
029: * {@link org.springframework.beans.BeanWrapperImpl} will register this
030: * editor by default.
031: *
032: * <p>Also supports conversion from a Unicode character sequence; e.g.
033: * <code>u0041</code> ('A').
034: *
035: * @author Juergen Hoeller
036: * @author Rob Harrop
037: * @author Rick Evans
038: * @since 1.2
039: * @see java.lang.Character
040: * @see org.springframework.beans.BeanWrapperImpl
041: */
042: public class CharacterEditor extends PropertyEditorSupport {
043:
044: /**
045: * The prefix that identifies a string as being a Unicode character sequence.
046: */
047: private static final String UNICODE_PREFIX = "\\u";
048:
049: /**
050: * The length of a Unicode character sequence.
051: */
052: private static final int UNICODE_LENGTH = 6;
053:
054: private final boolean allowEmpty;
055:
056: /**
057: * Create a new CharacterEditor instance.
058: * <p>The "allowEmpty" parameter controls whether an empty String is
059: * to be allowed in parsing, i.e. be interpreted as the <code>null</code>
060: * value when {@link #setAsText(String) text is being converted}. If
061: * <code>false</code>, an {@link IllegalArgumentException} will be thrown
062: * at that time.
063: * @param allowEmpty if empty strings are to be allowed
064: */
065: public CharacterEditor(boolean allowEmpty) {
066: this .allowEmpty = allowEmpty;
067: }
068:
069: public void setAsText(String text) throws IllegalArgumentException {
070: if (this .allowEmpty && !StringUtils.hasText(text)) {
071: // Treat empty String as null value.
072: setValue(null);
073: } else if (text == null) {
074: throw new IllegalArgumentException(
075: "null String cannot be converted to char type");
076: } else if (isUnicodeCharacterSequence(text)) {
077: setAsUnicode(text);
078: } else if (text.length() != 1) {
079: throw new IllegalArgumentException("String [" + text
080: + "] with length " + text.length()
081: + " cannot be converted to char type");
082: } else {
083: setValue(new Character(text.charAt(0)));
084: }
085: }
086:
087: public String getAsText() {
088: Object value = getValue();
089: return (value != null ? value.toString() : "");
090: }
091:
092: private void setAsUnicode(String text) {
093: int code = Integer.parseInt(text.substring(UNICODE_PREFIX
094: .length()), 16);
095: setValue(new Character((char) code));
096: }
097:
098: private static boolean isUnicodeCharacterSequence(String sequence) {
099: return sequence.startsWith(UNICODE_PREFIX)
100: && sequence.length() == UNICODE_LENGTH;
101: }
102:
103: }
|