/*
* JBoss, Home of Professional Open Source
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.seam.resteasy;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.GenericEntity;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.jboss.resteasy.annotations.providers.jaxb.Wrapped;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.framework.EntityQuery;
import org.jboss.seam.framework.Query;
import static javax.ws.rs.core.Response.Status.UNSUPPORTED_MEDIA_TYPE;
import static javax.ws.rs.core.Response.Status.BAD_REQUEST;
/**
* This component exposes EntityQuery component as a REST resource responding to
* HTTP GET request.
*
* @author Jozef Hartinger
* @param <T> entity type
*/
// Empty @Path because it's ignored by second-stage bootstrap if not subclassed or in components.xml
// but we need it as a marker so we'll find components.xml declarations during first stage of bootstrap.
@Path("")
public class ResourceQuery<T> extends AbstractResource<T>
{
private Query<?, T> entityQuery = null;
/**
* Called at component instantiation.
*/
@Create
public void create()
{
this.entityQuery = getEntityQuery();
if (entityQuery == null)
{
this.entityQuery = createEntityQuery();
}
}
/**
* Called by RESTEasy to respond for an HTTP GET request. Retrieves a list of
* entities matching criteria set by query parameters from database and
* returns it wrapped in Response instance.
*
* @param start first entity in the list
* @param show maximum size of the list
* @return representation of a list of database entries
* @see #getEntityList
*/
@GET
@Wrapped
public Response getResourceList(@QueryParam("start") @DefaultValue("0") int start, @QueryParam("show") @DefaultValue("25") int show)
{
MediaType selectedMediaType = selectResponseMediaType();
if (selectedMediaType == null)
{
return Response.status(UNSUPPORTED_MEDIA_TYPE).build();
}
if ((start < 0) || (show < 0))
{
return Response.status(BAD_REQUEST).build();
}
final List<T> result = getEntityList(start, show);
// create a proper response type
Type responseType = new ParameterizedType()
{
public Type getRawType()
{
return result.getClass();
}
public Type getOwnerType()
{
return null;
}
public Type[] getActualTypeArguments()
{
return new Type[]{getEntityClass()};
}
};
return Response.ok(new GenericEntity(result, responseType)
{
}, selectedMediaType).build();
}
/**
* Retrieve a list of database entities.
*
* @param start first entity in the list
* @param show maximum size of the list, 0 for unlimited
* @return list of database entries
*/
public List<T> getEntityList(int start, int show)
{
entityQuery.setFirstResult(start);
if (show > 0) // set 0 for unlimited
{
entityQuery.setMaxResults(show);
}
return entityQuery.getResultList();
}
/**
* EntityQuery getter
*
* @return EntityQuery instance
*/
public Query<?, T> getEntityQuery()
{
return entityQuery;
}
public void setEntityQuery(Query<?, T> query)
{
this.entityQuery = query;
}
public Query<?, T> createEntityQuery()
{
Query<?, T> entityQuery = new EntityQuery<T>();
entityQuery.setEjbql("select entity from " + getEntityClass().getName() + " entity");
return entityQuery;
}
}