/* Copyright (c) 2008 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.gdata.data; import com.google.gdata.util.common.xml.XmlNamespace; import com.google.gdata.util.common.xml.XmlWriter; import com.google.gdata.util.common.xml.XmlWriter.Attribute; import com.google.gdata.client.CoreErrorDomain; import com.google.gdata.util.Namespaces; import com.google.gdata.util.ParseException; import com.google.gdata.util.XmlParser; import org.xml.sax.Attributes; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * Person type used for feed and entry authors and contributors. It may also * be used by services' custom elements. * * */ public class Person extends ExtensionPoint implements IPerson { /** * Class constructor. */ public Person() {} /** * Constructs a new Person instance with the specified name. */ public Person(String name) { if (name == null) throw new NullPointerException("Name must have a value"); this.name = name; } /** * Constructs a new Person instance with the specified name, URI, * and email address. */ public Person(String name, String uri, String email) { this(name); this.uri = uri; this.email = email; } /** Human-readable name. */ protected String name; public String getName() { return name; } public void setName(String v) { name = v; } /** Language of name. Derived from the current state of {@code xml:lang}. */ protected String nameLang; public String getNameLang() { return nameLang; } public void setNameLang(String v) { nameLang = v; } /** URI associated with the person. */ protected String uri; public String getUri() { return uri; } public void setUri(String v) { uri = v; } /** Email address. */ protected String email; public String getEmail() { return email; } public void setEmail(String v) { email = v; } /** * Generates XML. * <p> * Designed to be used by types that reuse the standard Atom person type. * * @param extProfile * extension profile * * @param w * output writer * * @param elementNamespace * namespace for XML element * * @param elementName * name of XML element * * @param attributes * additional attributes * * @throws IOException */ public void generate(ExtensionProfile extProfile, XmlWriter w, XmlNamespace elementNamespace, String elementName, Collection<XmlWriter.Attribute> attributes) throws IOException { generateStartElement(w, elementNamespace, elementName, attributes, null); if (name != null && name.trim().length() > 0) { ArrayList<XmlWriter.Attribute> attrs; if (nameLang != null) { attrs = new ArrayList<XmlWriter.Attribute>(1); attrs.add(new XmlWriter.Attribute("xml:lang", nameLang)); } else { attrs = null; } w.simpleElement(Namespaces.atomNs, "name", attrs, name); } if (uri != null && uri.trim().length() > 0) { w.simpleElement(Namespaces.atomNs, "uri", null, uri); } if (email != null && email.trim().length() > 0) { w.simpleElement(Namespaces.atomNs, "email", null, email); } // Invoke ExtensionPoint. generateExtensions(w, extProfile); w.endElement(elementNamespace, elementName); } /** * Generates XML. * <p> * Designed to be used by {@link ExtensionPoint} types that reuse Person. */ @Override protected void generate(XmlWriter w, ExtensionProfile p, XmlNamespace namespace, String localName, List<Attribute> attrs, AttributeGenerator generator) throws IOException { generate(p, w, namespace, localName, attrs); } /** * Generates XML in the Atom format. * * @param extProfile * extension profile * * @param w * output writer * * @param elementName * Atom element name * * @throws IOException */ public void generateAtom(ExtensionProfile extProfile, XmlWriter w, String elementName) throws IOException { generate(extProfile, w, Namespaces.atomNs, elementName, null); } /** * Generates XML in the RSS format. * * @param w * output writer * * @param elementName * RSS element name * * @throws IOException */ public void generateRss(XmlWriter w, String elementName) throws IOException { String text = new String(); if (email != null) { text += email; } if (name != null) { if (email != null) { text += " ("; } text += name; if (email != null) { text += ")"; } } w.simpleElement(Namespaces.rssNs, elementName, null, text); } @Override public XmlParser.ElementHandler getHandler(ExtensionProfile extProfile, String namespace, String localName, Attributes attrs) { return new AtomHandler(extProfile); } /** Parses XML in the Atom format. */ public class AtomHandler extends ExtensionPoint.ExtensionHandler { public AtomHandler(ExtensionProfile extProfile) { super(extProfile, Person.this.getClass()); } @Override public XmlParser.ElementHandler getChildHandler(String namespace, String localName, Attributes attrs) throws ParseException, IOException { if (namespace.equals(Namespaces.atom)) { if (localName.equals("name")) { return new NameHandler(); } else if (localName.equals("uri")) { return new UriHandler(); } else if (localName.equals("email")) { return new EmailHandler(); } } else { return super.getChildHandler(namespace, localName, attrs); } return null; } class NameHandler extends XmlParser.ElementHandler { @Override public void processEndElement() throws ParseException { if (name != null) { throw new ParseException( CoreErrorDomain.ERR.duplicateName); } if (value == null) { throw new ParseException( CoreErrorDomain.ERR.nameValueRequired); } name = value; nameLang = xmlLang; } } class UriHandler extends XmlParser.ElementHandler { @Override public void processEndElement() throws ParseException { if (uri != null) { throw new ParseException( CoreErrorDomain.ERR.duplicateUri); } if (value == null) { throw new ParseException( CoreErrorDomain.ERR.uriValueRequired); } uri = value; } } class EmailHandler extends XmlParser.ElementHandler { @Override public void processEndElement() throws ParseException { if (email != null) { throw new ParseException( CoreErrorDomain.ERR.duplicateEmail); } if (value == null) { throw new ParseException( CoreErrorDomain.ERR.emailValueRequired); } email = value; } } } }