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 }