package net.sourceforge.cardme.engine; import java.util.ArrayList; import java.util.List; /* * Copyright 2012 Michael Angstadt. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY MICHAEL ANGSTADT ''AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GEORGE EL-HADDAD OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of Michael Angstadt. */ /** * @author Michael Angstadt * <br/> * Jul 25, 2012 * <p>Represents the components that make up an unfolded vCard line, such as type * name and value.</p> * */ public class VCardLine { private String group = null; private String typeName = null; private String value = null; private List<String[]> parameters = new ArrayList<String[]>(); private VCardLine() { // hide constructor } /** * <p>Parses an unfolded vCard line. It just parses the components out, it * doesn't modify the components in any way.</p> * * @param line - the unfolded line to parse * @return the parsed components or null if the line is not a valid vCard line */ public static VCardLine parse(String line) { VCardLine lineObj = new VCardLine(); boolean escaped = false; //is the next char escaped? boolean inQuotes = false; //are we inside of double quotes? StringBuilder buf = new StringBuilder(); String[] curSubType = new String[2]; for (int i = 0; i < line.length(); i++) { char ch = line.charAt(i); if (escaped) { if (ch == 'n' || ch == 'N') { //newlines appear as "\n" or "\N" (see RFC 2426 p.7) buf.append("\r\n"); } else { buf.append(ch); } escaped = false; } else if (ch == '\\') { escaped = true; } else if (ch == '.' && lineObj.group == null && lineObj.typeName == null) { lineObj.group = buf.toString(); buf = new StringBuilder(); } else if ((ch == ';' || ch == ':') && !inQuotes) { if (lineObj.typeName == null) { lineObj.typeName = buf.toString(); } else { //parameter value curSubType[1] = buf.toString(); lineObj.parameters.add(curSubType); curSubType = new String[2]; } buf = new StringBuilder(); if (ch == ':') { if (i < line.length() - 1) { lineObj.value = line.substring(i + 1); } else { lineObj.value = ""; } break; } } else if (ch == '=' && !inQuotes) { //parameter name curSubType[0] = buf.toString(); buf = new StringBuilder(); } else if (ch == '"') { inQuotes = !inQuotes; } else { buf.append(ch); } } if (lineObj.typeName == null || lineObj.value == null) { return null; } return lineObj; } /** * <p>Gets the group.</p> * * @return the group or null if the type does not belong to a group */ public String getGroup() { return group; } /** * <p>Gets the type name.</p> * * @return the type name */ public String getTypeName() { return typeName; } /** * <p>Gets the parameters of the type.</p> * * @return the parameters. Index 0 is the name and index 1 is the value. If * the parameter is nameless, then index 0 will be null. Parameters can be * nameless in v2.1 (e.g. "ADR;WORK;DOM:") */ public List<String[]> getParameters() { return parameters; } /** * <p>Gets the value of the type.</p> * * @return the value */ public String getValue() { return value; } }