/* 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.XmlWriter; import com.google.gdata.client.CoreErrorDomain; import com.google.gdata.client.Service; import com.google.gdata.util.ContentType; import com.google.gdata.util.Namespaces; import com.google.gdata.util.ParseException; import com.google.gdata.util.XmlParser; import java.io.IOException; import java.util.ArrayList; /** * Variant of {@link Content} for entries that reference external content. * * */ public class OutOfLineContent extends Content implements IOutOfLineContent { /** @return the type of this content */ @Override public int getType() { return Content.Type.MEDIA; } /** MIME Content type. */ protected ContentType mimeType; /** @return the MIME content type */ public ContentType getMimeType() { return mimeType; } /** Specifies the MIME Content type. */ public void setMimeType(ContentType v) { mimeType = v; } /** * Language derived from the current state of {@code xml:lang}. */ protected String lang; @Override public String getLang() { return lang; } /** Specifies the human language that this content is written in. */ public void setLang(String v) { lang = v; } /** * External URI. */ protected String uri; /** @return the external URI */ public String getUri() { return uri; } /** Specifies the external URI. */ public void setUri(String v) { uri = v; } /** * Content length. Value will be -1 if unknown. */ protected long length; /** @return the content length. */ public long getLength() { return length; } public void setLength(long v) { length = v; } /** * ETag for the referenced content. Value will be {@code null} if unknown. */ protected String etag; public String getEtag() { return etag; } public void setEtag(String v) { etag = v; } /** * Generates XML in the Atom format. * * @param w * output writer * @param extProfile * Extension Profile for nested extensions * * @throws IOException */ @Override public void generateAtom(XmlWriter w, ExtensionProfile extProfile) throws IOException { ArrayList<XmlWriter.Attribute> attrs = new ArrayList<XmlWriter.Attribute>(2); if (mimeType != null) { attrs.add(new XmlWriter.Attribute("type", mimeType.getMediaType())); } if (uri != null) { attrs.add(new XmlWriter.Attribute("src", uri)); } if (etag != null && !Service.getVersion().isCompatible(Service.Versions.V1)) { attrs.add(new XmlWriter.Attribute(Namespaces.gAlias, "etag", etag)); } if (lang != null) { attrs.add(new XmlWriter.Attribute("xml:lang", lang)); } w.simpleElement(Namespaces.atomNs, "content", attrs, null); } /** * Generates XML in the RSS format. * * @param w * output writer * @param extProfile * Extension Profile for nested extensions * * @throws IOException */ @Override public void generateRss(XmlWriter w, ExtensionProfile extProfile) throws IOException { ArrayList<XmlWriter.Attribute> attrs = new ArrayList<XmlWriter.Attribute>(3); if (mimeType != null) { attrs.add(new XmlWriter.Attribute("type", mimeType.getMediaType())); } if (uri != null) { attrs.add(new XmlWriter.Attribute("url", uri)); } if (length != -1) { attrs.add(new XmlWriter.Attribute("length", Long.toString(length))); } w.simpleElement(Namespaces.rssNs, "enclosure", attrs, null); } /** Parses XML in the Atom format. */ public class AtomHandler extends XmlParser.ElementHandler { /** * Processes attributes. * * @throws ParseException */ @Override public void processAttribute(String namespace, String localName, String value) throws ParseException { if (namespace.equals("")) { if (localName.equals("type")) { try { mimeType = new ContentType(value); } catch (IllegalArgumentException e) { throw new ParseException( CoreErrorDomain.ERR.invalidMimeType, e); } } else if (localName.equals("src")) { uri = getAbsoluteUri(value); } } else if (namespace.equals(Namespaces.g)) { if (localName.equals("etag")) { setEtag(value); return; } } } @Override public void processEndElement() throws ParseException { if (uri == null) { throw new ParseException( CoreErrorDomain.ERR.missingSrcAttribute); } lang = xmlLang; // Validate that external content element is empty. super.processEndElement(); } } }