/* Copyright (c) 2006 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.api.gbase.client;
import com.google.gdata.data.BaseEntry;
import com.google.gdata.data.ExtensionProfile;
import com.google.gdata.data.extensions.FeedLink;
import java.util.List;
/**
* An object corresponding to one entry in a Google Base Atom XML file.
* This kind of entries supports tags in the g: namespace.
*
* GoogleBaseEntries are usually returned by
* {@link com.google.api.gbase.client.GoogleBaseFeed#getEntries()},
* {@link GoogleBaseService#getEntry(java.net.URL)}, but they can also
* be created independently.
*
* Depending on the feed or URL you got the Entry from, it can contain:
* <ul>
* <li>g: namespace tags ({@link #getGoogleBaseAttributes()}, if it
* is an item feed or a URL specifying an item.</li>
* <li>gm: namespace tags ({@link #getGoogleBaseMetadata()}, if it
* is a histogram or an item type.</li>
* <li>locale feeds will contain no g: or gm: namespaces whatsoever.
* You'll find the locale name in the title of the entry.</li>
* </ul>
* Items usually contain only g: tags (attributes) or only gm: tags
* (metadata) depending on their types, never both.
*/
public class GoogleBaseEntry extends BaseEntry<GoogleBaseEntry> {
private final MetadataEntryExtension metadata =
new MetadataEntryExtension(this);
private final GoogleBaseAttributesExtension googleBaseAttributesExtension;
/**
* Creates a new entry.
*/
public GoogleBaseEntry() {
googleBaseAttributesExtension = new GoogleBaseAttributesExtension();
addExtension(googleBaseAttributesExtension);
}
/**
* Accesses tags in the g: namespace.
*
* @return extension corresponding to tags in the g: namespace, never
* null but might be empty.
*/
public GoogleBaseAttributesExtension getGoogleBaseAttributes() {
return googleBaseAttributesExtension;
}
/**
* Accesses tags in the gm: namespace (attribute histogram and
* item type descriptions).
*
* The gm: tags are read-only.
*
* @return extension corresponding to tags in the gm: namespace, never
* null but might be empty
*/
public MetadataEntryExtension getGoogleBaseMetadata() {
return metadata;
}
/**
* Returns the {@link FeedLink} object pointing to the media feed,
* or null if the media feed link is not provided (e.g. the entry
* is obtained from the {@code /snippets} feed).
*
* @return the feed link pointing to the media feed, or null if
* link is not provided
*/
@SuppressWarnings("unchecked")
public FeedLink<GoogleBaseMediaFeed> getMediaFeedLink() {
List<FeedLink> extensions = getRepeatingExtension(FeedLink.class);
for (FeedLink extension : extensions) {
if ("media".equals(extension.getRel())) {
return extension;
}
}
return null;
}
/**
* Declares extensions for the g: and gm: namespaces to an extension profile.
*
* @param extProfile extension profile where the extensions will be declared
*/
@Override
public void declareExtensions(ExtensionProfile extProfile) {
// Declare arbitrary XML support for the feed instances, so any
// extensions not explicitly declared in the profile will be captured.
extProfile.declareArbitraryXmlExtension(GoogleBaseEntry.class);
GoogleBaseNamespaces.declareAllExtensions(extProfile);
}
}