/**
* Copyright 2008 - 2009 Pro-Netics S.P.A.
*
* 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 it.pronetics.madstore.server.jaxrs.atom.pub.impl;
import it.pronetics.madstore.common.AtomConstants;
import it.pronetics.madstore.repository.util.PagingList;
import it.pronetics.madstore.server.HttpConstants;
import it.pronetics.madstore.server.jaxrs.atom.impl.AbstractResourceHandler;
import it.pronetics.madstore.server.jaxrs.atom.pub.CollectionResourceHandler;
import it.pronetics.madstore.server.jaxrs.atom.resolver.ResourceName;
import it.pronetics.madstore.server.jaxrs.atom.resolver.ResourceUriFor;
import java.net.URL;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import org.apache.abdera.Abdera;
import org.apache.abdera.factory.Factory;
import org.apache.abdera.model.Collection;
import org.apache.abdera.model.Entry;
import org.apache.abdera.model.Feed;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
* {@link it.pronetics.madstore.server.jaxrs.atom.pub.CollectionResourceHandler} implementation based on
* JBoss Resteasy and Abdera atom model.
*
* @author Sergio Bossa
*/
@Path("/")
public class DefaultCollectionResourceHandler extends AbstractResourceHandler implements CollectionResourceHandler {
private static final Logger LOG = LoggerFactory.getLogger(DefaultCollectionResourceHandler.class);
private String collectionKey;
private int maxNumberOfEntries;
private int pageNumberOfEntries;
@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
@ResourceUriFor(resource = ResourceName.COLLECTION)
@GET
@Path("/{collectionKey}")
@Produces(AtomConstants.ATOM_MEDIA_TYPE)
public Response getCollectionResource() {
try {
int max = maxNumberOfEntries;
int offset = (pageNumberOfEntries - 1) * max;
//
Collection collectionModel = readCollectionFromRepository(collectionKey);
Factory abderaFactory = Abdera.getInstance().getFactory();
Feed feed = abderaFactory.newFeed();
PagingList<Entry> entries = readEntriesFromRepository(collectionKey, offset, max);
configureFeed(feed, entries, collectionModel);
Response response = buildOkResponse(feed);
return response;
} catch (Exception ex) {
LOG.error(ex.getMessage(), ex);
throw new WebApplicationException(Response.serverError().build());
}
}
@PathParam("collectionKey")
public void setCollectionKey(String collectionKey) {
this.collectionKey = collectionKey;
}
@QueryParam(HttpConstants.MAX_PARAMETER)
@DefaultValue("10")
public void setMaxNumberOfEntries(int maxNumberOfEntries) {
this.maxNumberOfEntries = maxNumberOfEntries;
}
@QueryParam(HttpConstants.PAGE_PARAMETER)
@DefaultValue("1")
public void setPageNumberOfEntries(int pageNumberOfEntries) {
this.pageNumberOfEntries = pageNumberOfEntries;
}
private void configureFeed(Feed feed, PagingList<Entry> entries, Collection collectionModel) throws Exception {
URL selfUrl = resourceResolver.resolveResourceUriFor(
ResourceName.COLLECTION,
uriInfo.getBaseUri().toString(),
collectionKey);
URL nextUrl = UriBuilder.fromUri(
selfUrl.toURI()).queryParam(HttpConstants.PAGE_PARAMETER, new Integer(pageNumberOfEntries + 1)).queryParam(HttpConstants.MAX_PARAMETER, maxNumberOfEntries).build().toURL();
URL prevUrl = UriBuilder.fromUri(
selfUrl.toURI()).queryParam(HttpConstants.PAGE_PARAMETER, new Integer(pageNumberOfEntries - 1)).queryParam(HttpConstants.MAX_PARAMETER, maxNumberOfEntries).build().toURL();
String id = resourceResolver.resolveResourceIdFor(
uriInfo.getBaseUri().toString(),
ResourceName.COLLECTION,
collectionKey);
feed.setId(id);
feed.addLink(selfUrl.toString(), "self");
feed.setTitle(collectionModel.getTitle());
feed.addAuthor(Abdera.getInstance().getFactory().newAuthor().getText());
for (Entry entry : entries) {
feed.addEntry(entry);
}
if (entries.size() > 0) {
int currentLastResult = ((pageNumberOfEntries - 1) * maxNumberOfEntries) + entries.size();
if (currentLastResult < entries.getTotal()) {
feed.addLink(nextUrl.toString(), "next");
}
if (pageNumberOfEntries > 1) {
feed.addLink(prevUrl.toString(), "previous");
}
}
}
}