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}