marmotta-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ja...@apache.org
Subject [14/51] [abbrv] [partial] MARMOTTA-397: Reorganized and renamed Marmotta Sesame Tools
Date Wed, 08 Jan 2014 15:25:30 GMT
http://git-wip-us.apache.org/repos/asf/marmotta/blob/00c22e7c/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/main/java/org/apache/marmotta/commons/sesame/rio/vcard/VCardParser.java
----------------------------------------------------------------------
diff --git a/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/main/java/org/apache/marmotta/commons/sesame/rio/vcard/VCardParser.java b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/main/java/org/apache/marmotta/commons/sesame/rio/vcard/VCardParser.java
new file mode 100644
index 0000000..e24ef98
--- /dev/null
+++ b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/main/java/org/apache/marmotta/commons/sesame/rio/vcard/VCardParser.java
@@ -0,0 +1,478 @@
+/**
+ * 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.marmotta.commons.sesame.rio.vcard;
+
+import com.google.common.base.Preconditions;
+import net.fortuna.ical4j.data.ParserException;
+import net.fortuna.ical4j.util.CompatibilityHints;
+import net.fortuna.ical4j.vcard.Parameter;
+import net.fortuna.ical4j.vcard.Property;
+import net.fortuna.ical4j.vcard.VCard;
+import net.fortuna.ical4j.vcard.VCardBuilder;
+import net.fortuna.ical4j.vcard.parameter.Type;
+import net.fortuna.ical4j.vcard.property.*;
+
+import org.apache.marmotta.commons.sesame.rio.vcard.VCardFormat;
+import org.openrdf.model.Literal;
+import org.openrdf.model.Resource;
+import org.openrdf.model.URI;
+import org.openrdf.model.ValueFactory;
+import org.openrdf.rio.RDFFormat;
+import org.openrdf.rio.RDFHandlerException;
+import org.openrdf.rio.RDFParseException;
+import org.openrdf.rio.helpers.RDFParserBase;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * A parser for parsing VCard files into RDF. Uses the vcard vocabulary (http://www.w3.org/2006/vcard/ns) for
+ * representing properties.
+ * <p/>
+ * Ontology documentation: http://www.w3.org/2006/vcard/ns-2006.html#Name
+ * <p/>
+ * Author: Sebastian Schaffert
+ */
+public class VCardParser extends RDFParserBase {
+
+    private static Logger log = LoggerFactory.getLogger(VCardParser.class);
+
+    public static final String NS_RDF    = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+    public static final String NS_VCARD  = "http://www.w3.org/2006/vcard/ns#";
+
+    private static Map<Property.Id, String> propertyMappings = new HashMap<Property.Id, String>();
+    static {
+        propertyMappings.put(Property.Id.ADR,      "http://www.w3.org/2006/vcard/ns#adr");
+        propertyMappings.put(Property.Id.AGENT,    "http://www.w3.org/2006/vcard/ns#agent");
+        propertyMappings.put(Property.Id.BDAY,     "http://www.w3.org/2006/vcard/ns#bday");
+        propertyMappings.put(Property.Id.CATEGORIES, "http://www.w3.org/2006/vcard/ns#category");
+        propertyMappings.put(Property.Id.CLASS,    "http://www.w3.org/2006/vcard/ns#class");
+        propertyMappings.put(Property.Id.EMAIL,    "http://www.w3.org/2006/vcard/ns#email");
+        propertyMappings.put(Property.Id.EXTENDED, "http://www.w3.org/2006/vcard/ns#extended-address");
+        propertyMappings.put(Property.Id.FN,       "http://www.w3.org/2006/vcard/ns#fn");
+        propertyMappings.put(Property.Id.GEO,      "http://www.w3.org/2006/vcard/ns#geo");
+        propertyMappings.put(Property.Id.KEY,      "http://www.w3.org/2006/vcard/ns#key");
+        propertyMappings.put(Property.Id.LABEL,    "http://www.w3.org/2006/vcard/ns#label");
+        propertyMappings.put(Property.Id.LOGO,     "http://www.w3.org/2006/vcard/ns#logo");
+        propertyMappings.put(Property.Id.N,        "http://www.w3.org/2006/vcard/ns#n");
+        propertyMappings.put(Property.Id.NICKNAME, "http://www.w3.org/2006/vcard/ns#nickname");
+        propertyMappings.put(Property.Id.NOTE,     "http://www.w3.org/2006/vcard/ns#note");
+        propertyMappings.put(Property.Id.ORG,      "http://www.w3.org/2006/vcard/ns#org");
+        propertyMappings.put(Property.Id.PHOTO,    "http://www.w3.org/2006/vcard/ns#photo");
+        propertyMappings.put(Property.Id.PRODID,   "http://www.w3.org/2006/vcard/ns#prodid");
+        propertyMappings.put(Property.Id.REV,      "http://www.w3.org/2006/vcard/ns#rev");
+        propertyMappings.put(Property.Id.ROLE,     "http://www.w3.org/2006/vcard/ns#role");
+        propertyMappings.put(Property.Id.SORT_STRING,"http://www.w3.org/2006/vcard/ns#sort-string");
+        propertyMappings.put(Property.Id.SOUND,    "http://www.w3.org/2006/vcard/ns#sound");
+        propertyMappings.put(Property.Id.TEL,      "http://www.w3.org/2006/vcard/ns#tel");
+        propertyMappings.put(Property.Id.TITLE,    "http://www.w3.org/2006/vcard/ns#title");
+        propertyMappings.put(Property.Id.TZ,       "http://www.w3.org/2006/vcard/ns#tz");
+        propertyMappings.put(Property.Id.UID,      "http://www.w3.org/2006/vcard/ns#uid");
+        propertyMappings.put(Property.Id.URL,      "http://www.w3.org/2006/vcard/ns#url");
+
+    }
+
+    /**
+     * Creates a new RDFParserBase that will use a {@link org.openrdf.model.impl.ValueFactoryImpl} to
+     * create RDF model objects.
+     */
+    public VCardParser() {
+        CompatibilityHints.setHintEnabled(CompatibilityHints.KEY_RELAXED_PARSING,true);
+    }
+
+    /**
+     * Creates a new RDFParserBase that will use the supplied ValueFactory to
+     * create RDF model objects.
+     *
+     * @param valueFactory A ValueFactory.
+     */
+    public VCardParser(ValueFactory valueFactory) {
+        super(valueFactory);
+        CompatibilityHints.setHintEnabled(CompatibilityHints.KEY_RELAXED_PARSING,true);
+    }
+
+
+    /**
+     * Gets the RDF format that this parser can parse.
+     */
+    @Override
+    public RDFFormat getRDFFormat() {
+        return VCardFormat.FORMAT;
+    }
+
+    /**
+     * Parses the data from the supplied InputStream, using the supplied baseURI
+     * to resolve any relative URI references.
+     *
+     * @param in      The InputStream from which to read the data.
+     * @param baseURI The URI associated with the data in the InputStream.
+     * @throws java.io.IOException If an I/O error occurred while data was read from the InputStream.
+     * @throws org.openrdf.rio.RDFParseException
+     *                             If the parser has found an unrecoverable parse error.
+     * @throws org.openrdf.rio.RDFHandlerException
+     *                             If the configured statement handler has encountered an
+     *                             unrecoverable error.
+     */
+    @Override
+    public void parse(InputStream in, String baseURI) throws IOException, RDFParseException, RDFHandlerException {
+        Preconditions.checkNotNull(baseURI);
+
+        setBaseURI(baseURI);
+        try {
+            for(VCard card : new VCardBuilder(in).buildAll()) {
+                parseVCard(card);
+            }
+        } catch (ParserException e) {
+            throw new RDFParseException(e);
+        }
+    }
+
+    /**
+     * Parses the data from the supplied Reader, using the supplied baseURI to
+     * resolve any relative URI references.
+     *
+     * @param reader  The Reader from which to read the data.
+     * @param baseURI The URI associated with the data in the InputStream.
+     * @throws java.io.IOException If an I/O error occurred while data was read from the InputStream.
+     * @throws org.openrdf.rio.RDFParseException
+     *                             If the parser has found an unrecoverable parse error.
+     * @throws org.openrdf.rio.RDFHandlerException
+     *                             If the configured statement handler has encountered an
+     *                             unrecoverable error.
+     */
+    @Override
+    public void parse(Reader reader, String baseURI) throws IOException, RDFParseException, RDFHandlerException {
+        Preconditions.checkNotNull(baseURI);
+
+        setBaseURI(baseURI);
+        try {
+            for(VCard card : new VCardBuilder(reader).buildAll()) {
+                parseVCard(card);
+            }
+        } catch (ParserException e) {
+            throw new RDFParseException(e);
+        }
+    }
+
+    private void parseVCard(VCard vCard) throws RDFHandlerException, RDFParseException {
+        URI uri;
+
+        // create uri for resource representing the vcard based on the UID if present or on a random UUID
+        if(vCard.getProperty(Property.Id.UID) != null) {
+            uri = resolveURI(vCard.getProperty(Property.Id.UID).getValue());
+        } else {
+            uri = resolveURI(UUID.randomUUID().toString());
+        }
+        Resource t_vcard = createURI(NS_VCARD + "VCard");
+        URI p_type       = createURI(NS_RDF + "type");
+        rdfHandler.handleStatement(createStatement(uri,p_type,t_vcard));
+
+        for(Property p : vCard.getProperties()) {
+            if(propertyMappings.containsKey(p.getId())) {
+                URI prop =  createURI(propertyMappings.get(p.getId()));
+
+                switch (p.getId()) {
+                    case ADR:
+                        createAddress(uri,prop,(Address)p);
+                        break;
+                    case AGENT:
+                        // distinguish text and uri agents
+                        createAgent(uri,prop,(Agent)p);
+                        break;
+                    case CATEGORIES:
+                        for(String category : p.getValue().split(",")) {
+                            Literal literal = createLiteral(category,null,null);
+                            rdfHandler.handleStatement(createStatement(uri, prop, literal));
+                        }
+                        break;
+                    case EMAIL:
+                        URI email = createURI("mailto:"+p.getValue());
+                        rdfHandler.handleStatement(createStatement(uri,prop,email));
+                        break;
+                    case GEO:
+                        createLocation(uri,prop,(Geo)p);
+                        break;
+                    case LOGO:
+                        createLogo(uri,prop,(Logo)p);
+                        break;
+                    case N:
+                        createName(uri,prop,(N)p);
+                        break;
+                    case ORG:
+                        createOrganization(uri,prop,(Org)p);
+                        break;
+                    case PHOTO:
+                        createPhoto(uri, prop, (Photo) p);
+                        break;
+                    case SOUND:
+                        createSound(uri, prop, (Sound) p);
+                        break;
+                    case TEL:
+                        createTel(uri, prop, (Telephone) p);
+                        break;
+                    case URL:
+                        URI url = createURI(p.getValue());
+                        rdfHandler.handleStatement(createStatement(uri,prop,url));
+                        break;
+
+                    default:
+                        Literal literal = createLiteral(p.getValue(),null,null);
+                        rdfHandler.handleStatement(createStatement(uri, prop, literal));
+                }
+            } else {
+                log.warn("unknown property type {} with value {} not added to RDF representation",p.getId(), p.getValue());
+            }
+        }
+    }
+
+
+    private void createAddress(URI uri, URI prop, Address adr) throws RDFHandlerException, RDFParseException {
+        Resource r_adr = createBNode();
+        Resource t_adr = createURI(NS_VCARD + "Address");
+        URI p_type     = createURI(NS_RDF + "type");
+        rdfHandler.handleStatement(createStatement(r_adr,p_type,t_adr));
+
+        if(adr.getCountry() != null) {
+            URI p_country = createURI(NS_VCARD + "country-name");
+            Literal v_country = createLiteral(adr.getCountry(),null,null);
+            rdfHandler.handleStatement(createStatement(r_adr,p_country,v_country));
+        }
+
+        if(adr.getExtended() != null && !"".equals(adr.getExtended().trim())) {
+            URI p_ext = createURI(NS_VCARD + "extended-address");
+            Literal v_ext = createLiteral(adr.getExtended(),null,null);
+            rdfHandler.handleStatement(createStatement(r_adr,p_ext,v_ext));
+        }
+
+        if(adr.getLocality() != null && !"".equals(adr.getLocality().trim())) {
+            URI p_locality = createURI(NS_VCARD + "locality");
+            Literal v_locality = createLiteral(adr.getLocality(),null,null);
+            rdfHandler.handleStatement(createStatement(r_adr,p_locality,v_locality));
+        }
+
+        if(adr.getPoBox() != null && !"".equals(adr.getPoBox().trim())) {
+            URI p_pobox = createURI(NS_VCARD + "post-office-box");
+            Literal v_pobox = createLiteral(adr.getPoBox(),null,null);
+            rdfHandler.handleStatement(createStatement(r_adr,p_pobox,v_pobox));
+        }
+
+        if(adr.getPostcode() != null  && !"".equals(adr.getPostcode().trim())) {
+            URI p_postcode = createURI(NS_VCARD + "postal-code");
+            Literal v_postcode = createLiteral(adr.getPostcode(),null,null);
+            rdfHandler.handleStatement(createStatement(r_adr,p_postcode,v_postcode));
+        }
+
+        if(adr.getRegion() != null && !"".equals(adr.getRegion().trim())) {
+            URI p_region = createURI(NS_VCARD + "region");
+            Literal v_region = createLiteral(adr.getRegion(),null,null);
+            rdfHandler.handleStatement(createStatement(r_adr,p_region,v_region));
+        }
+
+        if(adr.getStreet() != null) {
+            URI p_street = createURI(NS_VCARD + "street-address");
+            Literal v_street = createLiteral(adr.getStreet(),null,null);
+            rdfHandler.handleStatement(createStatement(r_adr,p_street,v_street));
+        }
+
+
+
+
+        if(adr.getParameter(Parameter.Id.TYPE) != null) {
+            Type type = (Type)adr.getParameter(Parameter.Id.TYPE);
+            for(String value : type.getTypes()) {
+                if("HOME".equals(value)) {
+                    URI p_home = createURI(NS_VCARD + "homeAdr");
+                    rdfHandler.handleStatement(createStatement(uri,p_home,r_adr));
+                } else if("WORK".equals(value)) {
+                    URI p_work = createURI(NS_VCARD + "workAdr");
+                    rdfHandler.handleStatement(createStatement(uri,p_work,r_adr));
+                } else {
+                    rdfHandler.handleStatement(createStatement(uri,prop,r_adr));
+                }
+                break; // only first one
+            }
+        } else {
+            rdfHandler.handleStatement(createStatement(uri,prop,r_adr));
+        }
+    }
+
+
+    private void createAgent(URI uri, URI prop, Agent agent) throws RDFHandlerException, RDFParseException {
+        if(agent.getUri() != null) {
+            URI r_agent = createURI(agent.getUri().toString());
+            rdfHandler.handleStatement(createStatement(uri,prop,r_agent));
+        } else {
+            log.warn("ignoring agent relation, since agent cannot be resolved");
+        }
+    }
+
+    private void createLocation(URI uri, URI prop, Geo geo) throws RDFHandlerException, RDFParseException {
+        Resource r_location = createBNode();
+        Resource t_adr = createURI(NS_VCARD + "Location");
+        URI p_type     = createURI(NS_RDF + "type");
+        rdfHandler.handleStatement(createStatement(r_location,p_type,t_adr));
+
+        URI p_latitute = createURI(NS_VCARD+"latitude");
+        URI p_longitude = createURI(NS_VCARD+"longitude");
+        URI t_decimal   = createURI("http://www.w3.org/2001/XMLSchema#double");
+
+        Literal v_latitude = createLiteral(geo.getLatitude().toPlainString(),null,t_decimal);
+        Literal v_longitude = createLiteral(geo.getLongitude().toPlainString(), null, t_decimal);
+
+        rdfHandler.handleStatement(createStatement(r_location,p_latitute,v_latitude));
+        rdfHandler.handleStatement(createStatement(r_location,p_longitude,v_longitude));
+        rdfHandler.handleStatement(createStatement(uri,prop,r_location));
+    }
+
+
+    private void createLogo(URI uri, URI prop, Logo logo) throws RDFHandlerException, RDFParseException {
+        if(logo.getUri() != null) {
+            URI r_logo = createURI(logo.getUri().toString());
+            rdfHandler.handleStatement(createStatement(uri,prop,r_logo));
+        } else {
+            log.warn("ignoring logo relation, since binary logos are not supported in RDF");
+        }
+    }
+
+
+    private void createName(URI uri, URI prop, N name) throws RDFHandlerException, RDFParseException {
+        Resource r_name = createBNode();
+        Resource t_name = createURI(NS_VCARD + "Name");
+        URI p_type      = createURI(NS_RDF + "type");
+        rdfHandler.handleStatement(createStatement(r_name,p_type,t_name));
+
+        if(name.getFamilyName() != null) {
+            URI p_family_name = createURI(NS_VCARD + "family-name");
+            Literal v_family_name = createLiteral(name.getFamilyName(),null,null);
+            rdfHandler.handleStatement(createStatement(r_name,p_family_name,v_family_name));
+        }
+
+        if(name.getGivenName() != null) {
+            URI p_given_name = createURI(NS_VCARD + "given-name");
+            Literal v_given_name = createLiteral(name.getGivenName(),null,null);
+            rdfHandler.handleStatement(createStatement(r_name,p_given_name,v_given_name));
+        }
+
+        if(name.getAdditionalNames() != null && name.getAdditionalNames().length > 0) {
+            URI p_additional_name = createURI(NS_VCARD + "additional-name");
+            for(String additionalName : name.getAdditionalNames()) {
+                if(!"".equals(additionalName)) {
+                    Literal v_additional_name = createLiteral(additionalName,null,null);
+                    rdfHandler.handleStatement(createStatement(r_name,p_additional_name,v_additional_name));
+                }
+            }
+        }
+
+        if(name.getPrefixes() != null && name.getPrefixes().length > 0) {
+            URI p_prefix = createURI(NS_VCARD + "honorific-prefix");
+            for(String namePrefix : name.getPrefixes()) {
+                if(!"".equals(namePrefix)) {
+                    Literal v_prefix = createLiteral(namePrefix,null,null);
+                    rdfHandler.handleStatement(createStatement(r_name,p_prefix,v_prefix));
+                }
+            }
+        }
+
+        if(name.getSuffixes() != null && name.getSuffixes().length > 0) {
+            URI p_suffix = createURI(NS_VCARD + "honorific-suffix");
+            for(String nameSuffix : name.getSuffixes()) {
+                if(!"".equals(nameSuffix)) {
+                    Literal v_suffix = createLiteral(nameSuffix,null,null);
+                    rdfHandler.handleStatement(createStatement(r_name,p_suffix,v_suffix));
+                }
+            }
+        }
+
+        rdfHandler.handleStatement(createStatement(uri,prop,r_name));
+    }
+
+
+    private void createOrganization(URI uri, URI prop, Org org) throws RDFHandlerException, RDFParseException {
+        for(String orgName : org.getValues()) {
+            Resource r_name = createBNode();
+            Resource t_org = createURI(NS_VCARD + "Organization");
+            URI p_type     = createURI(NS_RDF + "type");
+            rdfHandler.handleStatement(createStatement(r_name,p_type,t_org));
+
+            URI p_name = createURI(NS_VCARD + "organization-name");
+            Literal v_name = createLiteral(orgName,null,null);
+
+            rdfHandler.handleStatement(createStatement(r_name,p_name,v_name));
+            rdfHandler.handleStatement(createStatement(uri,prop,r_name));
+        }
+    }
+
+
+    private void createPhoto(URI uri, URI prop, Photo photo) throws RDFHandlerException, RDFParseException {
+        if(photo.getUri() != null) {
+            URI r_logo = createURI(photo.getUri().toString());
+            rdfHandler.handleStatement(createStatement(uri,prop,r_logo));
+        } else {
+            log.warn("ignoring photo relation, since binary photos are not supported in RDF");
+        }
+    }
+
+    private void createSound(URI uri, URI prop, Sound sound) throws RDFHandlerException, RDFParseException {
+        if(sound.getUri() != null) {
+            URI r_logo = createURI(sound.getUri().toString());
+            rdfHandler.handleStatement(createStatement(uri,prop,r_logo));
+        } else {
+            log.warn("ignoring photo relation, since binary photos are not supported in RDF");
+        }
+    }
+
+
+    private void createTel(URI uri, URI prop, Telephone telephone) throws RDFHandlerException, RDFParseException {
+        URI r_tel;
+
+        if(telephone.getUri() != null) {
+            r_tel = createURI(telephone.getUri().toString());
+        } else {
+            r_tel = createURI("tel:"+telephone.getValue());
+        }
+
+        if(telephone.getParameter(Parameter.Id.TYPE) != null) {
+            Type type = (Type)telephone.getParameter(Parameter.Id.TYPE);
+            for(String value : type.getTypes()) {
+                if("HOME".equals(value)) {
+                    URI p_home = createURI(NS_VCARD + "homeTel");
+                    rdfHandler.handleStatement(createStatement(uri,p_home,r_tel));
+                } else if("WORK".equals(value)) {
+                    URI p_work = createURI(NS_VCARD + "workTel");
+                    rdfHandler.handleStatement(createStatement(uri,p_work,r_tel));
+                } else if("CELL".equals(value)) {
+                    URI p_work = createURI(NS_VCARD + "mobileTel");
+                    rdfHandler.handleStatement(createStatement(uri,p_work,r_tel));
+                } else {
+                    rdfHandler.handleStatement(createStatement(uri,prop,r_tel));
+                }
+                break; // only first one
+            }
+
+        } else {
+            rdfHandler.handleStatement(createStatement(uri,prop,r_tel));
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/00c22e7c/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/main/java/org/apache/marmotta/commons/sesame/rio/vcard/VCardParserFactory.java
----------------------------------------------------------------------
diff --git a/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/main/java/org/apache/marmotta/commons/sesame/rio/vcard/VCardParserFactory.java b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/main/java/org/apache/marmotta/commons/sesame/rio/vcard/VCardParserFactory.java
new file mode 100644
index 0000000..1851adb
--- /dev/null
+++ b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/main/java/org/apache/marmotta/commons/sesame/rio/vcard/VCardParserFactory.java
@@ -0,0 +1,47 @@
+/**
+ * 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.marmotta.commons.sesame.rio.vcard;
+
+import org.apache.marmotta.commons.sesame.rio.vcard.VCardFormat;
+import org.openrdf.rio.RDFFormat;
+import org.openrdf.rio.RDFParser;
+import org.openrdf.rio.RDFParserFactory;
+
+/**
+ * Add file description here!
+ * <p/>
+ * Author: Sebastian Schaffert
+ */
+public class VCardParserFactory implements RDFParserFactory {
+    /**
+     * Returns the RDF format for this factory.
+     */
+    @Override
+    public RDFFormat getRDFFormat() {
+        return VCardFormat.FORMAT;
+    }
+
+    /**
+     * Returns a RDFParser instance.
+     */
+    @Override
+    public RDFParser getParser() {
+        return new VCardParser();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/00c22e7c/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/main/resources/META-INF/services/org.openrdf.rio.RDFParserFactory
----------------------------------------------------------------------
diff --git a/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/main/resources/META-INF/services/org.openrdf.rio.RDFParserFactory b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/main/resources/META-INF/services/org.openrdf.rio.RDFParserFactory
new file mode 100644
index 0000000..f7363b5
--- /dev/null
+++ b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/main/resources/META-INF/services/org.openrdf.rio.RDFParserFactory
@@ -0,0 +1 @@
+org.apache.marmotta.commons.sesame.rio.vcard.VCardParserFactory
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/marmotta/blob/00c22e7c/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/java/org/apache/marmotta/commons/sesame/rio/vcard/TestVCardParser.java
----------------------------------------------------------------------
diff --git a/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/java/org/apache/marmotta/commons/sesame/rio/vcard/TestVCardParser.java b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/java/org/apache/marmotta/commons/sesame/rio/vcard/TestVCardParser.java
new file mode 100644
index 0000000..aab8242
--- /dev/null
+++ b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/java/org/apache/marmotta/commons/sesame/rio/vcard/TestVCardParser.java
@@ -0,0 +1,104 @@
+/**
+ * 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.marmotta.commons.sesame.rio.vcard;
+
+import static java.util.Arrays.asList;
+import static org.hamcrest.CoreMatchers.everyItem;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeThat;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.marmotta.commons.sesame.rio.vcard.VCardFormat;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.openrdf.query.BooleanQuery;
+import org.openrdf.query.QueryLanguage;
+import org.openrdf.repository.Repository;
+import org.openrdf.repository.RepositoryConnection;
+import org.openrdf.repository.sail.SailRepository;
+import org.openrdf.sail.memory.MemoryStore;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.aduna.iteration.Iterations;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * Add file description here!
+ * <p/>
+ * Author: Sebastian Schaffert
+ */
+@RunWith(Parameterized.class)
+public class TestVCardParser {
+
+    private static Logger log = LoggerFactory.getLogger(TestVCardParser.class);
+
+    private String fileName;
+
+    public TestVCardParser(String fileName) {
+        this.fileName = fileName;
+    }
+
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<Object[]> data() {
+        ArrayList<Object[]> list = new ArrayList<Object[]>();
+        list.add(new Object[] { "vcard-vCards-SAP" });
+        list.add(new Object[] { "Frank_Dawson" });
+        return list;
+    }
+
+
+
+    @Test
+    public void runTest() throws Exception {
+        log.info("running test {} ...", fileName);
+
+        InputStream vcard = this.getClass().getResourceAsStream(fileName+".vcf");
+        InputStream sparql = this.getClass().getResourceAsStream(fileName+".sparql");
+        assumeThat("Could not load testfiles", asList(vcard, sparql), everyItem(notNullValue(InputStream.class)));
+
+        Repository repository = new SailRepository(new MemoryStore());
+        repository.initialize();
+
+        RepositoryConnection connection = repository.getConnection();
+        try {
+            connection.add(vcard,"http://localhost/vcard/", VCardFormat.FORMAT);
+            connection.commit();
+        } catch(Exception ex) {
+            ex.printStackTrace();
+            fail("parsing "+fileName+" failed!");
+        }
+        assertTrue(connection.size() > 0);
+
+        int count = Iterations.asList(connection.getStatements(null, null, null, false)).size();
+        assertTrue(count > 0);
+
+        BooleanQuery sparqlQuery = (BooleanQuery)connection.prepareQuery(QueryLanguage.SPARQL, IOUtils.toString(sparql).replaceAll("http://rdfa.digitalbazaar.com/test-suite/test-cases/xhtml1/rdfa1.1/","http://localhost/rdfa/"));
+        assertTrue("SPARQL query evaluation for "+fileName+" failed",sparqlQuery.evaluate());
+
+        connection.close();
+        repository.shutDown();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/00c22e7c/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/logback.xml
----------------------------------------------------------------------
diff --git a/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/logback.xml b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/logback.xml
new file mode 100644
index 0000000..1bfecff
--- /dev/null
+++ b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/logback.xml
@@ -0,0 +1,27 @@
+<!--
+  ~ 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.
+  -->
+
+<configuration>
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} %highlight(%level) %cyan(%logger{15}) - %m%n</pattern>
+        </encoder>
+    </appender>
+    <root level="${root-level:-INFO}">
+        <appender-ref ref="CONSOLE"/>
+    </root>
+</configuration>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/marmotta/blob/00c22e7c/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/4b62872a-849-0.vcf
----------------------------------------------------------------------
diff --git a/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/4b62872a-849-0.vcf b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/4b62872a-849-0.vcf
new file mode 100644
index 0000000..e5f5f76
--- /dev/null
+++ b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/4b62872a-849-0.vcf
@@ -0,0 +1,15 @@
+begin:vcard
+n:Branntwein;Franz;M.;Herr;
+title:
+fn:
+org:
+adr;charset=UTF-8:;Medizinstraße 4711;;Köln;Nordrhein-Westfalen;50441;Deutschland
+tel;home:0221 12345678
+tel;work:
+tel;fax:
+tel;cell:
+email;internet:franz.m.branntwein@example.com
+VERSION:2.1
+UID:4b62872a-849-0
+end:vcard
+

http://git-wip-us.apache.org/repos/asf/marmotta/blob/00c22e7c/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Denis_Hennessy.vcf
----------------------------------------------------------------------
diff --git a/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Denis_Hennessy.vcf b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Denis_Hennessy.vcf
new file mode 100644
index 0000000..c72b6e5
--- /dev/null
+++ b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Denis_Hennessy.vcf
@@ -0,0 +1,12 @@
+BEGIN:VCARD
+VERSION:3.0
+N:Hennessy;Denis
+FN:Denis Hennessy
+ORG:ISOCOR
+ADR;TYPE=WORK,POSTAL,PARCEL:;;42-47 Lower Mount St;
+ Dublin 2;Ireland
+TEL;TYPE=WORK,MSG:+353-1-676-0366
+TEL;TYPE=WORK,FAX:+353-1-676-0856
+EMAIL;TYPE=INTERNET:denis.hennessy@isocor.com
+CALADRURI:MAILTO:denis.hennessy@isocor.com
+END:VCARD

http://git-wip-us.apache.org/repos/asf/marmotta/blob/00c22e7c/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Frank_Dawson.sparql
----------------------------------------------------------------------
diff --git a/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Frank_Dawson.sparql b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Frank_Dawson.sparql
new file mode 100644
index 0000000..f18e386
--- /dev/null
+++ b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Frank_Dawson.sparql
@@ -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.
+#
+ASK {
+	?x <http://www.w3.org/2006/vcard/ns#fn> "Frank Dawson" .
+	?x <http://www.w3.org/2006/vcard/ns#n> ?y .
+	?y <http://www.w3.org/2006/vcard/ns#given-name> "Frank" .
+	?y <http://www.w3.org/2006/vcard/ns#family-name> "Dawson" .
+	?x <http://www.w3.org/2006/vcard/ns#workTel> <tel:+1-919-676-9515> .
+	?x <http://www.w3.org/2006/vcard/ns#org> ?org .
+	?org <http://www.w3.org/2006/vcard/ns#organization-name> "Lotus Development Corporation"
+}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/00c22e7c/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Frank_Dawson.vcf
----------------------------------------------------------------------
diff --git a/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Frank_Dawson.vcf b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Frank_Dawson.vcf
new file mode 100644
index 0000000..7f64de2
--- /dev/null
+++ b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Frank_Dawson.vcf
@@ -0,0 +1,13 @@
+BEGIN:VCARD
+VERSION:3.0
+N:Dawson;Frank
+FN:Frank Dawson
+ORG:Lotus Development Corporation
+ADR;TYPE=WORK,POSTAL,PARCEL:;;6544 Battleford Drive;
+ Raleigh;NC;27613-3502;USA
+TEL;TYPE=WORK,MSG:+1-919-676-9515
+TEL;TYPE=WORK,FAX:+1-919-676-9564
+EMAIL;TYPE=PREF,INTERNET:Frank_Dawson@Lotus.com
+EMAIL;TYPE=INTERNET:fdawson@earthlink.net
+URL:http://home.earthlink.net/~fdawson
+END:VCARD

http://git-wip-us.apache.org/repos/asf/marmotta/blob/00c22e7c/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Simon_Perreault.vcf
----------------------------------------------------------------------
diff --git a/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Simon_Perreault.vcf b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Simon_Perreault.vcf
new file mode 100644
index 0000000..7f8c334
--- /dev/null
+++ b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Simon_Perreault.vcf
@@ -0,0 +1,17 @@
+BEGIN:VCARD
+VERSION:4.0
+FN:Simon Perreault
+N:Perreault;Simon;;;ing. jr.,M.Sc.
+BDAY:1983-02-03
+GENDER:M
+WORK.ORG:Viagenie
+WORK.ADR:;;2600 boul. Laurier\, suite 625;
+ Quebec;QC;G1V 4W1;Canada
+WORK.TEL;TYPE=voice;PREF=1:tel:+1-418-656-9254;ext=102
+WORK.TEL;TYPE=cell,voice,video,text:tel:+1-418-262-6501
+WORK.TEL;TYPE=fax:tel:+1-418-656-9257
+WORK.EMAIL;TYPE=internet:simon.perreault@viagenie.ca
+WORK.GEO:46.772673,-71.282945
+WORK.KEY;VALUE=uri:http://www.viagenie.ca/simon.perreault/simon.asc
+CLASS:PUBLIC
+END:VCARD

http://git-wip-us.apache.org/repos/asf/marmotta/blob/00c22e7c/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Simon_Perreault_03.vcf
----------------------------------------------------------------------
diff --git a/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Simon_Perreault_03.vcf b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Simon_Perreault_03.vcf
new file mode 100644
index 0000000..8dca98c
--- /dev/null
+++ b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Simon_Perreault_03.vcf
@@ -0,0 +1,16 @@
+BEGIN:VCARD
+VERSION:4.0
+FN:Simon Perreault
+N:Perreault;Simon;;;ing. jr.,M.Sc.
+BDAY:1983-02-03
+GENDER:M
+ORG:Viagenie
+ADR;TYPE=work:;;2600 boul. Laurier\, suite 625;
+ Quebec;QC;G1V 4W1;Canada
+TEL;TYPE=voice,work:tel:+1-418-656-9254;ext=102
+TEL;TYPE=fax,work:tel:+1-418-656-9257
+EMAIL;TYPE=internet,work:simon.perreault@viagenie.ca
+GEO:46.772673,-71.282945
+CLASS:PUBLIC
+KEY;VALUE=uri:http://www.viagenie.ca/simon.perreault/simon.asc
+END:VCARD

http://git-wip-us.apache.org/repos/asf/marmotta/blob/00c22e7c/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Tony_Small.vcf
----------------------------------------------------------------------
diff --git a/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Tony_Small.vcf b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Tony_Small.vcf
new file mode 100644
index 0000000..9ebad8b
--- /dev/null
+++ b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/Tony_Small.vcf
@@ -0,0 +1,12 @@
+BEGIN:VCARD
+VERSION:3.0
+N:Small;Tony
+FN:Tony Small
+ORG:XpertSite.Com
+ADR;TYPE=WORK,POSTAL,PARCEL:;;4700 42nd Ave. SW, Suite 440;
+ Seattle;WA;98116;USA
+TEL;TYPE=WORK,MSG:+1-206-937-9972
+TEL;TYPE=WORK,FAX:+1-206-936-7329
+EMAIL;TYPE=INTERNET:tony@xpertsite.com
+CALADRURI:MAILTO:tony@xpertsite.com
+END:VCARD

http://git-wip-us.apache.org/repos/asf/marmotta/blob/00c22e7c/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/vcard-antoni-cardpicture.vcf
----------------------------------------------------------------------
diff --git a/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/vcard-antoni-cardpicture.vcf b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/vcard-antoni-cardpicture.vcf
new file mode 100644
index 0000000..fb8b8c6
--- /dev/null
+++ b/commons/marmotta-sesame-tools/marmotta-rio-vcard/src/test/resources/org/apache/marmotta/commons/sesame/rio/vcard/vcard-antoni-cardpicture.vcf
@@ -0,0 +1,367 @@
+BEGIN:VCARD
+VERSION:2.1
+N;LANGUAGE=en-us:Mylka;Antoni
+FN:Antoni Mylka
+ORG:AM Services;Police
+TEL;WORK;VOICE:(043) 7245-7234
+TEL;CELL;VOICE:0634 272 451
+TEL;WORK;FAX:(012) 7234-8012
+ADR;WORK;PREF:;;;;;;Poland
+X-MS-OL-DEFAULT-POSTAL-ADDRESS:2
+EMAIL;PREF;INTERNET:antoni@amservices.pl
+X-MS-CARDPICTURE;TYPE=JPEG;ENCODING=BASE64:
+ /9j/4AAQSkZJRgABAQIAAAAAAAD/2wBDAAEBAQEBAQ
+ EBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA
+ QH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
+ AQEBAQEBAQEBAQEBAQH/wAARCACMAHQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAE
+ CAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0
+ KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc
+ 3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW
+ 19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQo
+ L/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYn
+ LRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g
+ oOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk
+ 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+wmKznneaOO9mt5LdtksqeZuuW3MPMkxLG+7
+ fHu+bzG3SHB8zasjYreWaGS5juZII4t2+2Td5c3lpvbftkUfvI2aM7o2+Uc7k8zy2La2UxaO5uf
+ KjgOy2fzoY/OjOV37nDJJwsbZjYL83PyNvjRYLWZTPPN5V1FnyYfMjTzCn7yP93IvmPvkLplGG7
+ GBhwqy+q1e+mt6f29dl/XbXU9uz1bWt4fbb6LRfiSfZ5fs/2wXMnkd7L5vK++Ij0kKffCS8xD5s
+ bsHy2djROkKXLTO8MrFEtDu8qIqXG9csVySkh4iUZkfDFt4pPItdn2rzv9O/59vMj9fL/wBSVE3
+ +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
+
+X-MS-OL-DESIGN;CHARSET=utf-8:<card xmlns="http://schemas.microsoft.com/office/outlook/12/electronicbusinesscards" ver="1.0" layout="left" bgcolor="ffffff"><img xmlns="" align="tleft" area="25" use="cardpicture"/><fld xmlns="" prop="name" align="left" dir="ltr" style="bi" color="a00000" size="10"/><fld xmlns="" prop="org" align="left" dir="ltr" style="bi" color="a00000" size="8"/><fld xmlns="" prop="dept" align="left" dir="ltr" style="b" color="a00000" size="8"/><fld xmlns="" prop="telwork" align="left" dir="ltr" style="b" color="000000" size="8"><label align="right" color="626262">Work</label></fld><fld xmlns="" prop="faxwork" align="left" dir="ltr" style="b" color="000000" size="8"><label align="right" color="626262">Fax</label></fld><fld xmlns="" prop="telcell" align="left" dir="ltr" style="b" color="000000" size="8"><label align="right" color="626262">Mobile</label></fld><fld xmlns="" prop="email" align="left" dir="ltr" style="b" color="a00000" size="8"/><fld xmlns="" prop="blank
 " size="8"/><fld xmlns="" prop="addrwork" align="left" dir="ltr" style="b" color="000000" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/></card>
+REV:20100421T065112Z
+END:VCARD
+
+ 	  	 


Mime
View raw message