001package ezvcard.io.scribe; 002 003import java.util.List; 004 005import com.github.mangstadt.vinnie.io.VObjectPropertyValues; 006import com.github.mangstadt.vinnie.io.VObjectPropertyValues.StructuredValueIterator; 007 008import ezvcard.VCardDataType; 009import ezvcard.VCardVersion; 010import ezvcard.io.ParseContext; 011import ezvcard.io.html.HCardElement; 012import ezvcard.io.json.JCardValue; 013import ezvcard.io.text.WriteContext; 014import ezvcard.io.xml.XCardElement; 015import ezvcard.parameter.VCardParameters; 016import ezvcard.property.Organization; 017 018/* 019 Copyright (c) 2012-2023, Michael Angstadt 020 All rights reserved. 021 022 Redistribution and use in source and binary forms, with or without 023 modification, are permitted provided that the following conditions are met: 024 025 1. Redistributions of source code must retain the above copyright notice, this 026 list of conditions and the following disclaimer. 027 2. Redistributions in binary form must reproduce the above copyright notice, 028 this list of conditions and the following disclaimer in the documentation 029 and/or other materials provided with the distribution. 030 031 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 032 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 033 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 034 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 035 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 036 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 037 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 038 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 039 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 040 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 041 */ 042 043/** 044 * Marshals {@link Organization} properties. 045 * @author Michael Angstadt 046 */ 047public class OrganizationScribe extends VCardPropertyScribe<Organization> { 048 public OrganizationScribe() { 049 super(Organization.class, "ORG"); 050 } 051 052 @Override 053 protected VCardDataType _defaultDataType(VCardVersion version) { 054 return VCardDataType.TEXT; 055 } 056 057 @Override 058 protected String _writeText(Organization property, WriteContext context) { 059 boolean escapeCommas = (context.getVersion() != VCardVersion.V2_1); 060 return VObjectPropertyValues.writeSemiStructured(property.getValues(), escapeCommas, context.isIncludeTrailingSemicolons()); 061 } 062 063 @Override 064 protected Organization _parseText(String value, VCardDataType dataType, VCardParameters parameters, ParseContext context) { 065 Organization property = new Organization(); 066 067 List<String> values = VObjectPropertyValues.parseSemiStructured(value); 068 property.getValues().addAll(values); 069 070 return property; 071 } 072 073 @Override 074 protected void _writeXml(Organization property, XCardElement parent) { 075 parent.append(VCardDataType.TEXT.getName().toLowerCase(), property.getValues()); 076 } 077 078 @Override 079 protected Organization _parseXml(XCardElement element, VCardParameters parameters, ParseContext context) { 080 List<String> values = element.all(VCardDataType.TEXT); 081 if (!values.isEmpty()) { 082 Organization property = new Organization(); 083 property.getValues().addAll(values); 084 return property; 085 } 086 087 throw missingXmlElements(VCardDataType.TEXT); 088 } 089 090 @Override 091 protected Organization _parseHtml(HCardElement element, ParseContext context) { 092 Organization property = new Organization(); 093 094 String orgName = element.firstValue("organization-name"); 095 if (orgName != null) { 096 property.getValues().add(orgName); 097 } 098 099 String orgUnit = element.firstValue("organization-unit"); 100 if (orgUnit != null) { 101 property.getValues().add(orgUnit); 102 } 103 104 if (property.getValues().isEmpty()) { 105 String value = element.value(); 106 if (value.length() > 0) { 107 property.getValues().add(value); 108 } 109 } 110 111 return property; 112 } 113 114 @Override 115 protected JCardValue _writeJson(Organization property) { 116 List<String> values = property.getValues(); 117 if (values.isEmpty()) { 118 return JCardValue.single(""); 119 } 120 121 if (values.size() == 1) { 122 return JCardValue.single(values.get(0)); 123 } 124 125 return JCardValue.structured(values.toArray(new Object[0])); 126 } 127 128 @Override 129 protected Organization _parseJson(JCardValue value, VCardDataType dataType, VCardParameters parameters, ParseContext context) { 130 Organization property = new Organization(); 131 132 StructuredValueIterator it = new StructuredValueIterator(value.asStructured()); 133 while (it.hasNext()) { 134 String next = it.nextValue(); 135 if (next != null) { 136 property.getValues().add(next); 137 } 138 } 139 140 return property; 141 } 142}