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