/* 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.util.ParseException;
import com.google.gdata.util.XmlParser;
import org.xml.sax.Attributes;
import java.io.IOException;
/**
* Abstract base class for entry content.
*
*
*/
public abstract class Content implements IContent {
/**
* Returns this content's type. See {@link IContent.Type} for the set of
* expected values.
*/
public abstract int getType();
/** Returns the human language that this content is written in. */
public abstract String getLang();
/**
* Generates XML in the Atom format.
*
* @param w
* output writer
* @param extProfile
* extension profile for nested extensions.
*
* @throws IOException
*/
public abstract void generateAtom(XmlWriter w, ExtensionProfile extProfile)
throws IOException;
/**
* Generates XML in the RSS format.
*
* @param w
* output writer
* @param extProfile
* extension profile for nested extensions.
*
* @throws IOException
*/
public abstract void generateRss(XmlWriter w, ExtensionProfile extProfile)
throws IOException;
/**
* Parses XML in the Atom format.
*
* @param extProfile
* ExtensionProfile used for nested content.
* @param attrs
* XML attributes of the Content node.
* Used to determine the type of this node.
*
* @return a child handler
*
* @throws ParseException
* @throws IOException
*/
public static ChildHandlerInfo getChildHandler(ExtensionProfile extProfile,
Attributes attrs) throws ParseException, IOException {
String type = attrs.getValue("", "type");
ChildHandlerInfo childHandlerInfo = new ChildHandlerInfo();
String src = attrs.getValue("", "src");
if (src == null) {
// In-line content
if (type == null ||
type.equals("text") ||
type.equals("text/plain") ||
type.equals("html") ||
type.equals("text/html") ||
type.equals("xhtml")) {
TextContent tc = new TextContent();
TextConstruct.ChildHandlerInfo chi =
TextConstruct.getChildHandler(attrs);
tc.setContent(chi.textConstruct);
childHandlerInfo.handler = chi.handler;
childHandlerInfo.content = tc;
} else {
OtherContent oc = new OtherContent();
childHandlerInfo.handler = oc.new AtomHandler(extProfile, attrs);
childHandlerInfo.content = oc;
}
} else {
OutOfLineContent oolc = new OutOfLineContent();
childHandlerInfo.handler = oolc.new AtomHandler();
childHandlerInfo.content = oolc;
}
return childHandlerInfo;
}
/**
* Return type for
* {@link Content#getChildHandler(ExtensionProfile, Attributes)} contains an
* element handler and a content element. This is mainly because Content
* is not actually an ExtensionPoint so things are handled manually.
*/
public static class ChildHandlerInfo {
public XmlParser.ElementHandler handler;
public Content content;
}
}