<html>
<!--
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  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.    
 -->
  <head>
    <title>Apache Tuscany Feed Aggregator Sample</title>
  </head>
  <body>

    <h2>Apache Tuscany Feed Aggregator Sample</h2>
    <p>To read the aggregated feeds, point your Web browser to the following addresses or click on these links:</p>
    <a href="atomAggregator">http://{server-host}:{server-port}/sample-feed-aggregator-webapp/atomAggregator</a><br/>
    <a href="atomAggregator/atomsvc">http://{server-host}:{server-port}/sample-feed-aggregator-webapp/atomAggregator/atomsvc (for the Atom service document)</a><br/>
    <a href="rssAggregator">http://{server-host}:{server-port}/sample-feed-aggregator-webapp/rssAggregator</a>
    <p>where {server-host} and {server-port} are the host and port of your web application server.</p>
     
  </body>
</html>
