blob: d55e135e8642fd0b2c80f0aa2b5a41e2568d4c98 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. The ASF licenses this file to You
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. For additional information regarding
copyright in this work, please see the NOTICE file in the top level
directory of this distribution. -->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Apache Abdera</title>
</head>
<body>
<!-- Header -->
<div id="banner">
<h1><a href="http://incubator.apache.org/abdera">Apache Abdera</a></h1>
<p>Version 0.4.0-incubating-SNAPSHOT</p>
<hr/>
</div>
<div id="divider"></div>
<div>
<div id="content">
<h1>Getting Started</h1>
<h2>Downloading and Building the Source</h2>
<p>Before you can use Abdera, you need to download and build the source.
Instructions for bulding are available in the <a href="building.html">Builder's Guide</a>.
<h2>Parsing Atom Feed and Entry Documents</h2>
<p>The Abdera parser is capable of handling Atom Feed and Entry documents,
Atom Publishing Protocol Introspection Documents, and any other arbitrary,
well-formed XML document.</p>
<pre>Abdera abdera = new Abdera();
Parser parser = abdera.getParser();
// or
Parser parser = new MyCustomParser();</pre>
<p>The <code>Parser</code> will automatically detect the kind of document
being parsed and will return an appropriate <code>org.apache.abdera.model.Document</code>.
<pre>
InputStream in = ...
Document&lt;Feed&gt; feeddoc = parser.parse(in);
Document&lt;Entry&gt; entrydoc = parser.parse(in);
Document&lt;Service&gt; servicedoc = parser.parse(in);
</pre>
<h3>Parsing an Atom Feed</h3>
<pre>URI uri = new URI("http://example.org/feed.xml");
InputStream in = uri.toURL().openStream();
Document&lt;Feed&gt; doc = parser.parse(in, uri);</pre>
<p>The <code>uri</code> parameter on the <code>parse</code> method establishes
the Base URI for the parsed document and is used as the basis for relative
URI resolution throughout the document.</p>
<h3>Parsing an Atom Entry</h3>
<pre>URI uri = new URI("http://example.org/entry.xml");
InputStream in = uri.toURL().openStream();
Document&lt;Entry&gt; doc = parser.parse(in, uri);</pre>
<h3>Configuring the Parser</h3>
<pre>URI uri = new URI("http://example.org/feed.xml");
InputStream in = uri.toURL().openStream();
<b>ParserOptions options = parser.getDefaultParserOptions();
options.setCharset("utf-8");
//.. set other parser options</b>
Document&lt;Feed&gt; doc = parser.parse(in, uri, options);</pre>
<h2>Creating Atom Feed and Entry Documents</h2>
<p>Atom Feed and Entry documents are created using instances of the
<code>org.apache.abdera.factory.Factory</code> interface.</p>
<pre>Abdera abdera = new Abdera();
Factory factory = abdera.getFactory();
// or
Factory factory = new MyCustomFactory();</pre>
<h3>Creating Atom Feed Documents</h3>
<pre>Feed feed = factory.newFeed();
feed.setId("tag:example.org,2005:/myfeed");
feed.setTitle("My Example Feed");
// .. set other feed properties
Document&lt;Feed&gt; doc = feed.getDocument();
doc.writeTo(System.out); // serializes the feed document to System.out
</pre>
<h3>Creating Atom Entry Documents</h3>
<pre>Entry entry = factory.newEntry();
entry.setId("tag:example.org,2005:/myentry");
entry.setTitle("My Example Entry");
// .. set other feed properties
Document&lt;Entry&gt; doc = entry.getDocument();
doc.writeTo(System.out); // serializes the entry document to System.out
</pre>
<h2>The Feed Object Model</h2>
<p>The Feed Object Model (FOM) is a set of interfaces designed around the
Atom Syndication Format data model. The object model provides the API
by which Atom documents are read and created.</p>
<pre>URI uri = ...
InputStream inputStream = ...
Document&lt;Feed&gt; doc = parser.parse(inputStream, uri);
Feed feed = doc.getRoot();
URI id = feed.getId();
Text.Type titleType = feed.getTitleType();
String title = feed.getTitle();
List&lt;Entry&gt; entries = feed.getEntries();
for (Entry entry : entries) {
URI entryId = entry.getId();
Text.Type entryTitleType = entry.getTitleType();
String entryTitle = entry.getTitle();
}
...</pre>
<h2>Using XPath</h2>
<p>As an alternative to navigating the Feed Object Model manually, developer's
may use XPath to query a parsed <code>Document</code>.
<pre>URI uri = ...
InputStream inputStream = ...
Document&lt;Feed&gt; doc = parser.parse(inputStream, uri);
// Select the id of the document
XPath xpath = abdera.getXPath();
String id = xpath.valueOf("/a:feed/a:id", doc);
// Select all entries from the document
List entries = xpath.valueOf("//a:entry", doc);
for (Iterator i = entries.iterator(); i.hasNext();) {
Entry entry = (Entry)i.next();
//...
}
// Determine if a feed contains a specific extension
boolean hasFoo = xpath.booleanValueOf("//x:foo", doc);
// The XPath support works on any element in the FOM
Entry entry = (Entry)xpath.selectSingleNode("//a:entry", doc);
String id = xpath.valueOf("a:id", entry);</pre>
<h2>Using Extensions</h2>
<p>The Feed Object Model is designed to fully and dynamically support
extensions to the Atom Feed format.</p>
<pre>Feed feed = factory.newFeed();
// ... set other feed properties
feed.addSimpleExtension(
new QName("urn:foo", "myExtension", "a"),
"This is an extension"
);
Link link = feed.addLink("http://example.org");
link.setAttributeValue(
new QName("urn:foo", "myAttribute", "a"),
"My Attribute");</pre>
<p>This results in the following Atom feed:</p>
<pre>&lt;?xml version='1.0' ?&gt;
&lt;feed xmlns='http://www.w3.org/2005/Atom'&gt;
...
&lt;a:myExtension xmlns:a="urn:foo">This is an extension&lt;/a:myExtension>
&lt;link href="http://example.org"
xmlns:a="urn:foo"
a:myAttribute="My Attribute" />
&lt;/feed&gt;
</pre>
<p>As an alternative to using the dynamic extensions support built into the
Feed Object Model, developers may configure static extensions using the
<code>org.apache.abdera.factory.ExtensionFactory</code> mechanism.
Extension Factories are covered in detail in the <a href="developers.html">Developer's Guide</a>.</p>
<h2>Signing and Encrypting Atom Documents</h2>
<p>Atom Feed and Entry documents may be digitally signed and/or encrypted
by using the <i>optional</i> Abdera Security module. The security module currently
depends on the Apache Xerces, Apache XML Security Projects and the Bouncy
Castle Java cryptography implementation.</p>
<h3>Digitally Signing Atom Documents</h3>
<pre>Abdera abdera = new Abdera();
AbderaSecurity absec = new AbderaSecurity(abdera);
Factory factory = abdera.getFactory();
Feed feed = factory.newFeed();
PrivateKey myPrivateKey = ...
X509Certificate myX509Cert = ...
Signature sig = absec.getSignature();
SignatureOptions options = sig.getDefaultSignatureOptions();
options.setSigningKey(myPrivateKey);
options.setCertificate(myX509Cert);
feed = sig.sign(feed, options);
//any modifications to the feed after this point will break the signature</pre>
<h3>Encrypting Atom Documents</h3>
<pre>Abdera abdera = new Abdera();
AbderaSecurity absec = new AbderaSecurity(abdera);
Feed feed = factory.newFeed();
Key kek = ... // Key encryption key
Key dek = ... // Data encryption key
Encryption enc = absec.getEncryption();
EncryptionOptions options = enc.getDefaultEncryptionOptions();
options.setKeyEncryptionKey(kek);
options.setDataEncryptionKey(dek);
options.setIncludeKeyInfo(true);
Document doc = enc.encrypt(feed.getDocument(), options);
doc.writeTo(System.out); // outs the encrypted XML</pre>
</div>
<div id="footer">
Copyright &#xA9 2006, The Apache Software Foundation
</div>
</div>
</body>
</html>