ANY23-390 ical tests, support for params, datatypes, & structured values


Project: http://git-wip-us.apache.org/repos/asf/any23/repo
Commit: http://git-wip-us.apache.org/repos/asf/any23/commit/19d85f2f
Tree: http://git-wip-us.apache.org/repos/asf/any23/tree/19d85f2f
Diff: http://git-wip-us.apache.org/repos/asf/any23/diff/19d85f2f

Branch: refs/heads/master
Commit: 19d85f2fc84b4431228b4978c0b1419b758aa203
Parents: 54a9296
Author: Hans <[email protected]>
Authored: Mon Aug 27 11:59:24 2018 -0500
Committer: Hans <[email protected]>
Committed: Mon Aug 27 12:06:50 2018 -0500

----------------------------------------------------------------------
 .../main/java/org/apache/any23/vocab/ICAL.java  |   9 +
 .../calendar/BaseCalendarExtractor.java         | 420 ++++++++++++++++---
 .../calendar/BaseCalendarExtractorTest.java     |  98 +++++
 .../extractor/calendar/ICalExtractorTest.java   |  67 +++
 .../extractor/calendar/JCalExtractorTest.java   |  46 ++
 .../extractor/calendar/XCalExtractorTest.java   |  46 ++
 .../apache/any23/vocab/RDFSchemaUtilsTest.java  |   4 +-
 .../rfc7265-example1-expected.nquads            |  26 ++
 .../calendar.json/rfc7265-example1.json         |  18 +
 .../rfc7265-example2-expected.nquads            |  75 ++++
 .../calendar.json/rfc7265-example2.json         |  96 +++++
 .../rfc5545-example1-expected.nquads            |  30 ++
 .../calendar.text/rfc5545-example1.ics          |  17 +
 .../rfc5545-example2-expected.nquads            |  55 +++
 .../calendar.text/rfc5545-example2.ics          |  34 ++
 .../rfc5545-example3-expected.nquads            |  40 ++
 .../calendar.text/rfc5545-example3.ics          |  22 +
 .../rfc5545-example4-expected.nquads            |  40 ++
 .../calendar.text/rfc5545-example4.ics          |  22 +
 .../rfc5545-example5-expected.nquads            |  30 ++
 .../calendar.text/rfc5545-example5.ics          |  23 +
 .../rfc5545-example6-expected.nquads            |  37 ++
 .../calendar.text/rfc5545-example6.ics          |  13 +
 .../rfc6321-example1-expected.nquads            |  26 ++
 .../resources/calendar.xml/rfc6321-example1.xml |  34 ++
 .../rfc6321-example2-expected.nquads            |  75 ++++
 .../resources/calendar.xml/rfc6321-example2.xml | 149 +++++++
 27 files changed, 1488 insertions(+), 64 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/api/src/main/java/org/apache/any23/vocab/ICAL.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/any23/vocab/ICAL.java 
