![JAR search and dependency download from the Maven repository](/logo.png)
com.impetus.kundera.rest.resources.JPAQueryResource Maven / Gradle / Ivy
The newest version!
/*******************************************************************************
* * Copyright 2012 Impetus Infotech.
* *
* * 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 com.impetus.kundera.rest.resources;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.HttpMethod;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.impetus.kundera.query.QueryImpl;
import com.impetus.kundera.rest.common.Constants;
import com.impetus.kundera.rest.common.EntityUtils;
import com.impetus.kundera.rest.converters.CollectionConverter;
import com.impetus.kundera.rest.repository.EMRepository;
/**
* REST based resource for JPA queries
*
* @author amresh
*
*/
@Path("/" + Constants.KUNDERA_API_PATH + Constants.JPA_QUERY_RESOURCE_PATH)
public class JPAQueryResource
{
private static Logger log = LoggerFactory.getLogger(JPAQueryResource.class);
/**
* Handler for GET method requests for this resource. Retrieves all entities
* for a given table from datasource that match after running named query.
* If named query=All, it returns all records.
*
* @param sessionToken
* @param entityClassName
* @param id
* @return
*/
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Path("/{entityClass}/{namedQueryName}")
public Response executeNamedQuery(@Context HttpHeaders headers, @Context UriInfo info)
{
String entityClassName = info.getPathParameters().getFirst("entityClass");
String namedQueryName = info.getPathParameters().getFirst("namedQueryName");
String sessionToken = headers.getRequestHeader(Constants.SESSION_TOKEN_HEADER_NAME).get(0);
String mediaType = headers.getRequestHeader("accept").get(0);
if (log.isDebugEnabled())
log.debug("GET: sessionToken:" + sessionToken + ", entityClass:" + entityClassName + ", Named Query:"
+ namedQueryName + ", Media Type:" + mediaType);
List result = null;
Class> entityClass = null;
try
{
EntityManager em = EMRepository.INSTANCE.getEM(sessionToken);
entityClass = EntityUtils.getEntityClass(entityClassName, em);
if (log.isDebugEnabled())
log.debug("GET: entityClass" + entityClass);
if (Constants.NAMED_QUERY_ALL.equalsIgnoreCase(namedQueryName))
{
String alias = entityClassName.substring(0, 1).toLowerCase();
StringBuilder sb = new StringBuilder().append("SELECT ").append(alias).append(" FROM ")
.append(entityClassName).append(" ").append(alias);
Query q = em.createQuery(sb.toString());
result = q.getResultList();
}
else
{
String queryPart = EntityUtils.getQueryPart(namedQueryName);
String paramPart = EntityUtils.getParameterPart(namedQueryName);
Query q = em.createNamedQuery(queryPart);
if (q == null)
{
return Response.serverError().build();
}
boolean isDeleteOrUpdateQuery = ((QueryImpl) q).getKunderaQuery().isDeleteUpdate();
if (isDeleteOrUpdateQuery)
{
log.error("Incorrect HTTP method GET for query:" + queryPart);
return Response.noContent().build();
}
EntityUtils.setQueryParameters(queryPart, paramPart, q);
result = q.getResultList();
}
}
catch (Exception e)
{
log.error(e.getMessage());
return Response.serverError().build();
}
if (log.isDebugEnabled())
log.debug("GET: Result of " + namedQueryName + " Query : " + result);
if (result == null)
{
return Response.noContent().build();
}
String output = CollectionConverter.toString(result, entityClass, mediaType);
return Response.ok(output).build();
}
/**
* Handler for POST method requests for this resource Retrieves records from
* datasource for a given INSERT JPA query
*
* @param sessionToken
* @param entityClassName
* @param id
* @return
*/
@POST
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Path("/{jpaQuery}")
public Response executeInsertJPAQuery(@Context HttpHeaders headers, @Context UriInfo info)
{
String jpaQuery = info.getPathParameters().getFirst("jpaQuery");
String sessionToken = headers.getRequestHeader(Constants.SESSION_TOKEN_HEADER_NAME).get(0);
String mediaType = headers.getRequestHeader("accept").get(0);
if (log.isDebugEnabled())
log.debug("GET: sessionToken:" + sessionToken + ", jpaQuery:" + jpaQuery + ", Media Type:" + mediaType);
if (!EntityUtils.isValidQuery(jpaQuery, HttpMethod.POST))
{
log.error("Incorrect HTTP method POST for query:" + jpaQuery);
return Response.noContent().build();
}
int result = executeWrite(jpaQuery, sessionToken);
if (log.isDebugEnabled())
log.debug("GET: Result for JPA Query: " + result);
if (result < 0)
{
return Response.noContent().build();
}
return Response.ok(result).build();
}
/**
* Handler for GET method requests for this resource Retrieves records from
* datasource for a given select JPA query
*
* @param sessionToken
* @param entityClassName
* @param id
* @return
*/
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Path("/{jpaQuery}")
public Response executeSelectJPAQuery(@Context HttpHeaders headers, @Context UriInfo info)
{
String jpaQuery = info.getPathParameters().getFirst("jpaQuery");
String sessionToken = headers.getRequestHeader(Constants.SESSION_TOKEN_HEADER_NAME).get(0);
String mediaType = headers.getRequestHeader("accept").get(0);
if (log.isDebugEnabled())
log.debug("GET: sessionToken:" + sessionToken + ", jpaQuery:" + jpaQuery + ", Media Type:" + mediaType);
if (!EntityUtils.isValidQuery(jpaQuery, HttpMethod.GET))
{
log.error("Incorrect HTTP method GET for query:" + jpaQuery);
return Response.noContent().build();
}
List result = null;
Query q = null;
try
{
EntityManager em = EMRepository.INSTANCE.getEM(sessionToken);
String queryPart = EntityUtils.getQueryPart(jpaQuery);
String paramPart = EntityUtils.getParameterPart(jpaQuery);
q = em.createQuery(queryPart);
if (q == null)
{
return Response.serverError().build();
}
EntityUtils.setQueryParameters(queryPart, paramPart, q);
result = q.getResultList();
}
catch (Exception e)
{
log.error(e.getMessage());
return Response.serverError().build();
}
if (log.isDebugEnabled())
log.debug("GET: Result for JPA Query: " + result);
if (result == null)
{
return Response.noContent().build();
}
Class> genericClass = ((QueryImpl) q).getKunderaQuery().getEntityClass();
String output = CollectionConverter.toString(result, genericClass, mediaType);
return Response.ok(output).build();
}
/**
* Handler for PUT method requests for this resource Retrieves records from
* datasource for a given UPDATE JPA query
*
* @param sessionToken
* @param entityClassName
* @param id
* @return
*/
@PUT
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Path("/{jpaQuery}")
public Response executeUpdateJPAQuery(@Context HttpHeaders headers, @Context UriInfo info)
{
String jpaQuery = info.getPathParameters().getFirst("jpaQuery");
String sessionToken = headers.getRequestHeader(Constants.SESSION_TOKEN_HEADER_NAME).get(0);
String mediaType = headers.getRequestHeader("accept").get(0);
if (log.isDebugEnabled())
log.debug("GET: sessionToken:" + sessionToken + ", jpaQuery:" + jpaQuery + ", Media Type:" + mediaType);
if (!EntityUtils.isValidQuery(jpaQuery, HttpMethod.PUT))
{
log.error("Incorrect HTTP method POST for query:" + jpaQuery);
return Response.noContent().build();
}
int result = executeWrite(jpaQuery, sessionToken);
if (log.isDebugEnabled())
log.debug("GET: Result for JPA Query: " + result);
if (result < 0)
{
return Response.noContent().build();
}
return Response.ok(result).build();
}
/**
* Handler for DELETE method requests for this resource Retrieves records
* from datasource for a given UPDATE JPA query
*
* @param sessionToken
* @param entityClassName
* @param id
* @return
*/
@DELETE
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Path("/{jpaQuery}")
public Response executeDeleteJPAQuery(@Context HttpHeaders headers, @Context UriInfo info)
{
String jpaQuery = info.getPathParameters().getFirst("jpaQuery");
String sessionToken = headers.getRequestHeader(Constants.SESSION_TOKEN_HEADER_NAME).get(0);
String mediaType = headers.getRequestHeader("accept").get(0);
if (log.isDebugEnabled())
log.debug("GET: sessionToken:" + sessionToken + ", jpaQuery:" + jpaQuery + ", Media Type:" + mediaType);
if (!EntityUtils.isValidQuery(jpaQuery, HttpMethod.DELETE))
{
log.error("Incorrect HTTP method POST for query:" + jpaQuery);
return Response.noContent().build();
}
int result = executeWrite(jpaQuery, sessionToken);
if (log.isDebugEnabled())
log.debug("GET: Result for JPA Query: " + result);
if (result < 0)
{
return Response.noContent().build();
}
return Response.ok(result).build();
}
private int executeWrite(String jpaQuery, String sessionToken)
{
int result = -1;
Query q = null;
try
{
EntityManager em = EMRepository.INSTANCE.getEM(sessionToken);
String queryPart = EntityUtils.getQueryPart(jpaQuery);
String paramPart = EntityUtils.getParameterPart(jpaQuery);
q = em.createQuery(queryPart);
if (q != null)
{
EntityUtils.setQueryParameters(queryPart, paramPart, q);
result = q.executeUpdate();
}
}
catch (Exception e)
{
log.error(e.getMessage());
}
return result;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy