001 package ezvcard.io.scribe; 002 003 import java.util.List; 004 005 import ezvcard.Messages; 006 import ezvcard.VCard; 007 import ezvcard.VCardDataType; 008 import ezvcard.VCardVersion; 009 import ezvcard.io.html.HCardElement; 010 import ezvcard.io.json.JCardValue; 011 import ezvcard.io.xml.XCardElement; 012 import ezvcard.parameter.VCardParameters; 013 import ezvcard.property.Telephone; 014 import ezvcard.util.TelUri; 015 016 /* 017 Copyright (c) 2013, Michael Angstadt 018 All rights reserved. 019 020 Redistribution and use in source and binary forms, with or without 021 modification, are permitted provided that the following conditions are met: 022 023 1. Redistributions of source code must retain the above copyright notice, this 024 list of conditions and the following disclaimer. 025 2. Redistributions in binary form must reproduce the above copyright notice, 026 this list of conditions and the following disclaimer in the documentation 027 and/or other materials provided with the distribution. 028 029 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 030 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 031 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 032 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 033 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 034 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 035 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 036 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 037 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 038 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 039 */ 040 041 /** 042 * Marshals {@link Telephone} properties. 043 * @author Michael Angstadt 044 */ 045 public class TelephoneScribe extends VCardPropertyScribe<Telephone> { 046 public TelephoneScribe() { 047 super(Telephone.class, "TEL"); 048 } 049 050 @Override 051 protected VCardDataType _defaultDataType(VCardVersion version) { 052 return VCardDataType.TEXT; 053 } 054 055 @Override 056 protected VCardDataType _dataType(Telephone property, VCardVersion version) { 057 if (version == VCardVersion.V4_0) { 058 if (property.getText() != null) { 059 return VCardDataType.TEXT; 060 } 061 if (property.getUri() != null) { 062 return VCardDataType.URI; 063 } 064 } 065 066 return VCardDataType.TEXT; 067 } 068 069 @Override 070 protected void _prepareParameters(Telephone property, VCardParameters copy, VCardVersion version, VCard vcard) { 071 handlePrefParam(property, copy, version, vcard); 072 } 073 074 @Override 075 protected String _writeText(Telephone property, VCardVersion version) { 076 String text = property.getText(); 077 if (text != null) { 078 return escape(text); 079 } 080 081 TelUri uri = property.getUri(); 082 if (uri != null) { 083 if (version == VCardVersion.V4_0) { 084 return uri.toString(); 085 } 086 087 String ext = uri.getExtension(); 088 if (ext == null) { 089 return escape(uri.getNumber()); 090 } 091 return escape(uri.getNumber() + " x" + ext); 092 } 093 094 return ""; 095 } 096 097 @Override 098 protected Telephone _parseText(String value, VCardDataType dataType, VCardVersion version, VCardParameters parameters, List<String> warnings) { 099 value = unescape(value); 100 return parse(value, dataType, warnings); 101 } 102 103 @Override 104 protected void _writeXml(Telephone property, XCardElement parent) { 105 String text = property.getText(); 106 if (text != null) { 107 parent.append(VCardDataType.TEXT, text); 108 return; 109 } 110 111 TelUri uri = property.getUri(); 112 if (uri != null) { 113 parent.append(VCardDataType.URI, uri.toString()); 114 return; 115 } 116 117 parent.append(VCardDataType.TEXT, ""); 118 } 119 120 @Override 121 protected Telephone _parseXml(XCardElement element, VCardParameters parameters, List<String> warnings) { 122 String text = element.first(VCardDataType.TEXT); 123 if (text != null) { 124 return new Telephone(text); 125 } 126 127 String uri = element.first(VCardDataType.URI); 128 if (uri != null) { 129 try { 130 return new Telephone(TelUri.parse(uri)); 131 } catch (IllegalArgumentException e) { 132 warnings.add(Messages.INSTANCE.getParseMessage(18)); 133 return new Telephone(uri); 134 } 135 } 136 137 throw missingXmlElements(VCardDataType.TEXT, VCardDataType.URI); 138 } 139 140 @Override 141 protected Telephone _parseHtml(HCardElement element, List<String> warnings) { 142 Telephone property; 143 String href = element.attr("href"); 144 try { 145 property = new Telephone(TelUri.parse(href)); 146 } catch (IllegalArgumentException e) { 147 //not a tel URI 148 property = new Telephone(element.value()); 149 } 150 151 List<String> types = element.types(); 152 for (String type : types) { 153 property.getParameters().addType(type); 154 } 155 156 return property; 157 } 158 159 @Override 160 protected JCardValue _writeJson(Telephone property) { 161 String text = property.getText(); 162 if (text != null) { 163 return JCardValue.single(text); 164 } 165 166 TelUri uri = property.getUri(); 167 if (uri != null) { 168 return JCardValue.single(uri.toString()); 169 } 170 171 return JCardValue.single(""); 172 } 173 174 @Override 175 protected Telephone _parseJson(JCardValue value, VCardDataType dataType, VCardParameters parameters, List<String> warnings) { 176 String valueStr = value.asSingle(); 177 return parse(valueStr, dataType, warnings); 178 } 179 180 private Telephone parse(String value, VCardDataType dataType, List<String> warnings) { 181 try { 182 return new Telephone(TelUri.parse(value)); 183 } catch (IllegalArgumentException e) { 184 if (dataType == VCardDataType.URI) { 185 warnings.add(Messages.INSTANCE.getParseMessage(18)); 186 } 187 } 188 189 return new Telephone(value); 190 } 191 }