b/api/src/main/java/org/apache/any23/vocab/ICAL.java
index 783d668..81bae3f 100644
--- a/api/src/main/java/org/apache/any23/vocab/ICAL.java
+++ b/api/src/main/java/org/apache/any23/vocab/ICAL.java
@@ -29,6 +29,11 @@ public class ICAL extends Vocabulary {
      */
     public static final String NS = "http://www.w3.org/2002/12/cal/icaltzd#";;
 
+    /**
+     * Recommended prefix for the ICAL namespace
+     */
+    public static final String PREFIX = "ical";
+
     private static final class InstanceHolder {
         private static final ICAL instance = new ICAL();
     }
@@ -54,6 +59,8 @@ public class ICAL extends Vocabulary {
 
     public final IRI Value_DATE        = createClass("Value_DATE");
 
+    public final IRI Value_DATE_TIME   = createClass("Value_DATE-TIME");
+
     public final IRI Value_DURATION    = createClass("Value_DURATION");
 
     public final IRI Value_PERIOD      = createClass("Value_PERIOD");
@@ -191,6 +198,8 @@ public class ICAL extends Vocabulary {
 
     public final IRI byyearday = createProperty("byyearday");
 
+    public final IRI wkst = createProperty("wkst");
+
     /**
      * value type: TEXTThis IRI defines the calendar scale used for the 
calendar
      * information specified in the iCalendar object..

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/core/src/main/java/org/apache/any23/extractor/calendar/BaseCalendarExtractor.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/any23/extractor/calendar/BaseCalendarExtractor.java
 
b/core/src/main/java/org/apache/any23/extractor/calendar/BaseCalendarExtractor.java
index 74c3e10..258006f 100644
--- 
a/core/src/main/java/org/apache/any23/extractor/calendar/BaseCalendarExtractor.java
+++ 
b/core/src/main/java/org/apache/any23/extractor/calendar/BaseCalendarExtractor.java
@@ -21,16 +21,23 @@ import biweekly.ICalDataType;
 import biweekly.ICalVersion;
 import biweekly.ICalendar;
 import biweekly.component.ICalComponent;
+import biweekly.component.VTimezone;
 import biweekly.io.ParseWarning;
 import biweekly.io.SkipMeException;
 import biweekly.io.StreamReader;
+import biweekly.io.TimezoneAssignment;
 import biweekly.io.TimezoneInfo;
 import biweekly.io.WriteContext;
+import biweekly.io.json.JCalValue;
+import biweekly.io.json.JsonValue;
 import biweekly.io.scribe.ScribeIndex;
-import biweekly.io.scribe.component.ICalComponentScribe;
 import biweekly.io.scribe.property.ICalPropertyScribe;
+import biweekly.parameter.Encoding;
+import biweekly.parameter.ICalParameters;
+import biweekly.property.Geo;
 import biweekly.property.ICalProperty;
-import com.github.mangstadt.vinnie.io.VObjectPropertyValues;
+import biweekly.util.DateTimeComponents;
+import biweekly.util.ICalDateFormat;
 import org.apache.any23.extractor.ExtractionContext;
 import org.apache.any23.extractor.ExtractionException;
 import org.apache.any23.extractor.ExtractionParameters;
@@ -38,19 +45,34 @@ import org.apache.any23.extractor.ExtractionResult;
 import org.apache.any23.extractor.Extractor;
 import org.apache.any23.extractor.IssueReport;
 import org.apache.any23.vocab.ICAL;
+import org.apache.commons.lang.StringUtils;
 import org.eclipse.rdf4j.model.BNode;
 import org.eclipse.rdf4j.model.IRI;
 import org.eclipse.rdf4j.model.Value;
 import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil;
 import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.PrintWriter;
 import java.io.StringWriter;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.time.ZoneOffset;
+import java.util.Collection;
+import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
+import java.util.TimeZone;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * @author Hans Brende ([email protected])
@@ -69,7 +91,11 @@ abstract class BaseCalendarExtractor implements 
Extractor.ContentExtractor {
 
     @Override
     public final void run(ExtractionParameters extractionParameters, 
ExtractionContext extractionContext, InputStream inputStream,
-                          ExtractionResult extractionResult) throws 
IOException, ExtractionException {
+                          ExtractionResult result) throws IOException, 
ExtractionException {
+        result.writeNamespace(RDF.PREFIX, RDF.NAMESPACE);
+        result.writeNamespace(ICAL.PREFIX, ICAL.NS);
+        result.writeNamespace(XMLSchema.PREFIX, XMLSchema.NAMESPACE);
+
         ScribeIndex index = new ScribeIndex();
         try (StreamReader reader = reader(inputStream)) {
             ICalendar cal;
@@ -78,18 +104,19 @@ abstract class BaseCalendarExtractor implements 
Extractor.ContentExtractor {
                     String message = warning.getMessage();
                     Integer lineNumber = warning.getLineNumber();
                     if (lineNumber == null) {
-                        
extractionResult.notifyIssue(IssueReport.IssueLevel.WARNING, message, -1, -1);
+                        result.notifyIssue(IssueReport.IssueLevel.WARNING, 
message, -1, -1);
                     } else {
-                        
extractionResult.notifyIssue(IssueReport.IssueLevel.WARNING, message, 
lineNumber, -1);
+                        result.notifyIssue(IssueReport.IssueLevel.WARNING, 
message, lineNumber, -1);
                     }
                 }
 
                 BNode calNode = f.createBNode();
-                extractionResult.writeTriple(calNode, RDF.TYPE, 
vICAL.Vcalendar);
-                extract(index, cal.getTimezoneInfo(), calNode, cal, 
extractionResult);
+                result.writeTriple(calNode, RDF.TYPE, vICAL.Vcalendar);
+                WriteContext ctx = new WriteContext(ICalVersion.V2_0, 
cal.getTimezoneInfo(), null);
+                extract(index, ctx, calNode, cal, result, true);
             }
         } catch (Exception e) {
-            extractionResult.notifyIssue(IssueReport.IssueLevel.FATAL, 
toString(e), -1, -1);
+            result.notifyIssue(IssueReport.IssueLevel.FATAL, toString(e), -1, 
-1);
         }
     }
 
@@ -111,56 +138,42 @@ abstract class BaseCalendarExtractor implements 
Extractor.ContentExtractor {
             return "";
         }
         int ind = Character.charCount(typeName.codePointAt(0));
-        return typeName.substring(0, ind).toUpperCase(Locale.ENGLISH) + 
typeName.substring(ind);
+        return typeName.substring(0, ind).toUpperCase(Locale.ENGLISH)
+                + typeName.substring(ind).toLowerCase(Locale.ENGLISH);
     }
 
     private static String localNameOfProperty(String propertyName) {
         String[] nameComponents = propertyName.split("-");
         StringBuilder sb = new StringBuilder(propertyName.length());
-        sb.append(nameComponents[0]);
+        sb.append(nameComponents[0].toLowerCase(Locale.ENGLISH));
         for (int i = 1, len = nameComponents.length; i < len; i++) {
             sb.append(localNameOfType(nameComponents[i]));
         }
         return sb.toString();
     }
 
-    private static IRI type(ICalComponentScribe<?> scribe, ExtractionResult 
result) {
-        if (scribe == null) {
-            return null;
-        }
-        String originalName = scribe.getComponentName();
-        String name = originalName.toLowerCase(Locale.ENGLISH);
-
-        if (name.startsWith("x-")) {
+    private static IRI type(String originalName) {
+        if (originalName.regionMatches(true, 0, "X-", 0, 2)) {
             //non-standard class
-            return f.createIRI(ICAL.NS, "X-" + 
localNameOfType(name.substring(2)));
+            return f.createIRI(ICAL.NS, "X-" + 
localNameOfType(originalName.substring(2)));
         }
 
-        name = localNameOfType(name);
+        String name = localNameOfType(originalName);
 
         try {
             return Objects.requireNonNull(vICAL.getClass(name));
         } catch (RuntimeException e) {
-            IRI iri = f.createIRI(ICAL.NS, name);
-            result.notifyIssue(IssueReport.IssueLevel.ERROR,
-                    "class " + iri + " (" + originalName + ") not defined in " 
+ ICAL.class.getName(),
-                    -1, -1);
-            return iri;
+            return null;
         }
     }
 
-    private static IRI predicate(ICalPropertyScribe<?> scribe, 
ExtractionResult result) {
-        if (scribe == null) {
-            return null;
-        }
-        String originalName = scribe.getPropertyName(ICalVersion.V2_0);
-        String name = originalName.toLowerCase(Locale.ENGLISH);
-        if (name.startsWith("x-")) {
+    private static IRI predicate(String originalName, ExtractionResult result) 
{
+        if (originalName.regionMatches(true, 0, "X-", 0, 2)) {
             //non-standard property
-            return f.createIRI(ICAL.NS, "x-" + 
localNameOfProperty(name.substring(2)));
+            return f.createIRI(ICAL.NS, "x-" + 
localNameOfProperty(originalName.substring(2)));
         }
 
-        name = localNameOfProperty(name);
+        String name = localNameOfProperty(originalName);
 
         try {
             return Objects.requireNonNull(vICAL.getProperty(name));
@@ -173,49 +186,332 @@ abstract class BaseCalendarExtractor implements 
Extractor.ContentExtractor {
         }
     }
 
-    @SuppressWarnings("unchecked")
-    private static <T extends ICalProperty> Value value(ICalPropertyScribe<T> 
scribe, ICalProperty property, TimezoneInfo info) {
-        try {
-            T prop = (T)property;
-            String text = scribe.writeText(prop, new 
WriteContext(ICalVersion.V2_0, info, null));
-            if (text == null) {
-                return null;
+    private static final String NaN = Double.toString(Double.NaN);
+    private static String str(Double d) {
+        return d == null ? NaN : d.toString();
+    }
+
+    private static void writeParams(BNode subject, ICalParameters params, 
ExtractionResult result) {
+        for (Map.Entry<String, List<String>> entry : 
params.getMap().entrySet()) {
+            List<String> strings = entry.getValue();
+            if (strings != null && !strings.isEmpty()) {
+                IRI predicate = predicate(entry.getKey(), result);
+                for (String v : strings) {
+                    result.writeTriple(subject, predicate, f.createLiteral(v));
+                }
             }
-            text = VObjectPropertyValues.unescape(text);
-            ICalDataType dataType = scribe.dataType(prop, ICalVersion.V2_0);
-            if (ICalDataType.URI.equals(dataType) || 
ICalDataType.URL.equals(dataType)) {
+        }
+    }
+
+
+    private static IRI dataType(ICalDataType dataType) {
+        if (dataType == null || ICalDataType.TEXT.equals(dataType)) {
+            return XMLSchema.STRING;
+        } else if (ICalDataType.BOOLEAN.equals(dataType)) {
+            return XMLSchema.BOOLEAN;
+        } else if (ICalDataType.INTEGER.equals(dataType)) {
+            return XMLSchema.INTEGER;
+        } else if (ICalDataType.FLOAT.equals(dataType)) {
+            return XMLSchema.FLOAT;
+        } else if (ICalDataType.BINARY.equals(dataType)) {
+            return XMLSchema.BASE64BINARY;
+        } else if (ICalDataType.URI.equals(dataType)
+                || ICalDataType.URL.equals(dataType)
+                || ICalDataType.CONTENT_ID.equals(dataType)
+                || ICalDataType.CAL_ADDRESS.equals(dataType)) {
+            return XMLSchema.ANYURI;
+        } else if (ICalDataType.DATE_TIME.equals(dataType)) {
+            return XMLSchema.DATETIME;
+        } else if (ICalDataType.DATE.equals(dataType)) {
+            return XMLSchema.DATE;
+        } else if (ICalDataType.TIME.equals(dataType)) {
+            return XMLSchema.TIME;
+        } else if (ICalDataType.DURATION.equals(dataType)) {
+            return XMLSchema.DURATION;
+        } else if (ICalDataType.PERIOD.equals(dataType)) {
+            return vICAL.Value_PERIOD;
+        } else if (ICalDataType.RECUR.equals(dataType)) {
+            return vICAL.Value_RECUR;
+        } else {
+            return XMLSchema.STRING;
+        }
+    }
+
+
+    private static final Pattern durationWeeksPattern = 
Pattern.compile("(-?P)(\\d+)W");
+
+    private static String normalizeAndReportIfInvalid(String s, IRI dataType, 
TimeZone zone, ExtractionResult result) {
+        if (dataType == null) {
+            return s;
+        }
+        try {
+            if (XMLSchema.DURATION.equals(dataType)) {
+                Matcher m = durationWeeksPattern.matcher(s);
+                if (m.matches()) {
+                    long days = Long.parseLong(m.group(2)) * 7;
+                    return m.group(1) + days + "D";
+                }
+            } else if (vICAL.Value_PERIOD.equals(dataType)) {
+                if (s.indexOf('/') == -1) {
+                    throw new IllegalArgumentException();
+                }
+            } else if (zone != null && XMLSchema.DATETIME.equals(dataType)) {
                 try {
-                    return f.createIRI(text.trim());
+                    DateTimeComponents dt = DateTimeComponents.parse(s);
+                    if (!dt.isUtc()) {
+                        s = 
ICalDateFormat.DATE_TIME_EXTENDED.format(dt.toDate(zone), zone);
+                    }
                 } catch (IllegalArgumentException e) {
                     //ignore
                 }
+            } else {
+                s = XMLDatatypeUtil.normalize(s, dataType);
             }
-            return f.createLiteral(text);
-        } catch (SkipMeException e) {
+
+            if (!XMLDatatypeUtil.isValidValue(s, dataType)) {
+                throw new IllegalArgumentException();
+            }
+        } catch (IllegalArgumentException e) {
+            String m = e.getMessage();
+            if (StringUtils.isBlank(m)) {
+                m = "Not a valid " + dataType + " value: " + s;
+            }
+            result.notifyIssue(IssueReport.IssueLevel.ERROR, m, -1, -1);
+        }
+        return s;
+    }
+
+    private static boolean writeValue(BNode subject, IRI predicate, JsonValue 
jsonValue, String lang, IRI dataType, TimeZone zone, ExtractionResult result) {
+        if (jsonValue == null || jsonValue.isNull()) {
+            return false;
+        }
+        Object val = jsonValue.getValue();
+        if (val != null) {
+            Value v;
+            if (val instanceof Byte) {
+                v = f.createLiteral((byte)val);
+            } else if (val instanceof Short) {
+                v = f.createLiteral((short)val);
+            } else if (val instanceof Integer) {
+                v = f.createLiteral((int)val);
+            } else if (val instanceof Long) {
+                v = f.createLiteral((long)val);
+            } else if (val instanceof Float) {
+                v = f.createLiteral((float)val);
+            } else if (val instanceof Double) {
+                v = f.createLiteral((double)val);
+            } else if (val instanceof Boolean) {
+                v = f.createLiteral((boolean)val);
+            } else if (val instanceof BigInteger) {
+                v = f.createLiteral((BigInteger)val);
+            } else if (val instanceof BigDecimal) {
+                v = f.createLiteral((BigDecimal)val);
+            } else {
+                String str = normalizeAndReportIfInvalid(val.toString(), 
dataType, zone, result);
+
+                if (XMLSchema.STRING.equals(dataType)) {
+                    if (lang == null) {
+                        v = f.createLiteral(str);
+                    } else {
+                        v = f.createLiteral(str, lang);
+                    }
+                } else if (XMLSchema.ANYURI.equals(dataType)) {
+                    try {
+                        v = f.createIRI(str);
+                    } catch (IllegalArgumentException e) {
+                        v = f.createLiteral(str, dataType);
+                    }
+                } else if (vICAL.Value_PERIOD.equals(dataType)) {
+                    String[] strs = str.split("/");
+                    if (strs.length != 2) {
+                        v = f.createLiteral(str);
+                    } else {
+                        BNode bNode = f.createBNode();
+                        result.writeTriple(subject, predicate, bNode);
+                        result.writeTriple(bNode, RDF.TYPE, dataType);
+
+                        String start = normalizeAndReportIfInvalid(strs[0], 
XMLSchema.DATETIME, zone, result);
+                        result.writeTriple(bNode, vICAL.dtstart, 
f.createLiteral(start, XMLSchema.DATETIME));
+                        String str1 = strs[1];
+                        if (str1.indexOf('P') != -1) { //duration
+                            String duration = 
normalizeAndReportIfInvalid(str1, XMLSchema.DURATION, zone, result);
+                            result.writeTriple(bNode, vICAL.duration, 
f.createLiteral(duration, XMLSchema.DURATION));
+                        } else {
+                            String end = normalizeAndReportIfInvalid(str1, 
XMLSchema.DATETIME, zone, result);
+                            result.writeTriple(bNode, vICAL.dtend, 
f.createLiteral(end, XMLSchema.DATETIME));
+                        }
+                        return true;
+                    }
+                } else if (dataType != null) {
+                    v = f.createLiteral(str, dataType);
+                } else {
+                    v = f.createLiteral(str);
+                }
+
+            }
+            result.writeTriple(subject, predicate, v);
+            return true;
+        }
+
+        List<JsonValue> array = jsonValue.getArray();
+        if (array != null && !array.isEmpty()) {
+            if (array.size() == 1) {
+                return writeValue(subject, predicate, array.get(0), lang, 
dataType, zone, result);
+            } else {
+                BNode bNode = f.createBNode();
+                result.writeTriple(subject, predicate, bNode);
+                for (JsonValue value : array) {
+                    writeValue(bNode, RDF.VALUE, value, lang, dataType, zone, 
result);
+                }
+                return true;
+            }
+        }
+
+        Map<String, JsonValue> object = jsonValue.getObject();
+        if (object != null) {
+            BNode bNode = f.createBNode();
+            result.writeTriple(subject, predicate, bNode);
+            if (dataType != null && ICAL.NS.equals(dataType.getNamespace())) {
+                result.writeTriple(bNode, RDF.TYPE, dataType);
+            }
+            for (Map.Entry<String, JsonValue> entry : object.entrySet()) {
+                writeValue(bNode, predicate(entry.getKey(), result), 
entry.getValue(), lang, XMLSchema.STRING, zone, result);
+            }
+            return true;
+        }
+
+        return false;
+    }
+
+    private static TimeZone getTimeZone(ICalProperty prop, TimezoneInfo info) {
+        if (info.isFloating(prop)) {
             return null;
         }
+        TimezoneAssignment assignment = info.getTimezoneToWriteIn(prop);
+        if (assignment == null) {
+            return TimeZone.getTimeZone(ZoneOffset.UTC);
+        } else {
+            return assignment.getTimeZone();
+        }
     }
 
-    private static void extract(ScribeIndex index, TimezoneInfo info, BNode 
node, ICalComponent component, ExtractionResult extractionResult) {
-        for (ICalProperty property : component.getProperties().values()) {
-            ICalPropertyScribe<?> scribe = index.getPropertyScribe(property);
-            IRI predicate = predicate(scribe, extractionResult);
-            if (predicate != null) {
-                Value value = value(scribe, property, info);
-                if (value != null) {
-                    extractionResult.writeTriple(node, predicate, value);
+    @SuppressWarnings("unchecked")
+    private static <T extends ICalProperty> void writeProperty(BNode subject, 
ICalPropertyScribe<T> scribe, ICalProperty property, WriteContext ctx, 
ExtractionResult result) {
+        try {
+            T prop = (T)property;
+
+            ICalVersion version = ctx.getVersion();
+
+            ICalDataType dataType = scribe.dataType(prop, version);
+
+            ICalParameters params = scribe.prepareParameters(prop, ctx);
+
+            String lang = params.getLanguage();
+            params.removeAll(ICalParameters.LANGUAGE);
+
+            Encoding encoding = params.getEncoding();
+
+            if (dataType == null) {
+                dataType = params.getValue();
+                if (dataType == null && Encoding.BASE64.equals(encoding)) {
+                    dataType = ICalDataType.BINARY;
+                }
+            }
+            params.removeAll(ICalParameters.VALUE);
+
+            if (ICalDataType.BINARY.equals(dataType)) {
+                // RFC 5545 s. 3.2.7.
+                // If the value type parameter is ";VALUE=BINARY", then the 
inline
+                // encoding parameter MUST be specified with the value
+                // ";ENCODING=BASE64"
+                if (encoding != null && !Encoding.BASE64.equals(encoding)) {
+                    result.notifyIssue(IssueReport.IssueLevel.ERROR,
+                            "Invalid encoding " + encoding + " specified for 
BINARY value", -1, -1);
+                    dataType = null;
                 }
+                params.removeAll(ICalParameters.ENCODING);
             }
+
+            if (Encoding._8BIT.equals(encoding)) {
+                // RFC 5545 s. 3.2.7.
+                // The default encoding is "8BIT",
+                // corresponding to a property value consisting of text.
+                params.removeAll(ICalParameters.ENCODING);
+            }
+
+            // RFC 5545 s. 3.1.4.
+            // There is not a property parameter to declare the charset used 
in a
+            //   property value.  The default charset for an iCalendar stream 
is UTF-8
+            //   as defined in [RFC3629].
+            params.removeAll(ICalParameters.CHARSET);
+
+            IRI predicate = predicate(scribe.getPropertyName(version), result);
+
+            if (!params.isEmpty()) {
+                BNode bNode = f.createBNode();
+                result.writeTriple(subject, predicate, bNode);
+                writeParams(bNode, params, result);
+
+                subject = bNode;
+                predicate = RDF.VALUE;
+            }
+
+            if (prop instanceof Geo) {
+                // RFC 5870
+                Geo g = (Geo)prop;
+                IRI value = f.createIRI("geo:" + str(g.getLatitude()) + "," + 
str(g.getLongitude()));
+                result.writeTriple(subject, predicate, value);
+            } else {
+                TimeZone timeZone = getTimeZone(prop, ctx.getTimezoneInfo());
+                IRI dataTypeIRI = dataType(dataType);
+
+                JCalValue jsonVal = scribe.writeJson(prop, ctx);
+                List<JsonValue> jsonVals = jsonVal.getValues();
+
+                boolean mod = false;
+                for (JsonValue value : jsonVals) {
+                    mod |= writeValue(subject, predicate, value, lang, 
dataTypeIRI, timeZone, result);
+                }
+                if (!mod) {
+                    result.writeTriple(subject, predicate, 
f.createLiteral(jsonVal.asSingle()));
+                }
+            }
+        } catch (SkipMeException e) {
+            //ignore
+        }
+    }
+
+    private static void extract(ScribeIndex index, WriteContext ctx, BNode 
node, ICalComponent component, ExtractionResult result, boolean writeTimezones) 
{
+        for (ICalProperty property : component.getProperties().values()) {
+            ctx.setParent(component);
+            writeProperty(node, index.getPropertyScribe(property), property, 
ctx, result);
         }
-        for (ICalComponent child : component.getComponents().values()) {
+
+        Stream<ICalComponent> components = 
component.getComponents().values().stream();
+
+        if (writeTimezones) {
+            Collection<VTimezone> tzs = ctx.getTimezoneInfo().getComponents();
+            Set<String> tzIds = tzs.stream()
+                    .map(tz -> tz.getTimezoneId().getValue())
+                    .collect(Collectors.toSet());
+            components = Stream.concat(tzs.stream(), components.filter(c ->
+                    !(c instanceof VTimezone && tzIds.contains(((VTimezone) 
c).getTimezoneId().getValue())))
+            );
+        }
+
+        components.forEachOrdered(child -> {
             BNode childNode = f.createBNode();
-            extractionResult.writeTriple(node, vICAL.component, childNode);
-            IRI childType = type(index.getComponentScribe(child), 
extractionResult);
-            if (childType != null) {
-                extractionResult.writeTriple(childNode, RDF.TYPE, childType);
+            String componentName = 
index.getComponentScribe(child).getComponentName();
+            IRI childType = type(componentName);
+
+            if (childType == null) {
+                result.writeTriple(node, predicate(componentName, result), 
childNode);
+            } else {
+                result.writeTriple(node, vICAL.component, childNode);
+                result.writeTriple(childNode, RDF.TYPE, childType);
             }
-            extract(index, info, childNode, child, extractionResult);
-        }
+            extract(index, ctx, childNode, child, result, false);
+        });
     }
 
 }

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/core/src/test/java/org/apache/any23/extractor/calendar/BaseCalendarExtractorTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/any23/extractor/calendar/BaseCalendarExtractorTest.java
 
b/core/src/test/java/org/apache/any23/extractor/calendar/BaseCalendarExtractorTest.java
new file mode 100644
index 0000000..701b9ad
--- /dev/null
+++ 
b/core/src/test/java/org/apache/any23/extractor/calendar/BaseCalendarExtractorTest.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.any23.extractor.calendar;
+
+import org.apache.any23.extractor.html.AbstractExtractorTestCase;
+import org.eclipse.rdf4j.model.BNode;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.rio.RDFFormat;
+import org.eclipse.rdf4j.rio.RDFHandler;
+import org.eclipse.rdf4j.rio.RDFHandlerException;
+import org.eclipse.rdf4j.rio.RDFParseException;
+import org.eclipse.rdf4j.rio.RDFParser;
+import org.eclipse.rdf4j.rio.Rio;
+import org.junit.Assert;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+abstract class BaseCalendarExtractorTest extends AbstractExtractorTestCase {
+
+    abstract String filePrefix();
+
+    protected void extractAndVerifyAgainstNQuads(String actual, String 
expected)
+            throws RepositoryException, RDFHandlerException, IOException, 
RDFParseException {
+        String filePrefix = filePrefix();
+        assertExtract(filePrefix + actual);
+        assertModelNotEmpty();
+        List<Statement> expectedStatements = loadResultStatement(filePrefix + 
expected);
+        int actualStmtSize = getStatementsSize(null, null, null);
+        Assert.assertEquals(expectedStatements.size(), actualStmtSize);
+        for (Statement statement : expectedStatements) {
+            assertContains(
+                    statement.getSubject() instanceof BNode ? null : 
statement.getSubject(),
+                    statement.getPredicate(),
+                    statement.getObject() instanceof BNode ? null : 
statement.getObject()
+            );
+        }
+    }
+
+    private List<Statement> loadResultStatement(String resultFilePath)
+            throws RDFHandlerException, IOException, RDFParseException {
+        RDFParser nQuadsParser = Rio.createParser(RDFFormat.NQUADS);
+        TestRDFHandler rdfHandler = new TestRDFHandler();
+        nQuadsParser.setRDFHandler(rdfHandler);
+        File file = copyResourceToTempFile(resultFilePath);
+        nQuadsParser.parse(
+                new FileReader(file),
+                baseIRI.toString()
+        );
+        return rdfHandler.getStatements();
+    }
+
+    private static class TestRDFHandler implements RDFHandler {
+
+        private final List<Statement> statements = new ArrayList<Statement>();
+
+        protected List<Statement> getStatements() {
+            return statements;
+        }
+
+        public void startRDF() throws RDFHandlerException {
+        }
+
+        public void endRDF() throws RDFHandlerException {
+        }
+
+        public void handleNamespace(String s, String s1) throws 
RDFHandlerException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void handleStatement(Statement statement) throws 
RDFHandlerException {
+            statements.add(statement);
+        }
+
+        public void handleComment(String s) throws RDFHandlerException {
+            throw new UnsupportedOperationException();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/core/src/test/java/org/apache/any23/extractor/calendar/ICalExtractorTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/any23/extractor/calendar/ICalExtractorTest.java 
b/core/src/test/java/org/apache/any23/extractor/calendar/ICalExtractorTest.java
new file mode 100644
index 0000000..9000d64
--- /dev/null
+++ 
b/core/src/test/java/org/apache/any23/extractor/calendar/ICalExtractorTest.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.any23.extractor.calendar;
+
+import org.apache.any23.extractor.ExtractorFactory;
+import org.junit.Test;
+
+import java.io.IOException;
+
+
+public class ICalExtractorTest extends BaseCalendarExtractorTest {
+    @Override
+    protected ExtractorFactory<?> getExtractorFactory() {
+        return new ICalExtractorFactory();
+    }
+
+    @Override
+    String filePrefix() {
+        return "/calendar.text/";
+    }
+
+    @Test
+    public void testRFC5545example1() throws IOException {
+        extractAndVerifyAgainstNQuads("rfc5545-example1.ics", 
"rfc5545-example1-expected.nquads");
+    }
+
+    @Test
+    public void testRFC5545example2() throws IOException {
+        extractAndVerifyAgainstNQuads("rfc5545-example2.ics", 
"rfc5545-example2-expected.nquads");
+    }
+
+    @Test
+    public void testRFC5545example3() throws IOException {
+        extractAndVerifyAgainstNQuads("rfc5545-example3.ics", 
"rfc5545-example3-expected.nquads");
+    }
+
+    @Test
+    public void testRFC5545example4() throws IOException {
+        extractAndVerifyAgainstNQuads("rfc5545-example4.ics", 
"rfc5545-example4-expected.nquads");
+    }
+
+    @Test
+    public void testRFC5545example5() throws IOException {
+        extractAndVerifyAgainstNQuads("rfc5545-example5.ics", 
"rfc5545-example5-expected.nquads");
+    }
+
+    @Test
+    public void testRFC5545example6() throws IOException {
+        extractAndVerifyAgainstNQuads("rfc5545-example6.ics", 
"rfc5545-example6-expected.nquads");
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/core/src/test/java/org/apache/any23/extractor/calendar/JCalExtractorTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/any23/extractor/calendar/JCalExtractorTest.java 
b/core/src/test/java/org/apache/any23/extractor/calendar/JCalExtractorTest.java
new file mode 100644
index 0000000..bbe633b
--- /dev/null
+++ 
b/core/src/test/java/org/apache/any23/extractor/calendar/JCalExtractorTest.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.any23.extractor.calendar;
+
+import org.apache.any23.extractor.ExtractorFactory;
+import org.junit.Test;
+
+import java.io.IOException;
+
+public class JCalExtractorTest extends BaseCalendarExtractorTest {
+
+    @Override
+    String filePrefix() {
+        return "/calendar.json/";
+    }
+
+    @Override
+    protected ExtractorFactory<?> getExtractorFactory() {
+        return new JCalExtractorFactory();
+    }
+
+    @Test
+    public void testRFC7265example1() throws IOException {
+        extractAndVerifyAgainstNQuads("rfc7265-example1.json", 
"rfc7265-example1-expected.nquads");
+    }
+
+    @Test
+    public void testRFC7265example2() throws IOException {
+        extractAndVerifyAgainstNQuads("rfc7265-example2.json", 
"rfc7265-example2-expected.nquads");
+    }
+}

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/core/src/test/java/org/apache/any23/extractor/calendar/XCalExtractorTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/any23/extractor/calendar/XCalExtractorTest.java 
b/core/src/test/java/org/apache/any23/extractor/calendar/XCalExtractorTest.java
new file mode 100644
index 0000000..c063179
--- /dev/null
+++ 
b/core/src/test/java/org/apache/any23/extractor/calendar/XCalExtractorTest.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.any23.extractor.calendar;
+
+import org.apache.any23.extractor.ExtractorFactory;
+import org.junit.Test;
+
+import java.io.IOException;
+
+public class XCalExtractorTest extends BaseCalendarExtractorTest {
+
+    @Override
+    String filePrefix() {
+        return "/calendar.xml/";
+    }
+
+    @Override
+    protected ExtractorFactory<?> getExtractorFactory() {
+        return new XCalExtractorFactory();
+    }
+
+    @Test
+    public void testRFC6321example1() throws IOException {
+        extractAndVerifyAgainstNQuads("rfc6321-example1.xml", 
"rfc6321-example1-expected.nquads");
+    }
+
+    @Test
+    public void testRFC6321example2() throws IOException {
+        extractAndVerifyAgainstNQuads("rfc6321-example2.xml", 
"rfc6321-example2-expected.nquads");
+    }
+}

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/core/src/test/java/org/apache/any23/vocab/RDFSchemaUtilsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/any23/vocab/RDFSchemaUtilsTest.java 
b/core/src/test/java/org/apache/any23/vocab/RDFSchemaUtilsTest.java
index d8fd8d5..83917bf 100644
--- a/core/src/test/java/org/apache/any23/vocab/RDFSchemaUtilsTest.java
+++ b/core/src/test/java/org/apache/any23/vocab/RDFSchemaUtilsTest.java
@@ -43,7 +43,7 @@ public class RDFSchemaUtilsTest {
      */
     @Test
     public void testSerializeVocabulariesNTriples() {
-        serializeVocabularies(RDFFormat.NTRIPLES, 2174);
+        serializeVocabularies(RDFFormat.NTRIPLES, 2178);
     }
 
     /**
@@ -53,7 +53,7 @@ public class RDFSchemaUtilsTest {
      */
     @Test
     public void testSerializeVocabulariesRDFXML() {
-        serializeVocabularies(RDFFormat.RDFXML, 5699); // Effective lines + 
separators.
+        serializeVocabularies(RDFFormat.RDFXML, 5709); // Effective lines + 
separators.
     }
 
     private void serializeVocabularies(RDFFormat format, int expectedLines) {

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/test-resources/src/test/resources/calendar.json/rfc7265-example1-expected.nquads
----------------------------------------------------------------------
diff --git 
a/test-resources/src/test/resources/calendar.json/rfc7265-example1-expected.nquads
 
b/test-resources/src/test/resources/calendar.json/rfc7265-example1-expected.nquads
new file mode 100644
index 0000000..ae9c0bc
--- /dev/null
+++ 
b/test-resources/src/test/resources/calendar.json/rfc7265-example1-expected.nquads
@@ -0,0 +1,26 @@
+#
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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.
+#
+
+_:node1clu3uv03x2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Vcalendar> <http://bob.example.com/> .
+_:node1clu3uv03x2 <http://www.w3.org/2002/12/cal/icaltzd#prodid> "-//Example 
Inc.//Example Calendar//EN" <http://bob.example.com/> .
+_:node1clu3uv03x2 <http://www.w3.org/2002/12/cal/icaltzd#calscale> "GREGORIAN" 
<http://bob.example.com/> .
+_:node1clu3uv03x2 <http://www.w3.org/2002/12/cal/icaltzd#component> 
_:node1clu3uv03x3 <http://bob.example.com/> .
+_:node1clu3uv03x3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Vevent> <http://bob.example.com/> .
+_:node1clu3uv03x3 <http://www.w3.org/2002/12/cal/icaltzd#dtstamp> 
"2008-02-05T19:12:24Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu3uv03x3 <http://www.w3.org/2002/12/cal/icaltzd#dtstart> 
"2008-10-06"^^<http://www.w3.org/2001/XMLSchema#date> <http://bob.example.com/> 
.
+_:node1clu3uv03x3 <http://www.w3.org/2002/12/cal/icaltzd#summary> "Planning 
meeting" <http://bob.example.com/> .
+_:node1clu3uv03x3 <http://www.w3.org/2002/12/cal/icaltzd#uid> 
"4088E990AD89CB3DBB484909" <http://bob.example.com/> .

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/test-resources/src/test/resources/calendar.json/rfc7265-example1.json
----------------------------------------------------------------------
diff --git 
a/test-resources/src/test/resources/calendar.json/rfc7265-example1.json 
b/test-resources/src/test/resources/calendar.json/rfc7265-example1.json
new file mode 100755
index 0000000..c94699e
--- /dev/null
+++ b/test-resources/src/test/resources/calendar.json/rfc7265-example1.json
@@ -0,0 +1,18 @@
+["vcalendar",
+  [
+    ["version", {}, "text", "2.0"],
+    ["prodid", {}, "text", "-//Example Inc.//Example Calendar//EN"],
+    ["calscale", {}, "text", "GREGORIAN"]
+  ],
+  [
+    ["vevent",
+      [
+        ["dtstamp", {}, "date-time", "2008-02-05T19:12:24Z"],
+        ["dtstart", {}, "date", "2008-10-06"],
+        ["summary", {}, "text", "Planning meeting"],
+        ["uid", {}, "text", "4088E990AD89CB3DBB484909"]
+      ],
+      []
+    ]
+  ]
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/test-resources/src/test/resources/calendar.json/rfc7265-example2-expected.nquads
----------------------------------------------------------------------
diff --git 
a/test-resources/src/test/resources/calendar.json/rfc7265-example2-expected.nquads
 
b/test-resources/src/test/resources/calendar.json/rfc7265-example2-expected.nquads
new file mode 100644
index 0000000..11ce490
--- /dev/null
+++ 
b/test-resources/src/test/resources/calendar.json/rfc7265-example2-expected.nquads
@@ -0,0 +1,75 @@
+#
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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.
+#
+
+_:node1clu415j2x2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Vcalendar> <http://bob.example.com/> .
+_:node1clu415j2x2 <http://www.w3.org/2002/12/cal/icaltzd#prodid> "-//Example 
Corp.//Example Client//EN" <http://bob.example.com/> .
+_:node1clu415j2x2 <http://www.w3.org/2002/12/cal/icaltzd#component> 
_:node1clu415j2x3 <http://bob.example.com/> .
+_:node1clu415j2x3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Vtimezone> <http://bob.example.com/> .
+_:node1clu415j2x3 <http://www.w3.org/2002/12/cal/icaltzd#tzid> "US/Eastern" 
<http://bob.example.com/> .
+_:node1clu415j2x3 <http://www.w3.org/2002/12/cal/icaltzd#lastModified> 
"2004-01-10T03:28:45Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu415j2x3 <http://www.w3.org/2002/12/cal/icaltzd#daylight> 
_:node1clu415j2x4 <http://bob.example.com/> .
+_:node1clu415j2x4 <http://www.w3.org/2002/12/cal/icaltzd#dtstart> 
"2000-04-04T02:00:00"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu415j2x4 <http://www.w3.org/2002/12/cal/icaltzd#rrule> 
_:node1clu415j2x5 <http://bob.example.com/> .
+_:node1clu415j2x5 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Value_RECUR> <http://bob.example.com/> .
+_:node1clu415j2x5 <http://www.w3.org/2002/12/cal/icaltzd#freq> "YEARLY" 
<http://bob.example.com/> .
+_:node1clu415j2x5 <http://www.w3.org/2002/12/cal/icaltzd#byday> "1SU" 
<http://bob.example.com/> .
+_:node1clu415j2x5 <http://www.w3.org/2002/12/cal/icaltzd#bymonth> 
"4"^^<http://www.w3.org/2001/XMLSchema#int> <http://bob.example.com/> .
+_:node1clu415j2x4 <http://www.w3.org/2002/12/cal/icaltzd#tzname> "EDT" 
<http://bob.example.com/> .
+_:node1clu415j2x4 <http://www.w3.org/2002/12/cal/icaltzd#tzoffsetfrom> 
"-05:00" <http://bob.example.com/> .
+_:node1clu415j2x4 <http://www.w3.org/2002/12/cal/icaltzd#tzoffsetto> "-04:00" 
<http://bob.example.com/> .
+_:node1clu415j2x3 <http://www.w3.org/2002/12/cal/icaltzd#standard> 
_:node1clu415j2x6 <http://bob.example.com/> .
+_:node1clu415j2x6 <http://www.w3.org/2002/12/cal/icaltzd#dtstart> 
"2000-10-26T02:00:00"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu415j2x6 <http://www.w3.org/2002/12/cal/icaltzd#rrule> 
_:node1clu415j2x7 <http://bob.example.com/> .
+_:node1clu415j2x7 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Value_RECUR> <http://bob.example.com/> .
+_:node1clu415j2x7 <http://www.w3.org/2002/12/cal/icaltzd#freq> "YEARLY" 
<http://bob.example.com/> .
+_:node1clu415j2x7 <http://www.w3.org/2002/12/cal/icaltzd#byday> "1SU" 
<http://bob.example.com/> .
+_:node1clu415j2x7 <http://www.w3.org/2002/12/cal/icaltzd#bymonth> 
"10"^^<http://www.w3.org/2001/XMLSchema#int> <http://bob.example.com/> .
+_:node1clu415j2x6 <http://www.w3.org/2002/12/cal/icaltzd#tzname> "EST" 
<http://bob.example.com/> .
+_:node1clu415j2x6 <http://www.w3.org/2002/12/cal/icaltzd#tzoffsetfrom> 
"-04:00" <http://bob.example.com/> .
+_:node1clu415j2x6 <http://www.w3.org/2002/12/cal/icaltzd#tzoffsetto> "-05:00" 
<http://bob.example.com/> .
+_:node1clu415j2x2 <http://www.w3.org/2002/12/cal/icaltzd#component> 
_:node1clu415j2x8 <http://bob.example.com/> .
+_:node1clu415j2x8 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Vevent> <http://bob.example.com/> .
+_:node1clu415j2x8 <http://www.w3.org/2002/12/cal/icaltzd#dtstamp> 
"2006-02-06T00:11:21Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu415j2x8 <http://www.w3.org/2002/12/cal/icaltzd#dtstart> 
_:node1clu415j2x9 <http://bob.example.com/> .
+_:node1clu415j2x9 <http://www.w3.org/2002/12/cal/icaltzd#tzid> "US/Eastern" 
<http://bob.example.com/> .
+_:node1clu415j2x9 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> 
"2006-01-02T12:00:00-05:00"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu415j2x8 <http://www.w3.org/2002/12/cal/icaltzd#duration> 
"PT1H"^^<http://www.w3.org/2001/XMLSchema#duration> <http://bob.example.com/> .
+_:node1clu415j2x8 <http://www.w3.org/2002/12/cal/icaltzd#rrule> 
_:node1clu415j2x10 <http://bob.example.com/> .
+_:node1clu415j2x10 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Value_RECUR> <http://bob.example.com/> .
+_:node1clu415j2x10 <http://www.w3.org/2002/12/cal/icaltzd#freq> "DAILY" 
<http://bob.example.com/> .
+_:node1clu415j2x10 <http://www.w3.org/2002/12/cal/icaltzd#count> 
"5"^^<http://www.w3.org/2001/XMLSchema#int> <http://bob.example.com/> .
+_:node1clu415j2x8 <http://www.w3.org/2002/12/cal/icaltzd#rdate> 
_:node1clu415j2x11 <http://bob.example.com/> .
+_:node1clu415j2x11 <http://www.w3.org/2002/12/cal/icaltzd#tzid> "US/Eastern" 
<http://bob.example.com/> .
+_:node1clu415j2x11 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> 
_:node1clu415j2x12 <http://bob.example.com/> .
+_:node1clu415j2x12 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Value_PERIOD> <http://bob.example.com/> .
+_:node1clu415j2x12 <http://www.w3.org/2002/12/cal/icaltzd#dtstart> 
"2006-01-02T15:00:00-05:00"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu415j2x12 <http://www.w3.org/2002/12/cal/icaltzd#duration> 
"PT2H"^^<http://www.w3.org/2001/XMLSchema#duration> <http://bob.example.com/> .
+_:node1clu415j2x8 <http://www.w3.org/2002/12/cal/icaltzd#summary> "Event #2" 
<http://bob.example.com/> .
+_:node1clu415j2x8 <http://www.w3.org/2002/12/cal/icaltzd#description> "We are 
having a meeting all this week at 12 pm for one hour, with an additional 
meeting on the first day 2 hours long.\nPlease bring your own lunch for the 12 
pm meetings." <http://bob.example.com/> .
+_:node1clu415j2x8 <http://www.w3.org/2002/12/cal/icaltzd#uid> 
"[email protected]" <http://bob.example.com/> .
+_:node1clu415j2x2 <http://www.w3.org/2002/12/cal/icaltzd#component> 
_:node1clu415j2x13 <http://bob.example.com/> .
+_:node1clu415j2x13 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Vevent> <http://bob.example.com/> .
+_:node1clu415j2x13 <http://www.w3.org/2002/12/cal/icaltzd#dtstamp> 
"2006-02-06T00:11:21Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu415j2x13 <http://www.w3.org/2002/12/cal/icaltzd#dtstart> 
_:node1clu415j2x14 <http://bob.example.com/> .
+_:node1clu415j2x14 <http://www.w3.org/2002/12/cal/icaltzd#tzid> "US/Eastern" 
<http://bob.example.com/> .
+_:node1clu415j2x14 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> 
"2006-01-02T14:00:00-05:00"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu415j2x13 <http://www.w3.org/2002/12/cal/icaltzd#duration> 
"PT1H"^^<http://www.w3.org/2001/XMLSchema#duration> <http://bob.example.com/> .
+_:node1clu415j2x13 <http://www.w3.org/2002/12/cal/icaltzd#recurrenceId> 
_:node1clu415j2x15 <http://bob.example.com/> .
+_:node1clu415j2x15 <http://www.w3.org/2002/12/cal/icaltzd#tzid> "US/Eastern" 
<http://bob.example.com/> .
+_:node1clu415j2x15 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> 
"2006-01-04T12:00:00-05:00"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu415j2x13 <http://www.w3.org/2002/12/cal/icaltzd#summary> "Event #2" 
<http://bob.example.com/> .
+_:node1clu415j2x13 <http://www.w3.org/2002/12/cal/icaltzd#uid> 
"[email protected]" <http://bob.example.com/> .

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/test-resources/src/test/resources/calendar.json/rfc7265-example2.json
----------------------------------------------------------------------
diff --git 
a/test-resources/src/test/resources/calendar.json/rfc7265-example2.json 
b/test-resources/src/test/resources/calendar.json/rfc7265-example2.json
new file mode 100755
index 0000000..1deb906
--- /dev/null
+++ b/test-resources/src/test/resources/calendar.json/rfc7265-example2.json
@@ -0,0 +1,96 @@
+["vcalendar",
+  [
+    ["version", {}, "text", "2.0"],
+    ["prodid", {}, "text", "-//Example Corp.//Example Client//EN"]
+  ],
+  [
+    ["vtimezone",
+      [
+        ["tzid", {}, "text", "US/Eastern"],
+        ["last-modified", {}, "date-time", "2004-01-10T03:28:45Z"]
+      ],
+      [
+        ["daylight",
+          [
+            ["dtstart", {}, "date-time", "2000-04-04T02:00:00"],
+            ["rrule",
+             {},
+             "recur",
+             {
+               "freq": "YEARLY",
+               "byday": "1SU",
+               "bymonth": 4
+             }
+            ],
+            ["tzname", {}, "text", "EDT"],
+            ["tzoffsetfrom", {}, "utc-offset", "-05:00"],
+            ["tzoffsetto", {}, "utc-offset", "-04:00"]
+          ],
+          []
+        ],
+        ["standard",
+          [
+            ["dtstart", {}, "date-time", "2000-10-26T02:00:00"],
+            ["rrule",
+             {},
+             "recur",
+             {
+               "freq": "YEARLY",
+               "byday": "1SU",
+               "bymonth": 10
+             }
+            ],
+            ["tzname", {}, "text", "EST"],
+            ["tzoffsetfrom", {}, "utc-offset", "-04:00"],
+            ["tzoffsetto", {}, "utc-offset", "-05:00"]
+          ],
+          []
+        ]
+      ]
+    ],
+    ["vevent",
+      [
+        ["dtstamp", {}, "date-time", "2006-02-06T00:11:21Z"],
+        ["dtstart",
+         { "tzid": "US/Eastern" },
+         "date-time",
+         "2006-01-02T12:00:00"
+        ],
+        ["duration", {}, "duration", "PT1H"],
+        ["rrule", {}, "recur", {"freq": "DAILY", "count": 5 }],
+        ["rdate",
+         { "tzid": "US/Eastern" },
+         "period",
+         "2006-01-02T15:00:00/PT2H"
+        ],
+        ["summary", {}, "text", "Event #2"],
+        ["description",
+         {},
+         "text",
+         "We are having a meeting all this week at 12 pm for one hour, with an 
additional meeting on the first day 2 hours long.\nPlease bring your own lunch 
for the 12 pm meetings."
+        ],
+        ["uid", {}, "text", "[email protected]"]
+      ],
+      []
+    ],
+    ["vevent",
+      [
+        ["dtstamp", {}, "date-time", "2006-02-06T00:11:21Z"],
+        ["dtstart",
+         { "tzid": "US/Eastern" },
+         "date-time",
+         "2006-01-02T14:00:00"
+        ],
+        ["duration", {}, "duration", "PT1H"],
+        ["recurrence-id",
+         { "tzid": "US/Eastern" },
+         "date-time",
+         "2006-01-04T12:00:00"
+        ],
+        ["summary", {}, "text", "Event #2"],
+        ["uid", {}, "text", "[email protected]"]
+      ],
+      []
+    ]
+  ]
+]

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/test-resources/src/test/resources/calendar.text/rfc5545-example1-expected.nquads
----------------------------------------------------------------------
diff --git 
a/test-resources/src/test/resources/calendar.text/rfc5545-example1-expected.nquads
 
b/test-resources/src/test/resources/calendar.text/rfc5545-example1-expected.nquads
new file mode 100644
index 0000000..c043a1c
--- /dev/null
+++ 
b/test-resources/src/test/resources/calendar.text/rfc5545-example1-expected.nquads
@@ -0,0 +1,30 @@
+#
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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.
+#
+
+_:node1clu1knnlx2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Vcalendar> <http://bob.example.com/> .
+_:node1clu1knnlx2 <http://www.w3.org/2002/12/cal/icaltzd#prodid> "-//xyz 
Corp//NONSGML PDA Calendar Version 1.0//EN" <http://bob.example.com/> .
+_:node1clu1knnlx2 <http://www.w3.org/2002/12/cal/icaltzd#component> 
_:node1clu1knnlx3 <http://bob.example.com/> .
+_:node1clu1knnlx3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Vevent> <http://bob.example.com/> .
+_:node1clu1knnlx3 <http://www.w3.org/2002/12/cal/icaltzd#dtstamp> 
"1996-07-04T12:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu1knnlx3 <http://www.w3.org/2002/12/cal/icaltzd#uid> 
"[email protected]" <http://bob.example.com/> .
+_:node1clu1knnlx3 <http://www.w3.org/2002/12/cal/icaltzd#organizer> 
<mailto:[email protected]> <http://bob.example.com/> .
+_:node1clu1knnlx3 <http://www.w3.org/2002/12/cal/icaltzd#dtstart> 
"1996-09-18T14:30:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu1knnlx3 <http://www.w3.org/2002/12/cal/icaltzd#dtend> 
"1996-09-20T22:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu1knnlx3 <http://www.w3.org/2002/12/cal/icaltzd#status> "CONFIRMED" 
<http://bob.example.com/> .
+_:node1clu1knnlx3 <http://www.w3.org/2002/12/cal/icaltzd#categories> 
"CONFERENCE" <http://bob.example.com/> .
+_:node1clu1knnlx3 <http://www.w3.org/2002/12/cal/icaltzd#summary> 
"Networld+Interop Conference" <http://bob.example.com/> .
+_:node1clu1knnlx3 <http://www.w3.org/2002/12/cal/icaltzd#description> 
"Networld+Interop Conferenceand Exhibit\nAtlanta World Congress 
Center\nAtlanta, Georgia" <http://bob.example.com/> .

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/test-resources/src/test/resources/calendar.text/rfc5545-example1.ics
----------------------------------------------------------------------
diff --git 
a/test-resources/src/test/resources/calendar.text/rfc5545-example1.ics 
b/test-resources/src/test/resources/calendar.text/rfc5545-example1.ics
new file mode 100755
index 0000000..34ba23e
--- /dev/null
+++ b/test-resources/src/test/resources/calendar.text/rfc5545-example1.ics
@@ -0,0 +1,17 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//xyz Corp//NONSGML PDA Calendar Version 1.0//EN
+BEGIN:VEVENT
+DTSTAMP:19960704T120000Z
+UID:[email protected]
+ORGANIZER:mailto:[email protected]
+DTSTART:19960918T143000Z
+DTEND:19960920T220000Z
+STATUS:CONFIRMED
+CATEGORIES:CONFERENCE
+SUMMARY:Networld+Interop Conference
+DESCRIPTION:Networld+Interop Conference
+ and Exhibit\nAtlanta World Congress Center\n
+ Atlanta\, Georgia
+END:VEVENT
+END:VCALENDAR

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/test-resources/src/test/resources/calendar.text/rfc5545-example2-expected.nquads
----------------------------------------------------------------------
diff --git 
a/test-resources/src/test/resources/calendar.text/rfc5545-example2-expected.nquads
 
b/test-resources/src/test/resources/calendar.text/rfc5545-example2-expected.nquads
new file mode 100644
index 0000000..89f06e8
--- /dev/null
+++ 
b/test-resources/src/test/resources/calendar.text/rfc5545-example2-expected.nquads
@@ -0,0 +1,55 @@
+#
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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.
+#
+
+_:node1clu1u3ipx2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Vcalendar> <http://bob.example.com/> .
+_:node1clu1u3ipx2 <http://www.w3.org/2002/12/cal/icaltzd#prodid> "-//RDU 
Software//NONSGML HandCal//EN" <http://bob.example.com/> .
+_:node1clu1u3ipx2 <http://www.w3.org/2002/12/cal/icaltzd#component> 
_:node1clu1u3ipx3 <http://bob.example.com/> .
+_:node1clu1u3ipx3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Vtimezone> <http://bob.example.com/> .
+_:node1clu1u3ipx3 <http://www.w3.org/2002/12/cal/icaltzd#tzid> 
"America/New_York" <http://bob.example.com/> .
+_:node1clu1u3ipx3 <http://www.w3.org/2002/12/cal/icaltzd#standard> 
_:node1clu1u3ipx4 <http://bob.example.com/> .
+_:node1clu1u3ipx4 <http://www.w3.org/2002/12/cal/icaltzd#dtstart> 
"1998-10-25T02:00:00"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu1u3ipx4 <http://www.w3.org/2002/12/cal/icaltzd#tzoffsetfrom> 
"-04:00" <http://bob.example.com/> .
+_:node1clu1u3ipx4 <http://www.w3.org/2002/12/cal/icaltzd#tzoffsetto> "-05:00" 
<http://bob.example.com/> .
+_:node1clu1u3ipx4 <http://www.w3.org/2002/12/cal/icaltzd#tzname> "EST" 
<http://bob.example.com/> .
+_:node1clu1u3ipx3 <http://www.w3.org/2002/12/cal/icaltzd#daylight> 
_:node1clu1u3ipx5 <http://bob.example.com/> .
+_:node1clu1u3ipx5 <http://www.w3.org/2002/12/cal/icaltzd#dtstart> 
"1999-04-04T02:00:00"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu1u3ipx5 <http://www.w3.org/2002/12/cal/icaltzd#tzoffsetfrom> 
"-05:00" <http://bob.example.com/> .
+_:node1clu1u3ipx5 <http://www.w3.org/2002/12/cal/icaltzd#tzoffsetto> "-04:00" 
<http://bob.example.com/> .
+_:node1clu1u3ipx5 <http://www.w3.org/2002/12/cal/icaltzd#tzname> "EDT" 
<http://bob.example.com/> .
+_:node1clu1u3ipx2 <http://www.w3.org/2002/12/cal/icaltzd#component> 
_:node1clu1u3ipx6 <http://bob.example.com/> .
+_:node1clu1u3ipx6 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Vevent> <http://bob.example.com/> .
+_:node1clu1u3ipx6 <http://www.w3.org/2002/12/cal/icaltzd#dtstamp> 
"1998-03-09T23:10:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu1u3ipx6 <http://www.w3.org/2002/12/cal/icaltzd#uid> 
"guid-1.example.com" <http://bob.example.com/> .
+_:node1clu1u3ipx6 <http://www.w3.org/2002/12/cal/icaltzd#organizer> 
<mailto:[email protected]> <http://bob.example.com/> .
+_:node1clu1u3ipx6 <http://www.w3.org/2002/12/cal/icaltzd#attendee> 
_:node1clu1u3ipx7 <http://bob.example.com/> .
+_:node1clu1u3ipx7 <http://www.w3.org/2002/12/cal/icaltzd#cutype> "GROUP" 
<http://bob.example.com/> .
+_:node1clu1u3ipx7 <http://www.w3.org/2002/12/cal/icaltzd#rsvp> "TRUE" 
<http://bob.example.com/> .
+_:node1clu1u3ipx7 <http://www.w3.org/2002/12/cal/icaltzd#role> 
"REQ-PARTICIPANT" <http://bob.example.com/> .
+_:node1clu1u3ipx7 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> 
<mailto:[email protected]> <http://bob.example.com/> .
+_:node1clu1u3ipx6 <http://www.w3.org/2002/12/cal/icaltzd#description> "Project 
XYZ Review Meeting" <http://bob.example.com/> .
+_:node1clu1u3ipx6 <http://www.w3.org/2002/12/cal/icaltzd#categories> "MEETING" 
<http://bob.example.com/> .
+_:node1clu1u3ipx6 <http://www.w3.org/2002/12/cal/icaltzd#class> "PUBLIC" 
<http://bob.example.com/> .
+_:node1clu1u3ipx6 <http://www.w3.org/2002/12/cal/icaltzd#created> 
"1998-03-09T13:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu1u3ipx6 <http://www.w3.org/2002/12/cal/icaltzd#summary> "XYZ Project 
Review" <http://bob.example.com/> .
+_:node1clu1u3ipx6 <http://www.w3.org/2002/12/cal/icaltzd#dtstart> 
_:node1clu1u3ipx8 <http://bob.example.com/> .
+_:node1clu1u3ipx8 <http://www.w3.org/2002/12/cal/icaltzd#tzid> 
"America/New_York" <http://bob.example.com/> .
+_:node1clu1u3ipx8 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> 
"1998-03-12T08:30:00-05:00"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu1u3ipx6 <http://www.w3.org/2002/12/cal/icaltzd#dtend> 
_:node1clu1u3ipx9 <http://bob.example.com/> .
+_:node1clu1u3ipx9 <http://www.w3.org/2002/12/cal/icaltzd#tzid> 
"America/New_York" <http://bob.example.com/> .
+_:node1clu1u3ipx9 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> 
"1998-03-12T09:30:00-05:00"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu1u3ipx6 <http://www.w3.org/2002/12/cal/icaltzd#location> "1CP 
Conference Room 4350" <http://bob.example.com/> .
+

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/test-resources/src/test/resources/calendar.text/rfc5545-example2.ics
----------------------------------------------------------------------
diff --git 
a/test-resources/src/test/resources/calendar.text/rfc5545-example2.ics 
b/test-resources/src/test/resources/calendar.text/rfc5545-example2.ics
new file mode 100755
index 0000000..0bb0c27
--- /dev/null
+++ b/test-resources/src/test/resources/calendar.text/rfc5545-example2.ics
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//RDU Software//NONSGML HandCal//EN
+BEGIN:VTIMEZONE
+TZID:America/New_York
+BEGIN:STANDARD
+DTSTART:19981025T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19990404T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:19980309T231000Z
+UID:guid-1.example.com
+ORGANIZER:mailto:[email protected]
+ATTENDEE;CUTYPE=GROUP;RSVP=TRUE;ROLE=REQ-PARTICIPANT:
+ mailto:[email protected]
+DESCRIPTION:Project XYZ Review Meeting
+CATEGORIES:MEETING
+CLASS:PUBLIC
+CREATED:19980309T130000Z
+SUMMARY:XYZ Project Review
+DTSTART;TZID=America/New_York:19980312T083000
+DTEND;TZID=America/New_York:19980312T093000
+LOCATION:1CP Conference Room 4350
+END:VEVENT
+END:VCALENDAR

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/test-resources/src/test/resources/calendar.text/rfc5545-example3-expected.nquads
----------------------------------------------------------------------
diff --git 
a/test-resources/src/test/resources/calendar.text/rfc5545-example3-expected.nquads
 
b/test-resources/src/test/resources/calendar.text/rfc5545-example3-expected.nquads
new file mode 100644
index 0000000..9d48895
--- /dev/null
+++ 
b/test-resources/src/test/resources/calendar.text/rfc5545-example3-expected.nquads
@@ -0,0 +1,40 @@
+#
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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.
+#
+
+_:node1clu24refx2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Vcalendar> <http://bob.example.com/> .
+_:node1clu24refx2 <http://www.w3.org/2002/12/cal/icaltzd#prodid> "-//ABC 
Corporation//NONSGML My Product//EN" <http://bob.example.com/> .
+_:node1clu24refx2 <http://www.w3.org/2002/12/cal/icaltzd#method> "xyz" 
<http://bob.example.com/> .
+_:node1clu24refx2 <http://www.w3.org/2002/12/cal/icaltzd#component> 
_:node1clu24refx3 <http://bob.example.com/> .
+_:node1clu24refx3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Vevent> <http://bob.example.com/> .
+_:node1clu24refx3 <http://www.w3.org/2002/12/cal/icaltzd#dtstamp> 
"1997-03-24T12:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu24refx3 <http://www.w3.org/2002/12/cal/icaltzd#sequence> 
"0"^^<http://www.w3.org/2001/XMLSchema#int> <http://bob.example.com/> .
+_:node1clu24refx3 <http://www.w3.org/2002/12/cal/icaltzd#uid> 
"[email protected]" <http://bob.example.com/> .
+_:node1clu24refx3 <http://www.w3.org/2002/12/cal/icaltzd#organizer> 
<mailto:[email protected]> <http://bob.example.com/> .
+_:node1clu24refx3 <http://www.w3.org/2002/12/cal/icaltzd#attendee> 
_:node1clu24refx4 <http://bob.example.com/> .
+_:node1clu24refx4 <http://www.w3.org/2002/12/cal/icaltzd#rsvp> "TRUE" 
<http://bob.example.com/> .
+_:node1clu24refx4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> 
<mailto:[email protected]> <http://bob.example.com/> .
+_:node1clu24refx3 <http://www.w3.org/2002/12/cal/icaltzd#dtstart> 
"1997-03-24T12:30:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu24refx3 <http://www.w3.org/2002/12/cal/icaltzd#dtend> 
"1997-03-24T21:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu24refx3 <http://www.w3.org/2002/12/cal/icaltzd#categories> "MEETING" 
<http://bob.example.com/> .
+_:node1clu24refx3 <http://www.w3.org/2002/12/cal/icaltzd#categories> "PROJECT" 
<http://bob.example.com/> .
+_:node1clu24refx3 <http://www.w3.org/2002/12/cal/icaltzd#class> "PUBLIC" 
<http://bob.example.com/> .
+_:node1clu24refx3 <http://www.w3.org/2002/12/cal/icaltzd#summary> "Calendaring 
Interoperability Planning Meeting" <http://bob.example.com/> .
+_:node1clu24refx3 <http://www.w3.org/2002/12/cal/icaltzd#description> "Discuss 
how we can test c&s interoperability\nusing iCalendar and other IETF 
standards." <http://bob.example.com/> .
+_:node1clu24refx3 <http://www.w3.org/2002/12/cal/icaltzd#location> "LDB Lobby" 
<http://bob.example.com/> .
+_:node1clu24refx3 <http://www.w3.org/2002/12/cal/icaltzd#attach> 
_:node1clu24refx5 <http://bob.example.com/> .
+_:node1clu24refx5 <http://www.w3.org/2002/12/cal/icaltzd#fmttype> 
"application/postscript" <http://bob.example.com/> .
+_:node1clu24refx5 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> 
<ftp://example.com/pub/conf/bkgrnd.ps> <http://bob.example.com/> .

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/test-resources/src/test/resources/calendar.text/rfc5545-example3.ics
----------------------------------------------------------------------
diff --git 
a/test-resources/src/test/resources/calendar.text/rfc5545-example3.ics 
b/test-resources/src/test/resources/calendar.text/rfc5545-example3.ics
new file mode 100755
index 0000000..da83a1b
--- /dev/null
+++ b/test-resources/src/test/resources/calendar.text/rfc5545-example3.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//ABC Corporation//NONSGML My Product//EN
+METHOD:xyz
+BEGIN:VEVENT
+DTSTAMP:19970324T120000Z
+SEQUENCE:0
+UID:[email protected]
+ORGANIZER:mailto:[email protected]
+ATTENDEE;RSVP=TRUE:mailto:[email protected]
+DTSTART:19970324T123000Z
+DTEND:19970324T210000Z
+CATEGORIES:MEETING,PROJECT
+CLASS:PUBLIC
+SUMMARY:Calendaring Interoperability Planning Meeting
+DESCRIPTION:Discuss how we can test c&s interoperability\n
+ using iCalendar and other IETF standards.
+LOCATION:LDB Lobby
+ATTACH;FMTTYPE=application/postscript:ftp://example.com/pub/
+ conf/bkgrnd.ps
+END:VEVENT
+END:VCALENDAR

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/test-resources/src/test/resources/calendar.text/rfc5545-example4-expected.nquads
----------------------------------------------------------------------
diff --git 
a/test-resources/src/test/resources/calendar.text/rfc5545-example4-expected.nquads
 
b/test-resources/src/test/resources/calendar.text/rfc5545-example4-expected.nquads
new file mode 100644
index 0000000..7b34215
--- /dev/null
+++ 
b/test-resources/src/test/resources/calendar.text/rfc5545-example4-expected.nquads
@@ -0,0 +1,40 @@
+#
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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.
+#
+
+_:node1clu27ji5x2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Vcalendar> <http://bob.example.com/> .
+_:node1clu27ji5x2 <http://www.w3.org/2002/12/cal/icaltzd#prodid> "-//ABC 
Corporation//NONSGML My Product//EN" <http://bob.example.com/> .
+_:node1clu27ji5x2 <http://www.w3.org/2002/12/cal/icaltzd#component> 
_:node1clu27ji5x3 <http://bob.example.com/> .
+_:node1clu27ji5x3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Vtodo> <http://bob.example.com/> .
+_:node1clu27ji5x3 <http://www.w3.org/2002/12/cal/icaltzd#dtstamp> 
"1998-01-30T13:45:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu27ji5x3 <http://www.w3.org/2002/12/cal/icaltzd#sequence> 
"2"^^<http://www.w3.org/2001/XMLSchema#int> <http://bob.example.com/> .
+_:node1clu27ji5x3 <http://www.w3.org/2002/12/cal/icaltzd#uid> 
"[email protected]" <http://bob.example.com/> .
+_:node1clu27ji5x3 <http://www.w3.org/2002/12/cal/icaltzd#organizer> 
<mailto:[email protected]> <http://bob.example.com/> .
+_:node1clu27ji5x3 <http://www.w3.org/2002/12/cal/icaltzd#attendee> 
_:node1clu27ji5x4 <http://bob.example.com/> .
+_:node1clu27ji5x4 <http://www.w3.org/2002/12/cal/icaltzd#partstat> "ACCEPTED" 
<http://bob.example.com/> .
+_:node1clu27ji5x4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> 
<mailto:[email protected]> <http://bob.example.com/> .
+_:node1clu27ji5x3 <http://www.w3.org/2002/12/cal/icaltzd#due> 
"1998-04-15T00:00:00"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu27ji5x3 <http://www.w3.org/2002/12/cal/icaltzd#status> 
"NEEDS-ACTION" <http://bob.example.com/> .
+_:node1clu27ji5x3 <http://www.w3.org/2002/12/cal/icaltzd#summary> "Submit 
Income Taxes" <http://bob.example.com/> .
+_:node1clu27ji5x3 <http://www.w3.org/2002/12/cal/icaltzd#component> 
_:node1clu27ji5x5 <http://bob.example.com/> .
+_:node1clu27ji5x5 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Valarm> <http://bob.example.com/> .
+_:node1clu27ji5x5 <http://www.w3.org/2002/12/cal/icaltzd#action> "AUDIO" 
<http://bob.example.com/> .
+_:node1clu27ji5x5 <http://www.w3.org/2002/12/cal/icaltzd#trigger> 
"1998-04-03T12:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu27ji5x5 <http://www.w3.org/2002/12/cal/icaltzd#attach> 
_:node1clu27ji5x6 <http://bob.example.com/> .
+_:node1clu27ji5x6 <http://www.w3.org/2002/12/cal/icaltzd#fmttype> 
"audio/basic" <http://bob.example.com/> .
+_:node1clu27ji5x6 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> 
<http://example.com/pub/audio-files/ssbanner.aud> <http://bob.example.com/> .
+_:node1clu27ji5x5 <http://www.w3.org/2002/12/cal/icaltzd#repeat> 
"4"^^<http://www.w3.org/2001/XMLSchema#int> <http://bob.example.com/> .
+_:node1clu27ji5x5 <http://www.w3.org/2002/12/cal/icaltzd#duration> 
"PT1H"^^<http://www.w3.org/2001/XMLSchema#duration> <http://bob.example.com/> .

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/test-resources/src/test/resources/calendar.text/rfc5545-example4.ics
----------------------------------------------------------------------
diff --git 
a/test-resources/src/test/resources/calendar.text/rfc5545-example4.ics 
b/test-resources/src/test/resources/calendar.text/rfc5545-example4.ics
new file mode 100755
index 0000000..18d53df
--- /dev/null
+++ b/test-resources/src/test/resources/calendar.text/rfc5545-example4.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//ABC Corporation//NONSGML My Product//EN
+BEGIN:VTODO
+DTSTAMP:19980130T134500Z
+SEQUENCE:2
+UID:[email protected]
+ORGANIZER:mailto:[email protected]
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:[email protected]
+DUE:19980415T000000
+STATUS:NEEDS-ACTION
+SUMMARY:Submit Income Taxes
+BEGIN:VALARM
+ACTION:AUDIO
+TRIGGER;VALUE=DATE-TIME:19980403T120000Z
+ATTACH;FMTTYPE=audio/basic:http://example.com/pub/audio-
+ files/ssbanner.aud
+REPEAT:4
+DURATION:PT1H
+END:VALARM
+END:VTODO
+END:VCALENDAR

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/test-resources/src/test/resources/calendar.text/rfc5545-example5-expected.nquads
----------------------------------------------------------------------
diff --git 
a/test-resources/src/test/resources/calendar.text/rfc5545-example5-expected.nquads
 
b/test-resources/src/test/resources/calendar.text/rfc5545-example5-expected.nquads
new file mode 100644
index 0000000..1fb93ed
--- /dev/null
+++ 
b/test-resources/src/test/resources/calendar.text/rfc5545-example5-expected.nquads
@@ -0,0 +1,30 @@
+#
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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.
+#
+
+_:node1clu28m86x2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Vcalendar> <http://bob.example.com/> .
+_:node1clu28m86x2 <http://www.w3.org/2002/12/cal/icaltzd#prodid> "-//ABC 
Corporation//NONSGML My Product//EN" <http://bob.example.com/> .
+_:node1clu28m86x2 <http://www.w3.org/2002/12/cal/icaltzd#component> 
_:node1clu28m86x3 <http://bob.example.com/> .
+_:node1clu28m86x3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Vjournal> <http://bob.example.com/> .
+_:node1clu28m86x3 <http://www.w3.org/2002/12/cal/icaltzd#dtstamp> 
"1997-03-24T12:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu28m86x3 <http://www.w3.org/2002/12/cal/icaltzd#uid> 
"[email protected]" <http://bob.example.com/> .
+_:node1clu28m86x3 <http://www.w3.org/2002/12/cal/icaltzd#organizer> 
<mailto:[email protected]> <http://bob.example.com/> .
+_:node1clu28m86x3 <http://www.w3.org/2002/12/cal/icaltzd#status> "DRAFT" 
<http://bob.example.com/> .
+_:node1clu28m86x3 <http://www.w3.org/2002/12/cal/icaltzd#class> "PUBLIC" 
<http://bob.example.com/> .
+_:node1clu28m86x3 <http://www.w3.org/2002/12/cal/icaltzd#categories> "Project 
Report" <http://bob.example.com/> .
+_:node1clu28m86x3 <http://www.w3.org/2002/12/cal/icaltzd#categories> "XYZ" 
<http://bob.example.com/> .
+_:node1clu28m86x3 <http://www.w3.org/2002/12/cal/icaltzd#categories> "Weekly 
Meeting" <http://bob.example.com/> .
+_:node1clu28m86x3 <http://www.w3.org/2002/12/cal/icaltzd#description> "Project 
xyz Review Meeting Minutes\nAgenda\n1. Review of project version 1.0 
requirements.\n2.Definitionof project processes.\n3. Review of project 
schedule.\nParticipants: John Smith, Jane Doe, Jim Dandy\n-It wasdecided that 
the requirements need to be signed off byproduct marketing.\n-Project processes 
were accepted.\n-Project schedule needs to account for scheduled holidaysand 
employee vacation time. Check with HR for specificdates.\n-New schedule will be 
distributed by Friday.\n-Next weeks meeting is cancelled. No meeting until 
3/23." <http://bob.example.com/> .

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/test-resources/src/test/resources/calendar.text/rfc5545-example5.ics
----------------------------------------------------------------------
diff --git 
a/test-resources/src/test/resources/calendar.text/rfc5545-example5.ics 
b/test-resources/src/test/resources/calendar.text/rfc5545-example5.ics
new file mode 100755
index 0000000..2dfa4a6
--- /dev/null
+++ b/test-resources/src/test/resources/calendar.text/rfc5545-example5.ics
@@ -0,0 +1,23 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//ABC Corporation//NONSGML My Product//EN
+BEGIN:VJOURNAL
+DTSTAMP:19970324T120000Z
+UID:[email protected]
+ORGANIZER:mailto:[email protected]
+STATUS:DRAFT
+CLASS:PUBLIC
+CATEGORIES:Project Report,XYZ,Weekly Meeting
+DESCRIPTION:Project xyz Review Meeting Minutes\n
+ Agenda\n1. Review of project version 1.0 requirements.\n2.
+ Definition
+ of project processes.\n3. Review of project schedule.\n
+ Participants: John Smith\, Jane Doe\, Jim Dandy\n-It was
+ decided that the requirements need to be signed off by
+ product marketing.\n-Project processes were accepted.\n
+ -Project schedule needs to account for scheduled holidays
+ and employee vacation time. Check with HR for specific
+ dates.\n-New schedule will be distributed by Friday.\n-
+ Next weeks meeting is cancelled. No meeting until 3/23.
+END:VJOURNAL
+END:VCALENDAR

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/test-resources/src/test/resources/calendar.text/rfc5545-example6-expected.nquads
----------------------------------------------------------------------
diff --git 
a/test-resources/src/test/resources/calendar.text/rfc5545-example6-expected.nquads
 
b/test-resources/src/test/resources/calendar.text/rfc5545-example6-expected.nquads
new file mode 100644
index 0000000..0425e4b
--- /dev/null
+++ 
b/test-resources/src/test/resources/calendar.text/rfc5545-example6-expected.nquads
@@ -0,0 +1,37 @@
+#
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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.
+#
+
+_:node1clu29scrx2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Vcalendar> <http://bob.example.com/> .
+_:node1clu29scrx2 <http://www.w3.org/2002/12/cal/icaltzd#prodid> "-//RDU 
Software//NONSGML HandCal//EN" <http://bob.example.com/> .
+_:node1clu29scrx2 <http://www.w3.org/2002/12/cal/icaltzd#component> 
_:node1clu29scrx3 <http://bob.example.com/> .
+_:node1clu29scrx3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Vfreebusy> <http://bob.example.com/> .
+_:node1clu29scrx3 <http://www.w3.org/2002/12/cal/icaltzd#organizer> 
<mailto:[email protected]> <http://bob.example.com/> .
+_:node1clu29scrx3 <http://www.w3.org/2002/12/cal/icaltzd#dtstart> 
"1998-03-13T14:17:11Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu29scrx3 <http://www.w3.org/2002/12/cal/icaltzd#dtend> 
"1998-04-10T14:17:11Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu29scrx3 <http://www.w3.org/2002/12/cal/icaltzd#freebusy> 
_:node1clu29scrx4 <http://bob.example.com/> .
+_:node1clu29scrx4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Value_PERIOD> <http://bob.example.com/> .
+_:node1clu29scrx4 <http://www.w3.org/2002/12/cal/icaltzd#dtstart> 
"1998-03-14T23:30:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu29scrx4 <http://www.w3.org/2002/12/cal/icaltzd#dtend> 
"1998-03-15T00:30:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu29scrx3 <http://www.w3.org/2002/12/cal/icaltzd#freebusy> 
_:node1clu29scrx5 <http://bob.example.com/> .
+_:node1clu29scrx5 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Value_PERIOD> <http://bob.example.com/> .
+_:node1clu29scrx5 <http://www.w3.org/2002/12/cal/icaltzd#dtstart> 
"1998-03-16T15:30:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu29scrx5 <http://www.w3.org/2002/12/cal/icaltzd#dtend> 
"1998-03-16T16:30:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu29scrx3 <http://www.w3.org/2002/12/cal/icaltzd#freebusy> 
_:node1clu29scrx6 <http://bob.example.com/> .
+_:node1clu29scrx6 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://www.w3.org/2002/12/cal/icaltzd#Value_PERIOD> <http://bob.example.com/> .
+_:node1clu29scrx6 <http://www.w3.org/2002/12/cal/icaltzd#dtstart> 
"1998-03-18T03:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu29scrx6 <http://www.w3.org/2002/12/cal/icaltzd#dtend> 
"1998-03-18T04:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> 
<http://bob.example.com/> .
+_:node1clu29scrx3 <http://www.w3.org/2002/12/cal/icaltzd#url> 
<http://www.example.com/calendar/busytime/jsmith.ifb> <http://bob.example.com/> 
.

http://git-wip-us.apache.org/repos/asf/any23/blob/19d85f2f/test-resources/src/test/resources/calendar.text/rfc5545-example6.ics
----------------------------------------------------------------------
diff --git 
a/test-resources/src/test/resources/calendar.text/rfc5545-example6.ics 
b/test-resources/src/test/resources/calendar.text/rfc5545-example6.ics
new file mode 100755
index 0000000..2623678
--- /dev/null
+++ b/test-resources/src/test/resources/calendar.text/rfc5545-example6.ics
@@ -0,0 +1,13 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//RDU Software//NONSGML HandCal//EN
+BEGIN:VFREEBUSY
+ORGANIZER:mailto:[email protected]
+DTSTART:19980313T141711Z
+DTEND:19980410T141711Z
+FREEBUSY:19980314T233000Z/19980315T003000Z
+FREEBUSY:19980316T153000Z/19980316T163000Z
+FREEBUSY:19980318T030000Z/19980318T040000Z
+URL:http://www.example.com/calendar/busytime/jsmith.ifb
+END:VFREEBUSY
+END:VCALENDAR

Reply via email to