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    }