diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/ExceptionMapperBase.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/ExceptionMapperBase.java
index 1949181..b16ed1e 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/ExceptionMapperBase.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/ExceptionMapperBase.java
@@ -16,5 +16,55 @@
package com.ning.billing.jaxrs.mappers;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import javax.ws.rs.core.UriInfo;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
public abstract class ExceptionMapperBase {
+
+ private static final Logger log = LoggerFactory.getLogger(ExceptionMapperBase.class);
+
+ protected Response buildConflictingRequestResponse(final Exception e, final UriInfo uriInfo) {
+ log.warn("Conflicting request for {}: {}", uriInfo.getRequestUri(), e);
+ return Response.status(Status.CONFLICT)
+ .entity(e)
+ .type(MediaType.TEXT_PLAIN_TYPE)
+ .build();
+ }
+
+ protected Response buildNotFoundResponse(final Exception e, final UriInfo uriInfo) {
+ log.warn("Not found for {}: {}", uriInfo.getRequestUri(), e);
+ return Response.status(Status.NOT_FOUND)
+ .entity(e)
+ .type(MediaType.TEXT_PLAIN_TYPE)
+ .build();
+ }
+
+ protected Response buildBadRequestResponse(final Exception e, final UriInfo uriInfo) {
+ return buildBadRequestResponse(e.toString(), uriInfo);
+ }
+
+ protected Response buildBadRequestResponse(final String error, final UriInfo uriInfo) {
+ log.warn("Bad request for {}: {}", uriInfo.getRequestUri(), error);
+ return Response.status(Status.BAD_REQUEST)
+ .entity(error)
+ .type(MediaType.TEXT_PLAIN_TYPE)
+ .build();
+ }
+
+ protected Response buildInternalErrorResponse(final Exception e, final UriInfo uriInfo) {
+ return buildInternalErrorResponse(e.toString(), uriInfo);
+ }
+
+ protected Response buildInternalErrorResponse(final String error, final UriInfo uriInfo) {
+ log.warn("Internal error for {}: {}", uriInfo.getRequestUri(), error);
+ return Response.status(Status.INTERNAL_SERVER_ERROR)
+ .entity(error)
+ .type(MediaType.TEXT_PLAIN_TYPE)
+ .build();
+ }
}
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/TagDefinitionApiExceptionMapper.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/TagDefinitionApiExceptionMapper.java
index 8202ed7..ba69336 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/TagDefinitionApiExceptionMapper.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/TagDefinitionApiExceptionMapper.java
@@ -16,17 +16,36 @@
package com.ning.billing.jaxrs.mappers;
+import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
+import com.ning.billing.ErrorCode;
import com.ning.billing.util.api.TagDefinitionApiException;
@Provider
public class TagDefinitionApiExceptionMapper extends ExceptionMapperBase implements ExceptionMapper<TagDefinitionApiException> {
+ private final UriInfo uriInfo;
+
+ public TagDefinitionApiExceptionMapper(@Context final UriInfo uriInfo) {
+ this.uriInfo = uriInfo;
+ }
+
@Override
public Response toResponse(final TagDefinitionApiException exception) {
- return null;
+ if (exception.getCode() == ErrorCode.TAG_DEFINITION_ALREADY_EXISTS.getCode()) {
+ return buildConflictingRequestResponse(exception, uriInfo);
+ } else if (exception.getCode() == ErrorCode.TAG_DEFINITION_CONFLICTS_WITH_CONTROL_TAG.getCode()) {
+ return buildConflictingRequestResponse(exception, uriInfo);
+ } else if (exception.getCode() == ErrorCode.TAG_DEFINITION_DOES_NOT_EXIST.getCode()) {
+ return buildNotFoundResponse(exception, uriInfo);
+ } else if (exception.getCode() == ErrorCode.TAG_DEFINITION_IN_USE.getCode()) {
+ return buildBadRequestResponse(exception, uriInfo);
+ } else {
+ return buildBadRequestResponse(exception, uriInfo);
+ }
}
}
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/TagResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/TagResource.java
index 89408ea..642c881 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/TagResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/TagResource.java
@@ -16,6 +16,10 @@
package com.ning.billing.jaxrs.resources;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.UUID;
+
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
@@ -26,93 +30,82 @@ import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.UUID;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
import com.ning.billing.jaxrs.json.TagDefinitionJson;
import com.ning.billing.jaxrs.util.Context;
import com.ning.billing.jaxrs.util.JaxrsUriBuilder;
+import com.ning.billing.util.api.CustomFieldUserApi;
import com.ning.billing.util.api.TagDefinitionApiException;
import com.ning.billing.util.api.TagUserApi;
+import com.ning.billing.util.dao.ObjectType;
import com.ning.billing.util.tag.TagDefinition;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
@Singleton
@Path(JaxrsResource.TAG_DEFINITIONS_PATH)
-public class TagResource implements JaxrsResource {
+public class TagResource extends JaxRsResourceBase {
- private final TagUserApi tagUserApi;
private final Context context;
- private final JaxrsUriBuilder uriBuilder;
@Inject
- public TagResource(final TagUserApi tagUserApi, final JaxrsUriBuilder uriBuilder, final Context context) {
- this.tagUserApi = tagUserApi;
+ public TagResource(final JaxrsUriBuilder uriBuilder,
+ final TagUserApi tagUserApi,
+ final CustomFieldUserApi customFieldUserApi,
+ final Context context) {
+ super(uriBuilder, tagUserApi, customFieldUserApi);
this.context = context;
- this.uriBuilder = uriBuilder;
}
@GET
@Produces(APPLICATION_JSON)
public Response getTagDefinitions() {
+ final List<TagDefinition> tagDefinitions = tagUserApi.getTagDefinitions();
final List<TagDefinitionJson> result = new LinkedList<TagDefinitionJson>();
- final List<TagDefinition> tagDefinitions = tagUserApi.getTagDefinitions();
for (final TagDefinition cur : tagDefinitions) {
- result.add(new TagDefinitionJson(cur.getId().toString(), cur.getName(), cur.getDescription()));
+ result.add(new TagDefinitionJson(cur));
}
+
return Response.status(Status.OK).entity(result).build();
}
@GET
@Path("/{tagDefinitionId:" + UUID_PATTERN + "}")
@Produces(APPLICATION_JSON)
- public Response getTagDefinition(@PathParam("tagDefinitionId") final String tagDefId) {
- try {
- final TagDefinition tagDef = tagUserApi.getTagDefinition(UUID.fromString(tagDefId));
- final TagDefinitionJson json = new TagDefinitionJson(tagDef.getId().toString(), tagDef.getName(), tagDef.getDescription());
- return Response.status(Status.OK).entity(json).build();
- } catch (TagDefinitionApiException e) {
- return Response.status(Status.NO_CONTENT).build();
- }
+ public Response getTagDefinition(@PathParam("tagDefinitionId") final String tagDefId) throws TagDefinitionApiException {
+ final TagDefinition tagDef = tagUserApi.getTagDefinition(UUID.fromString(tagDefId));
+ final TagDefinitionJson json = new TagDefinitionJson(tagDef);
+ return Response.status(Status.OK).entity(json).build();
}
-
@POST
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON)
public Response createTagDefinition(final TagDefinitionJson json,
- @HeaderParam(HDR_CREATED_BY) final String createdBy,
- @HeaderParam(HDR_REASON) final String reason,
- @HeaderParam(HDR_COMMENT) final String comment) {
- try {
- final TagDefinition createdTagDef = tagUserApi.create(json.getName(), json.getDescription(), context.createContext(createdBy, reason, comment));
- return uriBuilder.buildResponse(TagResource.class, "getTagDefinition", createdTagDef.getId());
- } catch (TagDefinitionApiException e) {
- return Response.status(Status.NO_CONTENT).build();
- } catch (IllegalArgumentException e) {
- return Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build();
- }
+ @HeaderParam(HDR_CREATED_BY) final String createdBy,
+ @HeaderParam(HDR_REASON) final String reason,
+ @HeaderParam(HDR_COMMENT) final String comment) throws TagDefinitionApiException {
+ final TagDefinition createdTagDef = tagUserApi.create(json.getName(), json.getDescription(), context.createContext(createdBy, reason, comment));
+ return uriBuilder.buildResponse(TagResource.class, "getTagDefinition", createdTagDef.getId());
}
@DELETE
@Path("/{tagDefinitionId:" + UUID_PATTERN + "}")
@Produces(APPLICATION_JSON)
public Response deleteTagDefinition(@PathParam("tagDefinitionId") final String tagDefId,
- @HeaderParam(HDR_CREATED_BY) final String createdBy,
- @HeaderParam(HDR_REASON) final String reason,
- @HeaderParam(HDR_COMMENT) final String comment) {
- try {
- tagUserApi.deleteTagDefinition(UUID.fromString(tagDefId), context.createContext(createdBy, reason, comment));
- return Response.status(Status.OK).build();
- } catch (TagDefinitionApiException e) {
- return Response.status(Status.NO_CONTENT).build();
- } catch (IllegalArgumentException e) {
- return Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build();
- }
+ @HeaderParam(HDR_CREATED_BY) final String createdBy,
+ @HeaderParam(HDR_REASON) final String reason,
+ @HeaderParam(HDR_COMMENT) final String comment) throws TagDefinitionApiException {
+ tagUserApi.deleteTagDefinition(UUID.fromString(tagDefId), context.createContext(createdBy, reason, comment));
+ return Response.status(Status.NO_CONTENT).build();
+ }
+
+ @Override
+ protected ObjectType getObjectType() {
+ return ObjectType.TAG_DEFINITION;
}
}