/*
* 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 javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
/**
* Resource class used by ResourceHome and ResourceQuery components. Contains
* information about path, media types and entity class the component operates
* on.
*
* @author Jozef Hartinger
* @param <T> entity class
*/
public abstract class AbstractResource<T>
{
@Context
private HttpHeaders httpHeaders;
private String path = null;
private MediaType[] mediaTypes = null;
private Class entityClass = null;
public AbstractResource()
{
mediaTypes = new MediaType[]{MediaType.APPLICATION_XML_TYPE};
}
public String[] getMediaTypes()
{
String[] mediaTypes = new String[this.mediaTypes.length];
for (int i = 0; i < mediaTypes.length; i++)
{
mediaTypes[i] = this.mediaTypes[i].toString();
}
return mediaTypes;
}
public void setMediaTypes(String[] mediaTypes)
{
this.mediaTypes = new MediaType[mediaTypes.length];
for (int i = 0; i < mediaTypes.length; i++)
{
this.mediaTypes[i] = MediaType.valueOf(mediaTypes[i]);
}
}
public void setEntityClass(Class entityClass)
{
this.entityClass = entityClass;
}
/**
* Retrieve entity class. If not set, type parameters of a superclass are
* examined.
*
* @return entity class
*/
public Class<T> getEntityClass()
{
if (entityClass == null)
{
Type superclass = this.getClass().getGenericSuperclass();
if (superclass instanceof ParameterizedType)
{
ParameterizedType parameterizedSuperclass = (ParameterizedType) superclass;
if (parameterizedSuperclass.getActualTypeArguments().length > 0)
{
return (Class) parameterizedSuperclass.getActualTypeArguments()[0];
}
}
throw new RuntimeException("Unable to determine entity class.");
}
else
{
return entityClass;
}
}
/**
* Retrieve a suffix of this resource's URI. See {@link #setPath(String path)}
*
* @return path
* @see javax.ws.rs.Path
*/
public String getPath()
{
return path;
}
/**
* Set the path this resource will operate on. This method is intended to be
* used only by Seam to create a resource configured in component descriptor.
* To specify the path in other cases, use @Path annotation. See
*
* @param path
*/
public void setPath(String path)
{
this.path = path;
}
/**
* Select a media type that will be used for marshalling entity. Media type
* is selected from the intersection of media types supported by this
* resource and media types accepted by client.
*
* @return selected media type, returns null if no suitable media type is
* found
*/
protected MediaType selectResponseMediaType()
{
for (MediaType acceptedMediaType : httpHeaders.getAcceptableMediaTypes())
{
for (MediaType availableMediaType : mediaTypes)
{
if (acceptedMediaType.isCompatible(availableMediaType))
return availableMediaType;
}
}
return null;
}
/**
* Check if media type passed as parameter is supported by this resource.
*
* @param mediaType
* @return true if and only if the media type is accepted by this resource
*/
public boolean isMediaTypeCompatible(MediaType mediaType)
{
for (MediaType availableMediaType : mediaTypes)
{
if (availableMediaType.isCompatible(mediaType))
{
return true;
}
}
return false;
}
}