001 package ezvcard.io.scribe; 002 003 import java.util.List; 004 import java.util.Set; 005 006 import ezvcard.Messages; 007 import ezvcard.VCard; 008 import ezvcard.VCardDataType; 009 import ezvcard.VCardVersion; 010 import ezvcard.io.EmbeddedVCardException; 011 import ezvcard.io.SkipMeException; 012 import ezvcard.io.html.HCardElement; 013 import ezvcard.parameter.VCardParameters; 014 import ezvcard.property.Agent; 015 import ezvcard.property.VCardProperty; 016 017 /* 018 Copyright (c) 2013, Michael Angstadt 019 All rights reserved. 020 021 Redistribution and use in source and binary forms, with or without 022 modification, are permitted provided that the following conditions are met: 023 024 1. Redistributions of source code must retain the above copyright notice, this 025 list of conditions and the following disclaimer. 026 2. Redistributions in binary form must reproduce the above copyright notice, 027 this list of conditions and the following disclaimer in the documentation 028 and/or other materials provided with the distribution. 029 030 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 031 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 032 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 033 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 034 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 035 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 036 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 037 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 038 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 039 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 040 */ 041 042 /** 043 * Marshals {@link Agent} properties. 044 * @author Michael Angstadt 045 */ 046 public class AgentScribe extends VCardPropertyScribe<Agent> { 047 public AgentScribe() { 048 super(Agent.class, "AGENT"); 049 } 050 051 @Override 052 protected VCardDataType _defaultDataType(VCardVersion version) { 053 return null; 054 } 055 056 @Override 057 protected VCardDataType _dataType(Agent property, VCardVersion version) { 058 if (property.getUrl() != null) { 059 return (version == VCardVersion.V2_1) ? VCardDataType.URL : VCardDataType.URI; 060 } 061 return null; 062 } 063 064 @Override 065 protected String _writeText(Agent property, VCardVersion version) { 066 String url = property.getUrl(); 067 if (url != null) { 068 return url; 069 } 070 071 VCard vcard = property.getVCard(); 072 if (vcard != null) { 073 throw new EmbeddedVCardException(vcard); 074 } 075 076 //don't write an empty value because parsers could interpret that as there being an embedded vCard on the next line 077 throw new SkipMeException(Messages.INSTANCE.getValidationWarning(8)); 078 } 079 080 @Override 081 protected Agent _parseText(String value, VCardDataType dataType, VCardVersion version, VCardParameters parameters, List<String> warnings) { 082 Agent property = new Agent(); 083 084 if (dataType == null) { 085 throw new EmbeddedVCardException(new Injector(property)); 086 } 087 088 property.setUrl(unescape(value)); 089 return property; 090 } 091 092 @Override 093 protected Agent _parseHtml(HCardElement element, List<String> warnings) { 094 Agent property = new Agent(); 095 096 Set<String> classes = element.classNames(); 097 if (classes.contains("vcard")) { 098 throw new EmbeddedVCardException(new Injector(property)); 099 } 100 101 String url = element.absUrl("href"); 102 if (url.length() == 0) { 103 url = element.value(); 104 } 105 property.setUrl(url); 106 107 return property; 108 } 109 110 private static class Injector implements EmbeddedVCardException.InjectionCallback { 111 private final Agent property; 112 113 public Injector(Agent property) { 114 this.property = property; 115 } 116 117 public void injectVCard(VCard vcard) { 118 property.setVCard(vcard); 119 } 120 121 public VCardProperty getProperty() { 122 return property; 123 } 124 } 125 }