001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package javax.xml.bind.annotation.adapters;
018
019 public class CollapsedStringAdapter extends XmlAdapter<String, String> {
020
021 public String marshal(String v) {
022 return v;
023 }
024
025 public String unmarshal(String v) {
026 if(v == null) {
027 return null;
028 }
029 int len = v.length();
030 int s;
031 for (s = 0; s < len && !isWhiteSpace(v.charAt(s)); s++);
032 if (s == len) {
033 return v;
034 }
035 StringBuffer result = new StringBuffer(len);
036 if (s != 0) {
037 for(int i = 0; i < s; i++) {
038 result.append(v.charAt(i));
039 }
040 result.append(' ');
041 }
042 boolean inStripMode = true;
043 for (int i = s + 1; i < len; i++) {
044 char ch = v.charAt(i);
045 boolean b = isWhiteSpace(ch);
046 if (inStripMode && b) {
047 continue;
048 }
049 inStripMode = b;
050 result.append(inStripMode ? ' ' : ch);
051 }
052 len = result.length();
053 if (len > 0 && result.charAt(len - 1) == ' ') {
054 result.setLength(len - 1);
055 }
056 return result.toString();
057 }
058
059 protected static boolean isWhiteSpace(char ch) {
060 if (ch > ' ') {
061 return false;
062 } else {
063 return ch == '\t' || ch == '\n' || ch == '\r' || ch == ' ';
064 }
065 }
066
067 }