/* 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.webmastertools; import com.google.gdata.util.common.xml.XmlWriter; import com.google.gdata.data.ExtensionDescription; import com.google.gdata.data.ExtensionPoint; import com.google.gdata.data.ExtensionProfile; import com.google.gdata.data.ValueConstruct; 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; /** * Represents list of available publication labels for News sitemap. The idea is * that this class lists all the available options for a given site and user * picks one of the options when submitting News sitemap. * * Example: * <pre class="code"> * <feed ...> * ... * <wt:sitemap-news> * <wt:publication-label>Label1</wt:publication-label> * <wt:publication-label>Label2</wt:publication-label> * </wt:sitemap-news> * </feed> * </pre> * * */ @ExtensionDescription.Default( nsAlias = Namespaces.WT_ALIAS, nsUri = Namespaces.WT, localName = SitemapNews.SITEMAP_NEWS) public class SitemapNews extends ExtensionPoint { public static final String SITEMAP_NEWS = "sitemap-news"; private static final String SITEMAP_PUBLICATION_LABEL = "publication-label"; public SitemapNews() { } /** Add another language to the enumeration. */ public void addPublicationLabel(String label) { PublicationLabelConstruct val = new PublicationLabelConstruct(); val.setValue(label); this.addRepeatingExtension(val); } /** Get all the languages. */ public Collection<String> getPublicationLabels() { Collection<PublicationLabelConstruct> labels; labels = this.getRepeatingExtension(PublicationLabelConstruct.class); ArrayList<String> ret = new ArrayList<String>(labels.size()); for (PublicationLabelConstruct l : labels) { ret.add(l.getValue()); } return ret; } @Override public void generate(XmlWriter writer, ExtensionProfile profile) throws IOException { ExtensionDescription desc; desc = ExtensionDescription.getDefaultDescription(this.getClass()); writer.startElement(desc.getNamespace(), desc.getLocalName(), null, null); generateExtensions(writer, profile); writer.endElement(); } @Override public XmlParser.ElementHandler getHandler( ExtensionProfile extProfile, String namespace, String localName, Attributes attrs) { return new Handler(extProfile); } /** <wt:sitemap-news> parser. */ public class Handler extends ExtensionPoint.ExtensionHandler { public Handler(ExtensionProfile profile) { super(profile, SitemapNews.class); } @Override public XmlParser.ElementHandler getChildHandler( String namespace, String localName, Attributes attrs) throws ParseException, IOException { // Based on the node name invoke one of the node handlers. if (localName == SITEMAP_PUBLICATION_LABEL) { PublicationLabelConstruct label = new PublicationLabelConstruct(); addRepeatingExtension(label); return label.getHandler(null, namespace, localName, attrs); } // Handle the exceptional case, should never happen return super.getChildHandler(namespace, localName, attrs); // COV_NF_LINE } } /** * Represents a single GData XML node, that is a publication label for news * sitemap. * * */ @ExtensionDescription.Default( nsAlias = Namespaces.WT_ALIAS, nsUri = Namespaces.WT, localName = SITEMAP_PUBLICATION_LABEL) static class PublicationLabelConstruct extends ValueConstruct { public PublicationLabelConstruct() { super(Namespaces.WT_NAMESPACE, SITEMAP_PUBLICATION_LABEL, null); } } }