// Copyright (C) 2006 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.ical.values;
import java.text.ParseException;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Base class for a mutable ICAL object.
*
* @author mikesamuel+svn@gmail.com (Mike Samuel)
*/
abstract class AbstractIcalObject implements IcalObject {
private static final Pattern CONTENT_LINE_RE = Pattern.compile(
"^((?:[^:;\"]|\"[^\"]*\")+)(;(?:[^:\"]|\"[^\"]*\")+)?:(.*)$");
private static final Pattern PARAM_RE = Pattern.compile(
"^;([^=]+)=(?:\"([^\"]*)\"|([^\";:]*))");
static final Pattern ICAL_SPECIALS = Pattern.compile("[:;]");
private String name;
/**
* paramter values. Does not currently allow multiple values for the same
* property.
*/
private Map<String, String> extParams = null;
/**
* parse the ical object from the given ical content using the given schema.
* Modifies the current object in place.
*
* @param schema rules for processing individual parameters and body content.
*/
protected void parse(String icalString, IcalSchema schema)
throws ParseException {
String paramText;
String content;
{
String unfolded = IcalParseUtil.unfoldIcal(icalString);
Matcher m = CONTENT_LINE_RE.matcher(unfolded);
if (!m.matches()) { schema.badContent(icalString); }
setName(m.group(1).toUpperCase());
paramText = m.group(2);
if (null == paramText) { paramText = ""; }
content = m.group(3);
}
// parse parameters
Map<String, String> params = new HashMap<String, String>();
String rest = paramText;
while (!"".equals(rest)) {
Matcher m = PARAM_RE.matcher(rest);
if (!m.find()) { schema.badPart(rest, null); }
rest = rest.substring(m.end(0));
String k = m.group(1).toUpperCase();
String v = m.group(2);
if (null == v) { v = m.group(3); }
if (params.containsKey(k)) {
schema.dupePart(k);
}
params.put(k, v);
}
// parse the content and individual attribute values
schema.applyObjectSchema(this.name, params, content, this);
}
/** the object name such as RRULE, EXRULE, VEVENT. @see #setName */
public String getName() { return name; }
/** @see #getName */
public void setName(String name) { this.name = name; }
/**
* a map of any extension parameters such as the X-FOO=BAR in RRULE;X-FOO=BAR.
* Maps the parameter name, X-FOO, to the parameter value, BAR.
*/
public Map<String, String> getExtParams() {
if (null == extParams) { extParams = new LinkedHashMap<String, String>(); }
return extParams;
}
public boolean hasExtParams() {
return null != extParams && !extParams.isEmpty();
}
}