it = hubList.iterator();
- while (it.hasNext()) {
- Hub hub = it.next();
- restEventPublisher.publish(hub, event);
-
-
- //Thread.currentThread().sleep(1000);
- }
- System.out.println("Sending Event After");
- }
-
- @Override
- public void publishTicketCreateNotification(TroubleTicket tt) {
- HubEvent event = new HubEvent();
- event.setEvent(tt);
- event.setEventType(TroubleTicketEventTypeEnum.TicketCreateNotification);
- publish(event);
-
- }
-
- @Override
- public void publishTicketStatusChangedNotification(TroubleTicket tt) {
-
- HubEvent event = new HubEvent();
- event.setEvent(tt);
- event.setEventType(TroubleTicketEventTypeEnum.TicketStatusChangedNotification);
- publish(event);
-
- }
-
- @Override
- public void publishTicketChangedNotification(TroubleTicket tt) {
-
- HubEvent event = new HubEvent();
- event.setEvent(tt);
- event.setEventType(TroubleTicketEventTypeEnum.TicketChangedNotification);
- publish(event);
-
- }
-
- @Override
- public void publishTicketClearanceRequestNotification(TroubleTicket tt) {
-
- HubEvent event = new HubEvent();
- event.setEvent(tt);
- event.setEventType(TroubleTicketEventTypeEnum.TicketClearanceRequestNotification);
- publish(event);
-
- }
-
- @Override
- public void publishInformationRequiredNotification(TroubleTicket tt) {
-
- HubEvent event = new HubEvent();
- event.setEvent(tt);
- event.setEventType(TroubleTicketEventTypeEnum.InformationRequiredNotification);
- publish(event);
-
- }
-}
diff --git a/src/java/tmf/org/dsmapi/hub/service/PublisherLocal.java b/src/java/tmf/org/dsmapi/hub/service/PublisherLocal.java
deleted file mode 100644
index bf0966e..0000000
--- a/src/java/tmf/org/dsmapi/hub/service/PublisherLocal.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-package tmf.org.dsmapi.hub.service;
-
-import javax.ejb.Local;
-import tmf.org.dsmapi.tt.TroubleTicket;
-
-/**
- *
- * @author pierregauthier
- */
-@Local
-public interface PublisherLocal {
-
- void publish(Object event);
-
- public void publishTicketCreateNotification(TroubleTicket tt);
-
- public void publishTicketStatusChangedNotification(TroubleTicket tt);
-
- public void publishTicketChangedNotification(TroubleTicket tt);
-
- public void publishTicketClearanceRequestNotification(TroubleTicket tt);
-
- public void publishInformationRequiredNotification(TroubleTicket tt);
-
-
-}
diff --git a/src/java/tmf/org/dsmapi/hub/service/RESTEventPublisher.java b/src/java/tmf/org/dsmapi/hub/service/RESTEventPublisher.java
deleted file mode 100644
index 88e3bd1..0000000
--- a/src/java/tmf/org/dsmapi/hub/service/RESTEventPublisher.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-package tmf.org.dsmapi.hub.service;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import javax.ejb.Asynchronous;
-import javax.ejb.Stateless;
-import tmf.org.dsmapi.hub.Hub;
-
-/**
- *
- * @author pierregauthier
- */
-@Stateless
-public class RESTEventPublisher implements RESTEventPublisherLocal {
-
- // Add business logic below. (Right-click in editor and choose
- // "Insert Code > Add Business Method")
-
- @Override
- @Asynchronous
- public void publish( Hub hub, Object event) {
-
- PostEventClient client = new PostEventClient(hub.getCallback());
-
- client.publishEvent(event);
-
- System.out.println("Sending Event");
- }
-
-}
diff --git a/src/java/tmf/org/dsmapi/hub/service/RESTEventPublisherLocal.java b/src/java/tmf/org/dsmapi/hub/service/RESTEventPublisherLocal.java
deleted file mode 100644
index c4206f0..0000000
--- a/src/java/tmf/org/dsmapi/hub/service/RESTEventPublisherLocal.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-package tmf.org.dsmapi.hub.service;
-
-import javax.ejb.Local;
-import tmf.org.dsmapi.hub.Hub;
-
-/**
- *
- * @author pierregauthier
- */
-@Local
-public interface RESTEventPublisherLocal {
-
- public void publish(Hub hub, Object event);
-
-}
diff --git a/src/java/tmf/org/dsmapi/tt/IncidentType.java b/src/java/tmf/org/dsmapi/tt/IncidentType.java
deleted file mode 100644
index 466301c..0000000
--- a/src/java/tmf/org/dsmapi/tt/IncidentType.java
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-package tmf.org.dsmapi.tt;
-
-/**
- * none that i know
- * @author pierregauthier ATMFORUM
- */
-public enum IncidentType {
- Submitted, Acknowledged, InProgress, Resolved, Closed, Rejected; //; is optional
-}
diff --git a/src/java/tmf/org/dsmapi/tt/client/TroubleTicketClient.java b/src/java/tmf/org/dsmapi/tt/client/TroubleTicketClient.java
deleted file mode 100644
index a9144c0..0000000
--- a/src/java/tmf/org/dsmapi/tt/client/TroubleTicketClient.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-package tmf.org.dsmapi.tt.client;
-
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.UniformInterfaceException;
-import com.sun.jersey.api.client.WebResource;
-
-/**
- * Jersey REST client generated for REST resource:TroubleTicketFacadeREST
- * [tmf.org.dsmapi.tt.troubleticket]
- * USAGE:
- *
- * TroubleTicketClient client = new TroubleTicketClient();
- * Object response = client.XXX(...);
- * // do whatever with response
- * client.close();
- *
- *
- * @author pierregauthier
- */
-public class TroubleTicketClient {
- private WebResource webResource;
- private Client client;
- private static final String BASE_URI = "http://localhost:8080/DSTroubleTicket/webresources";
-
- public TroubleTicketClient() {
- com.sun.jersey.api.client.config.ClientConfig config = new com.sun.jersey.api.client.config.DefaultClientConfig();
- client = Client.create(config);
- webResource = client.resource(BASE_URI).path("tmf.org.dsmapi.tt.troubleticket");
- }
-
- public void remove(String id) throws UniformInterfaceException {
- webResource.path(java.text.MessageFormat.format("{0}", new Object[]{id})).delete();
-
- }
-
- public String countREST() throws UniformInterfaceException {
- WebResource resource = webResource;
- resource = resource.path("count");
- return resource.accept(javax.ws.rs.core.MediaType.TEXT_PLAIN).get(String.class);
- }
-
- public T findAll(Class responseType) throws UniformInterfaceException {
- WebResource resource = webResource;
- return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_JSON).get(responseType);
- }
-
- public T edit(Class responseType, Object requestEntity) throws UniformInterfaceException {
- return webResource.type(javax.ws.rs.core.MediaType.APPLICATION_JSON).put(responseType, requestEntity);
- }
-
- public void create(Object requestEntity) throws UniformInterfaceException {
- webResource.type(javax.ws.rs.core.MediaType.APPLICATION_JSON).post(requestEntity);
- }
-
- public T proto(Class responseType) throws UniformInterfaceException {
- WebResource resource = webResource;
- resource = resource.path("proto");
- return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_JSON).get(responseType);
- }
-
- public T findRange(Class responseType, String from, String to) throws UniformInterfaceException {
- WebResource resource = webResource;
- resource = resource.path(java.text.MessageFormat.format("{0}/{1}", new Object[]{from, to}));
- return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_JSON).get(responseType);
- }
-
- public T find(Class responseType, String id) throws UniformInterfaceException {
- WebResource resource = webResource;
- resource = resource.path(java.text.MessageFormat.format("{0}", new Object[]{id}));
- return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_JSON).get(responseType);
- }
-
- public void close() {
- client.destroy();
- }
-
-}
diff --git a/src/java/tmf/org/dsmapi/tt/service/AdminFacadeREST.java b/src/java/tmf/org/dsmapi/tt/service/AdminFacadeREST.java
deleted file mode 100644
index 6b98b31..0000000
--- a/src/java/tmf/org/dsmapi/tt/service/AdminFacadeREST.java
+++ /dev/null
@@ -1,153 +0,0 @@
-package tmf.org.dsmapi.tt.service;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import javax.ejb.EJB;
-import javax.ejb.Stateless;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Response;
-import tmf.org.dsmapi.commons.exceptions.BadUsageException;
-import tmf.org.dsmapi.commons.exceptions.UnknownResourceException;
-import tmf.org.dsmapi.commons.utils.Format;
-import tmf.org.dsmapi.tt.service.TroubleTicketFacade;
-import tmf.org.dsmapi.tt.Note;
-import tmf.org.dsmapi.tt.RelatedObject;
-import tmf.org.dsmapi.tt.RelatedParty;
-import tmf.org.dsmapi.tt.Severity;
-import tmf.org.dsmapi.tt.Status;
-import tmf.org.dsmapi.tt.TroubleTicket;
-
-@Stateless
-@Path("admin")
-public class AdminFacadeREST {
-
- @EJB
- TroubleTicketFacade manager;
-
- @POST
- @Path("troubleTicket")
- @Consumes({"application/json"})
- @Produces({"application/json"})
- public Response post(List entities) {
-
- if (entities==null) return Response.status(Response.Status.BAD_REQUEST.getStatusCode()).build();
-
- int previousRows = manager.count();
- int affectedRows;
-
- // Try to persist entities
- try {
- affectedRows = manager.create(entities);
- } catch (BadUsageException e) {
- return Response.status(Response.Status.BAD_REQUEST.getStatusCode()).build();
- }
-
- Report stat = new Report(manager.count());
- stat.setAffectedRows(affectedRows);
- stat.setPreviousRows(previousRows);
-
- // 201 OK
- return Response.created(null).
- entity(stat).
- build();
- }
-
- @DELETE
- @Path("troubleTicket")
- public Report deleteAll() {
-
- int affectedRows = manager.removeAll();
-
- Report stat = new Report(manager.count());
- stat.setAffectedRows(affectedRows);
- stat.setPreviousRows(affectedRows);
-
- return stat;
- }
-
- @DELETE
- @Path("troubleTicket/{id}")
- public Report delete(@PathParam("id") String id) throws UnknownResourceException {
-
- int previousRows = manager.count();
-
- manager.remove(id);
- int affectedRows = 1;
-
- Report stat = new Report(manager.count());
- stat.setAffectedRows(affectedRows);
- stat.setPreviousRows(previousRows);
-
- return stat;
- }
-
- @GET
- @Path("troubleTicket/count")
- @Produces({"application/json"})
- public Report count() {
- return new Report(manager.count());
- }
-
- @DELETE
- @Path("troubleTicket/cache")
- public void clearCache() {
- manager.invalidCache();
- }
-
-
-
- @GET
- @Path("troubleTicket/mock")
- @Produces({"application/json"})
- public TroubleTicket proto() {
- TroubleTicket tt = new TroubleTicket();
- tt.setId("id");
- Date dt = new Date();
- String dts = Format.toString(dt);
- tt.setDescription("Some Description");
-
-
- tt.setCreationDate(dts);
- tt.setStatus(Status.Acknowledged);
- tt.setSeverity(Severity.Medium);
- tt.setType("Bills, charges or payment");
- tt.setResolutionDate(dts);
- tt.setTargetResolutionDate(dts);
-
- RelatedObject ro = new RelatedObject();
- ro.setInvolvement("involvment");
- ro.setReference("referenceobject");
-
- List relatedObjects = new ArrayList ();
- relatedObjects.add(ro);
- relatedObjects.add(ro);
- tt.setRelatedObjects(relatedObjects);
-
- RelatedParty rp = new RelatedParty();
- rp.setRole("role");
- rp.setReference("reference party");
-
- List relatedParties = new ArrayList ();
- relatedParties.add(rp);
- relatedParties.add(rp);
- tt.setRelatedParties(relatedParties);
-
- Note note = new Note();
- note.setAuthor("author");
- note.setDate(dts);
- note.setText("text");
- List notes = new ArrayList ();
- notes.add(note);
- notes.add(note);
- tt.setNotes(notes);
- return tt;
-
- }
-}
diff --git a/src/java/tmf/org/dsmapi/tt/service/TroubleTicketFacade.java b/src/java/tmf/org/dsmapi/tt/service/TroubleTicketFacade.java
deleted file mode 100644
index 0c6281f..0000000
--- a/src/java/tmf/org/dsmapi/tt/service/TroubleTicketFacade.java
+++ /dev/null
@@ -1,197 +0,0 @@
-package tmf.org.dsmapi.tt.service;
-
-import tmf.org.dsmapi.tt.TroubleTicketField;
-import java.util.Date;
-import java.util.List;
-import tmf.org.dsmapi.tt.TroubleTicket;
-import java.util.Set;
-import javax.annotation.PostConstruct;
-import javax.ejb.Stateless;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.ws.rs.core.MultivaluedMap;
-import tmf.org.dsmapi.commons.exceptions.BadUsageException;
-import tmf.org.dsmapi.commons.exceptions.ExceptionType;
-import tmf.org.dsmapi.commons.exceptions.UnknownResourceException;
-import tmf.org.dsmapi.commons.utils.Format;
-import static tmf.org.dsmapi.tt.TroubleTicketField.CORRELATION_ID;
-import static tmf.org.dsmapi.tt.TroubleTicketField.CREATION_DATE;
-import static tmf.org.dsmapi.tt.TroubleTicketField.DESCRIPTION;
-import static tmf.org.dsmapi.tt.TroubleTicketField.NOTES;
-import static tmf.org.dsmapi.tt.TroubleTicketField.RELATED_OBJECTS;
-import static tmf.org.dsmapi.tt.TroubleTicketField.RELATED_PARTIES;
-import static tmf.org.dsmapi.tt.TroubleTicketField.RESOLUTION_DATE;
-import static tmf.org.dsmapi.tt.TroubleTicketField.SEVERITY;
-import static tmf.org.dsmapi.tt.TroubleTicketField.STATUS;
-import static tmf.org.dsmapi.tt.TroubleTicketField.STATUS_CHANGE_REASON;
-import static tmf.org.dsmapi.tt.TroubleTicketField.SUB_STATUS;
-import static tmf.org.dsmapi.tt.TroubleTicketField.TARGET_RESOLUTION_DATE;
-import static tmf.org.dsmapi.tt.TroubleTicketField.TYPE;
-import tmf.org.dsmapi.tt.Status;
-
-/**
- *
- * @author maig7313
- *
- */
-@Stateless
-public class TroubleTicketFacade extends AbstractFacade {
-
- @PersistenceContext(unitName = "DSTroubleTicketPU")
- private EntityManager em;
- private CriteriaBuilder cb;
-
- @PostConstruct
- private void init() {
- cb = em.getCriteriaBuilder();
- }
-
- /**
- *
- */
- public TroubleTicketFacade() {
- super(TroubleTicket.class);
- }
-
- public TroubleTicket edit(String id, TroubleTicket tt) throws UnknownResourceException {
- tt.setId(id);
- return super.edit(id, tt);
- }
-
- /**
- *
- * @param partialTT
- * @return
- */
- public TroubleTicket partialEdit(String id, TroubleTicket partialTT) throws BadUsageException, UnknownResourceException {
-
- TroubleTicket currentTT = this.find(id);
-
- if (currentTT == null) {
- throw new UnknownResourceException(ExceptionType.UNKNOWN_RESOURCE);
- }
-
- Set tokens = partialTT.getFieldsIN();
-
- if (tokens.contains(STATUS) & !(tokens.contains(STATUS_CHANGE_REASON))) {
- throw new BadUsageException(ExceptionType.BAD_USAGE_MANDATORY_FIELDS, "While updating 'status', please provide a 'statusChangeReason'");
- }
-
- if (tokens.contains(STATUS)) {
- if (WorkflowValidator.isCorrect(currentTT.getStatus(), partialTT.getStatus())) {
- currentTT.setStatus(partialTT.getStatus());
- currentTT.setStatusChangeDate(Format.toString(new Date()));
- currentTT.setStatusChangeReason(partialTT.getStatusChangeReason());
- } else {
- throw new BadUsageException(ExceptionType.BAD_USAGE_STATUS_TRANSITION, "current=" + currentTT.getStatus() + " sent=" + partialTT.getStatus());
- }
- }
-
- for (TroubleTicketField token : tokens) {
- switch (token) {
- case CORRELATION_ID:
- currentTT.setCorrelationId(partialTT.getCorrelationId());
- break;
- case CREATION_DATE:
- currentTT.setCreationDate(partialTT.getCreationDate());
- break;
- case DESCRIPTION:
- if (partialTT.getDescription() != null) {
- currentTT.setDescription(partialTT.getDescription());
- }
- break;
- case NOTES:
- currentTT.setNotes(partialTT.getNotes());
- break;
- case RELATED_OBJECTS:
- currentTT.setRelatedObjects(partialTT.getRelatedObjects());
- break;
- case RELATED_PARTIES:
- currentTT.setRelatedParties(partialTT.getRelatedParties());
- break;
- case RESOLUTION_DATE:
- currentTT.setResolutionDate(partialTT.getResolutionDate());
- break;
- case SEVERITY:
- if (partialTT.getSeverity() != null) {
- currentTT.setSeverity(partialTT.getSeverity());
- }
- break;
- case SUB_STATUS:
- currentTT.setSubStatus(partialTT.getSubStatus());
- break;
- case TARGET_RESOLUTION_DATE:
- currentTT.setResolutionDate(partialTT.getResolutionDate());
- break;
- case TYPE:
- if (partialTT.getDescription() != null) {
- currentTT.setType(partialTT.getType());
- }
- break;
- }
- }
-
- return currentTT;
-
- }
-
- @Override
- public void create(TroubleTicket tt) throws BadUsageException {
-
- if (tt.getId() != null) {
- throw new BadUsageException(ExceptionType.BAD_USAGE_GENERIC, "While creating a TT id should be null");
- }
-
- if ((tt.getDescription() == null) || (tt.getSeverity() == null) || (tt.getType() == null)) {
- String fieldName = null;
- if (tt.getDescription() == null) {
- fieldName = TroubleTicketField.DESCRIPTION.getText();
- } else {
- if (tt.getSeverity() == null) {
- fieldName = TroubleTicketField.SEVERITY.getText();
- } else if (tt.getType() == null) {
- fieldName = TroubleTicketField.TYPE.getText();
- }
- }
- throw new BadUsageException(ExceptionType.BAD_USAGE_MANDATORY_FIELDS, fieldName);
- }
-
- tt.setStatus(Status.Submitted);
- tt.setStatusChangeDate(Format.toString(new Date()));
- tt.setStatusChangeReason("Creation");
-
- super.create(tt);
- }
-
- /**
- *
- * @return
- */
- @Override
- protected EntityManager getEntityManager() {
- return em;
- }
-
- public List find(MultivaluedMap queryParameters) {
-
- List tickets;
- if (queryParameters != null && !queryParameters.isEmpty()) {
- tickets = findByCriteria(queryParameters, TroubleTicket.class);
- } else {
- tickets = this.findAll();
- }
- return tickets;
-
- }
-
- public int removeAll() {
- List tickets = this.findAll();
- int size = tickets.size();
- for (TroubleTicket tt : tickets) {
- em.remove(tt);
- }
- return size;
- }
-}
diff --git a/src/java/tmf/org/dsmapi/tt/service/TroubleTicketFacadeREST.java b/src/java/tmf/org/dsmapi/tt/service/TroubleTicketFacadeREST.java
deleted file mode 100644
index 5723843..0000000
--- a/src/java/tmf/org/dsmapi/tt/service/TroubleTicketFacadeREST.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-package tmf.org.dsmapi.tt.service;
-//changes22222 now look agan too much bbbbb cccc vvvvv last vvv mo
-
-import tmf.org.dsmapi.tt.service.mapper.FacadeRestUtil;
-import tmf.org.dsmapi.commons.jaxrs.PATCH;
-import tmf.org.dsmapi.tt.TroubleTicket;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
-import javax.ejb.EJB;
-import javax.ejb.Stateless;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriBuilder;
-import javax.ws.rs.core.UriInfo;
-import org.codehaus.jackson.node.ObjectNode;
-import tmf.org.dsmapi.commons.exceptions.BadUsageException;
-import tmf.org.dsmapi.commons.exceptions.UnknownResourceException;
-import tmf.org.dsmapi.hub.service.PublisherLocal;
-import tmf.org.dsmapi.tt.service.TroubleTicketFacade;
-
-/**
- *
- * @author pierregauthier
- */
-@Stateless
-@Path("troubleTicket")
-public class TroubleTicketFacadeREST {
-
- @Context
- UriInfo uriInfo;
- @EJB
- TroubleTicketFacade manager;
- @EJB
- PublisherLocal publisher;
-
- public TroubleTicketFacadeREST() {
- }
-
- /*
- * RESOURCE
- * troubleTicket
- */
- @GET
- @Produces({"application/json"})
- public Response list(@Context UriInfo info) {
-
- Response response = null;
- // search queryParameters
- MultivaluedMap queryParameters = info.getQueryParameters();
- // fields to filter view
- Set fieldSet = FacadeRestUtil.getFieldSet(queryParameters);
-
- List resultList = manager.find(queryParameters);
-
- if (fieldSet.isEmpty() || fieldSet.contains(FacadeRestUtil.ALL_FIELDS)) {
-
- response = Response.ok(resultList).build();
-
- } else {
-
- fieldSet.add(FacadeRestUtil.ID_FIELD);
- List nodeList = new ArrayList();
- ObjectNode node;
- for (TroubleTicket tt : resultList) {
- node = FacadeRestUtil.createNodeViewWithFields(tt, fieldSet);
- nodeList.add(node);
- }
- response = Response.ok(nodeList).build();
-
- }
-
- return response;
- }
-
- @POST
- @Consumes({"application/json"})
- @Produces({"application/json"})
- public Response post(TroubleTicket entity) throws BadUsageException {
-
- manager.create(entity);
-
- System.out.println("Calling Publish");
- publisher.publishTicketCreateNotification(entity);
- System.out.println("After Calling Publish");
-
- // 201 OK + location
- UriBuilder uriBuilder = UriBuilder.fromUri(uriInfo.getRequestUri());
- String id = entity.getId();
- uriBuilder.path("{id}");
- return Response.created(uriBuilder.build(id)).
- entity(entity).
- build();
-
- }
-
- /*
- * RESOURCE
- * troubleTicket/{id}
- */
- @PUT
- @Path("{id}")
- @Consumes({"application/json"})
- @Produces({"application/json"})
- public Response put(@PathParam("id") String id, TroubleTicket entity) throws UnknownResourceException {
-
- // Try to merge
- entity = manager.edit(id, entity);
-
- publisher.publishTicketChangedNotification(entity);
- publisher.publishTicketStatusChangedNotification(entity);
-
- // 201 OK + location
- UriBuilder uriBuilder = UriBuilder.fromUri(uriInfo.getRequestUri());
- uriBuilder.path("{id}");
- return Response.created(uriBuilder.build(id)).
- entity(entity).
- build();
- }
-
- //X-HTTP-Method-Override on POST
- @PATCH
- @Path("{id}")
- @Consumes({"application/json"})
- @Produces({"application/json"})
- public Response patch(@PathParam("id") String id, TroubleTicket partialTT) throws BadUsageException, UnknownResourceException {
-
- TroubleTicket fullTT = manager.partialEdit(id, partialTT);
-
- publisher.publishTicketChangedNotification(partialTT);
- publisher.publishTicketStatusChangedNotification(partialTT);
-
- // 201 OK + location
- UriBuilder uriBuilder = UriBuilder.fromUri(uriInfo.getRequestUri());
- id = fullTT.getId();
- uriBuilder.path("{id}");
- return Response.created(uriBuilder.build(id)).
- entity(fullTT).
- build();
-
-
- }
-
- @GET
- @Path("{id}")
- @Produces({"application/json"})
- public Response get(@PathParam("id") String id, @Context UriInfo info) throws UnknownResourceException {
-
- Response response = null;
- TroubleTicket tt = manager.find(id);
-
- MultivaluedMap queryParameters = info.getQueryParameters();
- Set fieldSet = FacadeRestUtil.getFieldSet(queryParameters);
-
- if (fieldSet.isEmpty() || fieldSet.contains(FacadeRestUtil.ALL_FIELDS)) {
- response = Response.ok(tt).build();
- } else {
- fieldSet.add(FacadeRestUtil.ID_FIELD);
- ObjectNode root = FacadeRestUtil.createNodeViewWithFields(tt, fieldSet);
- response = Response.ok(root).build();
- }
-
- return response;
- }
-
- public static Date parse(String input) throws java.text.ParseException {
-
- //NOTE: SimpleDateFormat uses GMT[-+]hh:mm for the TZ which breaks
- //things a bit. Before we go on we have to repair this.
- SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");
-
- //this is zero time so we need to add that TZ indicator for
- if (input.endsWith("Z")) {
- input = input.substring(0, input.length() - 1) + "GMT-00:00";
- } else {
- int inset = 6;
- String s0 = input.substring(0, input.length() - inset);
- String s1 = input.substring(input.length() - inset, input.length());
- input = s0 + "GMT" + s1;
- }
-
- return df.parse(input);
-
- }
-}
diff --git a/src/java/tmf/org/dsmapi/tt/service/WorkflowValidator.java b/src/java/tmf/org/dsmapi/tt/service/WorkflowValidator.java
deleted file mode 100644
index 882a4d9..0000000
--- a/src/java/tmf/org/dsmapi/tt/service/WorkflowValidator.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package tmf.org.dsmapi.tt.service;
-
-import tmf.org.dsmapi.tt.Status;
-import static tmf.org.dsmapi.tt.Status.Acknowledged;
-import static tmf.org.dsmapi.tt.Status.Cancelled;
-import static tmf.org.dsmapi.tt.Status.Rejected;
-import static tmf.org.dsmapi.tt.Status.Resolved;
-import static tmf.org.dsmapi.tt.Status.Submitted;
-
-public class WorkflowValidator {
-
- public static boolean isCorrect(Status current, Status next) {
-
- boolean valid = false;
-
- switch (current) {
- case Submitted:
- switch (next) {
- case Rejected:
- case Acknowledged:
- valid = true;
- break;
- }
- break;
- case Acknowledged:
- switch (next) {
- case InProgress_Held:
- case InProgress_Pending:
- case Cancelled:
- valid = true;
- break;
- }
- break;
- case InProgress_Held:
- case InProgress_Pending:
- switch (next) {
- case Resolved:
- case Cancelled:
- valid = true;
- break;
- }
- break;
- case Resolved:
- switch (next) {
- case Closed:
- case InProgress_Held:
- case InProgress_Pending:
- valid = true;
- break;
- }
- break;
- }
- return valid;
- }
-
-}
diff --git a/src/java/tmf/org/dsmapi/tt/service/mapper/FacadeRestUtil.java b/src/java/tmf/org/dsmapi/tt/service/mapper/FacadeRestUtil.java
deleted file mode 100644
index f5f7cd7..0000000
--- a/src/java/tmf/org/dsmapi/tt/service/mapper/FacadeRestUtil.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-package tmf.org.dsmapi.tt.service.mapper;
-
-import com.sun.jersey.core.util.MultivaluedMapImpl;
-import java.math.BigDecimal;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import javax.ws.rs.core.MultivaluedMap;
-import org.apache.commons.beanutils.PropertyUtilsBean;
-import org.codehaus.jackson.JsonNode;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.node.ArrayNode;
-import org.codehaus.jackson.node.ObjectNode;
-
-/**
- *
- * @author jyus7291
- */
-public class FacadeRestUtil {
-
- private static PropertyUtilsBean pub = new PropertyUtilsBean();
- /**
- *
- */
- public static final String ALL_FIELDS = "all";
- /**
- *
- */
- public static final String ID_FIELD = "id";
- /**
- *
- */
- public static final String QUERY_KEY_FIELD = "fields";
- /**
- *
- */
- public static final String QUERY_KEY_FIELD_ESCAPE = ":";
-
- /**
- *
- * @param bean
- * @param fieldNames
- * @return
- */
- public static ObjectNode createNodeViewWithFields(Object bean, Set fieldNames) {
- ObjectMapper mapper = new ObjectMapper();
- return createNodeViewWithFields(mapper, bean, fieldNames);
- }
-
- private static ObjectNode createNodeViewWithFields(ObjectMapper mapper, Object bean, Set fieldNames) {
- // split fieldNames in 2 categories :
- // simpleFields for simple property names with no '.'
- // nestedFields for nested property names with a '.'
- Set simpleFields = new HashSet();
- MultivaluedMapImpl nestedFields = new MultivaluedMapImpl();
- for (String fieldName : fieldNames) {
- int index = fieldName.indexOf('.');
- boolean isNestedField = index > 0 && index < fieldName.length();
- if (isNestedField) {
- String rootFieldName = fieldName.substring(0, index);
- String subFieldName = fieldName.substring(index + 1);
- nestedFields.add(rootFieldName, subFieldName);
- } else {
- simpleFields.add(fieldName);
- }
- }
-
- // create a simple node with only one level containing all simples properties
- ObjectNode rootNode = createNodeWithSimpleFields(mapper, bean, simpleFields);
-
- // create nested nodes with deeper levels
- Set>> entrySet = nestedFields.entrySet();
- // for each nested property, create recursively a node
- for (Map.Entry> entry : entrySet) {
- String rootFieldName = entry.getKey();
- // add in current node only if full property is not already present in 1st level
- if (!simpleFields.contains(rootFieldName)) {
- Object nestedBean = getField(bean, rootFieldName);
- // add only non null fields
- if (nestedBean == null) {
- break;
- }
- Set nestedFieldNames = new HashSet(entry.getValue());
- // current node is an array
- if (nestedBean.getClass().isArray()) {
- Object[] array = (Object[]) nestedBean;
- if (array.length > 0) {
- // create a node for each element in array
- // and add created node in an arrayNode
- Collection nodes = new LinkedList();
- for (Object object : array) {
- ObjectNode nestedNode = createNodeViewWithFields(mapper, object, nestedFieldNames);
- nodes.add(nestedNode);
- }
- ArrayNode arrayNode = mapper.createArrayNode();
- arrayNode.addAll(nodes);
- rootNode.put(rootFieldName, arrayNode);
- }
- } else {
- // create recursively a node and add it in current root node
- ObjectNode nestedNode = createNodeViewWithFields(mapper, nestedBean, nestedFieldNames);
- rootNode.put(rootFieldName, nestedNode);
- }
- }
- }
- return rootNode;
- }
-
- // create a simple flat node with only one-level fields
- private static ObjectNode createNodeWithSimpleFields(ObjectMapper mapper, Object bean, Set fieldNames) {
- ObjectNode node = mapper.createObjectNode();
- for (String fieldName : fieldNames) {
- Object fieldValue = getField(bean, fieldName);
- if (fieldValue != null) {
- nodePut(node, fieldName, fieldValue);
- }
- }
- return node;
- }
-
- // generic node.put for any Object
- private static void nodePut(ObjectNode node, String fieldName, Object value) {
- if (value instanceof Boolean) {
- node.put(fieldName, (Boolean) value);
- } else if (value instanceof Integer) {
- node.put(fieldName, (Integer) value);
- } else if (value instanceof Long) {
- node.put(fieldName, (Long) value);
- } else if (value instanceof Float) {
- node.put(fieldName, (Float) value);
- } else if (value instanceof Double) {
- node.put(fieldName, (Double) value);
- } else if (value instanceof BigDecimal) {
- node.put(fieldName, (BigDecimal) value);
- } else if (value instanceof String) {
- node.put(fieldName, (String) value);
- } else {
- node.putPOJO(fieldName, value);
- }
-
- }
-
- // get value of field named "name" in bean
- /**
- *
- * @param bean
- * @param name
- * @return
- */
- public static Object getField(Object bean, String name) {
- try {
- return pub.getNestedProperty(bean, name);
- } catch (Exception e) {
- return null;
- }
- }
-
- /**
- *
- * @param queryParameters
- * @return
- */
- public static Set getFieldSet(MultivaluedMap queryParameters) {
- Set fieldSet = new HashSet();
- if (queryParameters != null) {
- List queryParameterField = queryParameters.remove(QUERY_KEY_FIELD_ESCAPE + QUERY_KEY_FIELD);
- if (queryParameterField == null) {
- queryParameterField = queryParameters.remove(QUERY_KEY_FIELD);
- }
- if (queryParameterField != null && !queryParameterField.isEmpty()) {
- String queryParameterValue = queryParameterField.get(0);
- if (queryParameterValue != null) {
- String[] tokenArray = queryParameterValue.split(",");
- fieldSet.addAll(Arrays.asList(tokenArray));
- }
- }
- }
- return fieldSet;
- }
-}
diff --git a/src/java/tmf/org/dsmapi/tt/service/mapper/TroubleTicketReader.java b/src/java/tmf/org/dsmapi/tt/service/mapper/TroubleTicketReader.java
deleted file mode 100644
index 6902d58..0000000
--- a/src/java/tmf/org/dsmapi/tt/service/mapper/TroubleTicketReader.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package tmf.org.dsmapi.tt.service.mapper;
-
-import tmf.org.dsmapi.tt.TroubleTicketField;
-import tmf.org.dsmapi.tt.TroubleTicket;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.ext.MessageBodyReader;
-import javax.ws.rs.ext.Provider;
-import org.codehaus.jackson.JsonNode;
-import org.codehaus.jackson.map.ObjectMapper;
-
-/**
- *
- */
-@Provider
-@Consumes({"application/json"})
-public class TroubleTicketReader implements MessageBodyReader {
-
- /**
- *
- * @param type
- * @param genericType
- * @param annotations
- * @param mediaType
- * @return
- */
- @Override
- public boolean isReadable(Class> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
- return TroubleTicket.class.isAssignableFrom(type);
- }
-
- /**
- *
- * @param type
- * @param type1
- * @param antns
- * @param mediaType
- * @param httpHeaders
- * @param entityStream
- * @return
- * @throws IOException
- * @throws WebApplicationException
- */
- @Override
- public TroubleTicket readFrom(Class type,
- Type type1,
- Annotation[] antns,
- MediaType mediaType,
- MultivaluedMap httpHeaders,
- InputStream entityStream)
- throws IOException, WebApplicationException {
-
- TroubleTicket tt;
-
- System.out.println("=== TroubleTicket MessageBodyReader ENABLE ===");
-
- ObjectMapper mapper = new ObjectMapper();
- JsonNode root = mapper.readValue(entityStream, JsonNode.class);
-
- Set tokenList = new HashSet();
-
- // Iterate over first level to set received tokens
- Iterator it = root.getFieldNames();
- while (it.hasNext()) {
- tokenList.add(TroubleTicketField.fromString(it.next()));
- }
-
- tt = mapper.readValue(root, TroubleTicket.class);
- tt.setFieldsIN(tokenList);
-
- return tt;
- }
-
-}
diff --git a/src/java/tmf/org/dsmapi/commons/exceptions/BadUsageException.java b/src/main/java/org/tmf/dsmapi/commons/exceptions/BadUsageException.java
similarity index 86%
rename from src/java/tmf/org/dsmapi/commons/exceptions/BadUsageException.java
rename to src/main/java/org/tmf/dsmapi/commons/exceptions/BadUsageException.java
index 2ba7186..0e41f42 100644
--- a/src/java/tmf/org/dsmapi/commons/exceptions/BadUsageException.java
+++ b/src/main/java/org/tmf/dsmapi/commons/exceptions/BadUsageException.java
@@ -1,4 +1,4 @@
-package tmf.org.dsmapi.commons.exceptions;
+package org.tmf.dsmapi.commons.exceptions;
public class BadUsageException extends FunctionalException {
diff --git a/src/java/tmf/org/dsmapi/commons/exceptions/ExceptionBean.java b/src/main/java/org/tmf/dsmapi/commons/exceptions/ExceptionBean.java
similarity index 93%
rename from src/java/tmf/org/dsmapi/commons/exceptions/ExceptionBean.java
rename to src/main/java/org/tmf/dsmapi/commons/exceptions/ExceptionBean.java
index 38cb694..791740e 100644
--- a/src/java/tmf/org/dsmapi/commons/exceptions/ExceptionBean.java
+++ b/src/main/java/org/tmf/dsmapi/commons/exceptions/ExceptionBean.java
@@ -1,4 +1,4 @@
-package tmf.org.dsmapi.commons.exceptions;
+package org.tmf.dsmapi.commons.exceptions;
public class ExceptionBean {
diff --git a/src/java/tmf/org/dsmapi/commons/exceptions/ExceptionType.java b/src/main/java/org/tmf/dsmapi/commons/exceptions/ExceptionType.java
similarity index 78%
rename from src/java/tmf/org/dsmapi/commons/exceptions/ExceptionType.java
rename to src/main/java/org/tmf/dsmapi/commons/exceptions/ExceptionType.java
index 99e40b7..99ff710 100644
--- a/src/java/tmf/org/dsmapi/commons/exceptions/ExceptionType.java
+++ b/src/main/java/org/tmf/dsmapi/commons/exceptions/ExceptionType.java
@@ -1,4 +1,4 @@
-package tmf.org.dsmapi.commons.exceptions;
+package org.tmf.dsmapi.commons.exceptions;
public enum ExceptionType {
@@ -7,6 +7,9 @@ public enum ExceptionType {
BAD_USAGE_STATUS_TRANSITION(new ExceptionBean("4002", "The status transition is not allowed")),
BAD_USAGE_MANDATORY_FIELDS(new ExceptionBean("4003", "Missing mandatory field")),
BAD_USAGE_UNKNOWN_VALUE(new ExceptionBean("4004", "Unknown value")),
+ BAD_USAGE_OPERATOR(new ExceptionBean("4011", "Wrong operator usage")),
+ BAD_USAGE_FORMAT(new ExceptionBean("4012", "Wrong format")),
+ TECHNICAL(new ExceptionBean("9000", "Technical error")),
UNKNOWN_RESOURCE(new ExceptionBean("4041", "Unknown resource"));
private ExceptionBean info;
diff --git a/src/java/tmf/org/dsmapi/commons/exceptions/FunctionalException.java b/src/main/java/org/tmf/dsmapi/commons/exceptions/FunctionalException.java
similarity index 71%
rename from src/java/tmf/org/dsmapi/commons/exceptions/FunctionalException.java
rename to src/main/java/org/tmf/dsmapi/commons/exceptions/FunctionalException.java
index ba9450d..16689ed 100644
--- a/src/java/tmf/org/dsmapi/commons/exceptions/FunctionalException.java
+++ b/src/main/java/org/tmf/dsmapi/commons/exceptions/FunctionalException.java
@@ -1,6 +1,8 @@
-package tmf.org.dsmapi.commons.exceptions;
+package org.tmf.dsmapi.commons.exceptions;
import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
/**
* generic class for all functional exceptions. Functional exceptions must be
@@ -12,6 +14,7 @@ public class FunctionalException extends Exception implements Serializable {
private String localisationClass;
private String localisationMethod;
private ExceptionType type;
+ private List keyValue;
public FunctionalException() {
@@ -89,5 +92,27 @@ public ExceptionType getType() {
public void setType(ExceptionType type) {
this.type = type;
}
-
+
+ /**
+ * @return the keyValue
+ */
+ public List getKeyValue() {
+ return keyValue;
+ }
+
+ public List addKeyValue(KeyValue keyValue) {
+ if (this.keyValue == null) {
+ this.keyValue = new ArrayList();
+ }
+ this.keyValue.add(keyValue);
+ return this.keyValue;
+ }
+
+ public List addKeyValue(String key, String value) {
+ if (this.keyValue == null) {
+ this.keyValue = new ArrayList();
+ }
+ this.keyValue.add(new KeyValue(key, value));
+ return this.keyValue;
+ }
}
diff --git a/src/main/java/org/tmf/dsmapi/commons/exceptions/KeyValue.java b/src/main/java/org/tmf/dsmapi/commons/exceptions/KeyValue.java
new file mode 100644
index 0000000..c1d8763
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/commons/exceptions/KeyValue.java
@@ -0,0 +1,39 @@
+package org.tmf.dsmapi.commons.exceptions;
+
+public class KeyValue {
+ private String key;
+ private String value;
+
+ public KeyValue(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ /**
+ * @return the key
+ */
+ public String getKey() {
+ return key;
+ }
+
+ /**
+ * @param key the key to set
+ */
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ /**
+ * @return the value
+ */
+ public String getValue() {
+ return value;
+ }
+
+ /**
+ * @param value the value to set
+ */
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/src/main/java/org/tmf/dsmapi/commons/exceptions/TechnicalException.java b/src/main/java/org/tmf/dsmapi/commons/exceptions/TechnicalException.java
new file mode 100644
index 0000000..f342b3f
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/commons/exceptions/TechnicalException.java
@@ -0,0 +1,113 @@
+package org.tmf.dsmapi.commons.exceptions;
+
+import java.io.Serializable;
+
+/**
+ * generic class for all functional exceptions. Functional exceptions must be
+ * checked exceptions
+ */
+public class TechnicalException extends RuntimeException implements Serializable {
+
+ private static final long serialVersionUID = 7552671441723224932L;
+ private String localisationClass;
+ private String localisationMethod;
+ private ExceptionType type = ExceptionType.TECHNICAL;
+
+
+ /**
+ *
+ */
+ public TechnicalException() {
+ super();
+ localisationClass = "";
+ localisationMethod = "";
+ }
+
+ /**
+ *
+ * @param message
+ */
+ public TechnicalException(String message) {
+ super(message);
+ localisationClass = "";
+ localisationMethod = "";
+ }
+
+ /**
+ *
+ * @param message
+ * @param cause
+ */
+ public TechnicalException(String message, Throwable cause) {
+ super(message, cause);
+ localisationClass = "";
+ localisationMethod = "";
+ }
+
+ /**
+ *
+ * @param cause
+ */
+ public TechnicalException(Throwable cause) {
+ super(cause);
+ localisationClass = "";
+ localisationMethod = "";
+ }
+
+ /**
+ *
+ * @param clazz
+ * @param method
+ * @param message
+ */
+ public TechnicalException(String clazz, String method, String message) {
+ super(message);
+ localisationClass = clazz;
+ localisationMethod = method;
+ }
+
+ /**
+ *
+ * @param clazz
+ * @param method
+ * @param message
+ * @param cause
+ */
+ public TechnicalException(String clazz, String method, String message, Throwable cause) {
+ super(message, cause);
+ localisationClass = clazz;
+ localisationMethod = method;
+ }
+
+ /**
+ *
+ * @return
+ */
+ public String getLocalisationClasse() {
+ return localisationClass;
+ }
+
+ /**
+ *
+ * @return
+ */
+ public String getLocalisationMethod() {
+ return localisationMethod;
+ }
+
+ /**
+ *
+ * @return
+ */
+ public String getLocalisation() {
+ return localisationClass + "." + localisationMethod;
+ }
+
+ /**
+ * @return the type
+ */
+ public ExceptionType getType() {
+ return type;
+ }
+
+}
diff --git a/src/java/tmf/org/dsmapi/commons/exceptions/UnknownResourceException.java b/src/main/java/org/tmf/dsmapi/commons/exceptions/UnknownResourceException.java
similarity index 86%
rename from src/java/tmf/org/dsmapi/commons/exceptions/UnknownResourceException.java
rename to src/main/java/org/tmf/dsmapi/commons/exceptions/UnknownResourceException.java
index b09253d..1318aaf 100644
--- a/src/java/tmf/org/dsmapi/commons/exceptions/UnknownResourceException.java
+++ b/src/main/java/org/tmf/dsmapi/commons/exceptions/UnknownResourceException.java
@@ -1,4 +1,4 @@
-package tmf.org.dsmapi.commons.exceptions;
+package org.tmf.dsmapi.commons.exceptions;
public class UnknownResourceException extends FunctionalException {
diff --git a/src/java/tmf/org/dsmapi/tt/service/AbstractFacade.java b/src/main/java/org/tmf/dsmapi/commons/facade/AbstractFacade.java
similarity index 51%
rename from src/java/tmf/org/dsmapi/tt/service/AbstractFacade.java
rename to src/main/java/org/tmf/dsmapi/commons/facade/AbstractFacade.java
index a3e2063..273f33d 100644
--- a/src/java/tmf/org/dsmapi/tt/service/AbstractFacade.java
+++ b/src/main/java/org/tmf/dsmapi/commons/facade/AbstractFacade.java
@@ -1,15 +1,16 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-package tmf.org.dsmapi.tt.service;
+package org.tmf.dsmapi.commons.facade;
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Date;
import java.util.List;
import java.util.Map;
-import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
@@ -19,29 +20,42 @@
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.ws.rs.core.MultivaluedMap;
-import tmf.org.dsmapi.commons.exceptions.BadUsageException;
-import tmf.org.dsmapi.commons.exceptions.ExceptionType;
-import tmf.org.dsmapi.commons.exceptions.UnknownResourceException;
-import static tmf.org.dsmapi.tt.service.mapper.FacadeRestUtil.QUERY_KEY_FIELD;
-import static tmf.org.dsmapi.tt.service.mapper.FacadeRestUtil.QUERY_KEY_FIELD_ESCAPE;
-import tmf.org.dsmapi.tt.Status;
-import tmf.org.dsmapi.tt.TroubleTicket;
+import org.tmf.dsmapi.commons.exceptions.BadUsageException;
+import org.tmf.dsmapi.commons.exceptions.ExceptionType;
+import org.tmf.dsmapi.commons.exceptions.UnknownResourceException;
+import org.tmf.dsmapi.commons.utils.TMFDate;
/**
- * xxxxx
*
* @author pierregauthier
*/
public abstract class AbstractFacade {
+
private Class entityClass;
+ private static final String pattern = "yyyy-MM-dd'T'HH:mm:ssZ";
+ private static SimpleDateFormat formatter = new SimpleDateFormat(pattern);
+ /**
+ *
+ * @param entityClass
+ */
public AbstractFacade(Class entityClass) {
this.entityClass = entityClass;
}
+ /**
+ *
+ * @return
+ */
protected abstract EntityManager getEntityManager();
+ /**
+ *
+ * @param entities
+ * @return
+ * @throws BadUsageException
+ */
public int create(List entities) throws BadUsageException {
for (T entity : entities) {
this.create(entity);
@@ -49,24 +63,50 @@ public int create(List entities) throws BadUsageException {
return entities.size();
}
+ /**
+ *
+ * @param entity
+ * @throws BadUsageException
+ */
public void create(T entity) throws BadUsageException {
getEntityManager().persist(entity);
}
- public T edit(String id, T entity) throws UnknownResourceException {
- T targetEntity = this.find(id);
- if (targetEntity == null) {
- throw new UnknownResourceException(ExceptionType.UNKNOWN_RESOURCE);
- }
+ /**
+ *
+ * @param entity
+ * @return
+ * @throws UnknownResourceException
+ */
+ public T edit(T entity) throws UnknownResourceException {
getEntityManager().merge(entity);
return entity;
}
+ /**
+ *
+ * @param id
+ * @throws UnknownResourceException
+ */
public void remove(Object id) throws UnknownResourceException {
T entity = getEntityManager().find(entityClass, id);
getEntityManager().remove(getEntityManager().merge(entity));
}
+ public void removeAll() {
+ List all = findAll();
+ EntityManager em = getEntityManager();
+ for (T entity : all) {
+ em.remove(entity);
+ }
+ }
+
+ /**
+ *
+ * @param id
+ * @return
+ * @throws UnknownResourceException
+ */
public T find(Object id) throws UnknownResourceException {
T entity = getEntityManager().find(entityClass, id);
if (entity == null) {
@@ -75,20 +115,36 @@ public T find(Object id) throws UnknownResourceException {
return entity;
}
+ /**
+ *
+ * @param entity
+ */
public void detach(T entity) {
getEntityManager().detach(entity);
}
- public void invalidCache() {
+ /**
+ *
+ */
+ public void clearCache() {
getEntityManager().clear();
}
+ /**
+ *
+ * @return
+ */
public List findAll() {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
return getEntityManager().createQuery(cq).getResultList();
}
+ /**
+ *
+ * @param range
+ * @return
+ */
public List findRange(int[] range) {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
@@ -98,6 +154,10 @@ public List findRange(int[] range) {
return q.getResultList();
}
+ /**
+ *
+ * @return
+ */
public int count() {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
javax.persistence.criteria.Root rt = cq.from(entityClass);
@@ -106,41 +166,52 @@ public int count() {
return ((Long) q.getSingleResult()).intValue();
}
- public List findByCriteria(MultivaluedMap queryParameters, Class clazz) {
+ /**
+ *
+ * @param map
+ * @param clazz
+ * @return
+ */
+ public List findByCriteria(MultivaluedMap map, Class clazz) {
List resultsList = null;
- CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
- CriteriaQuery cq = criteriaBuilder.createQuery(clazz);
- List andPredicates = new ArrayList();
- Root tt = cq.from(clazz);
- for (Map.Entry> entry : queryParameters.entrySet()) {
- List valueList = entry.getValue();
- Predicate predicate = null;
- if (valueList.size() > 1) {
- // name=value1&name=value&...&name=valueN
- // value of name is list [value1, value, ..., valueN]
- // => name=value1 OR name=value OR ... OR name=valueN
- List orPredicates = new ArrayList();
- for (String currentValue : valueList) {
- Predicate orPredicate = buildPredicate(tt, entry.getKey(), currentValue);
- orPredicates.add(orPredicate);
+ try {
+ CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
+ CriteriaQuery cq = criteriaBuilder.createQuery(clazz);
+ List andPredicates = new ArrayList();
+ Root tt = cq.from(clazz);
+ for (Map.Entry> entry : map.entrySet()) {
+ List valueList = entry.getValue();
+ Predicate predicate = null;
+ if (valueList.size() > 1) {
+ // name=value1&name=value2&...&name=valueN
+ // value of name is list [value1, value2, ..., valueN]
+ // => name=value1 OR name=value2 OR ... OR name=valueN
+ List orPredicates = new ArrayList();
+ for (String currentValue : valueList) {
+ Predicate orPredicate = buildPredicate(tt, entry.getKey(), currentValue);
+ orPredicates.add(orPredicate);
+ }
+ predicate = criteriaBuilder.or(orPredicates.toArray(new Predicate[orPredicates.size()]));
+ } else {
+ // name=value
+ // value of name is one element list [value]
+ // => name=value
+ predicate = buildPredicate(tt, entry.getKey(), valueList.get(0));
}
- predicate = criteriaBuilder.or(orPredicates.toArray(new Predicate[orPredicates.size()]));
- } else {
- // name=value
- // value of name is one element list [value]
- // => name=value
- predicate = buildPredicate(tt, entry.getKey(), valueList.get(0));
+ andPredicates.add(predicate);
}
- andPredicates.add(predicate);
+ cq.where(andPredicates.toArray(new Predicate[andPredicates.size()]));
+ cq.select(tt);
+ TypedQuery q = getEntityManager().createQuery(cq);
+ resultsList = q.getResultList();
+ return resultsList;
+ } catch (Exception ex) {
+ Logger.getLogger(AbstractFacade.class.getName()).log(Level.INFO, "findByCriteria error, null result returned", ex);
+ return null;
}
- cq.where(andPredicates.toArray(new Predicate[andPredicates.size()]));
- cq.select(tt);
- TypedQuery q = getEntityManager().createQuery(cq);
- resultsList = q.getResultList();
- return resultsList;
}
- private Predicate buildPredicate(Path tt, String name, String value) {
+ private Predicate buildPredicate(Path tt, String name, String value) throws BadUsageException {
Predicate predicate = null;
int index = name.indexOf('.');
if (index > 0 && index < name.length()) {
@@ -156,25 +227,15 @@ private Predicate buildPredicate(Path tt, String name, String value) {
return predicate;
}
- private Predicate buildSimplePredicate(Path path, String name, String value) {
+ private Predicate buildSimplePredicate(Path tt, String name, String value) throws BadUsageException {
Predicate predicate;
CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
- if (isMultipleOrValue(value)) {
- // name=value1,value,...,valueN
- // => name=value1 OR name=value OR ... OR name=valueN
- List valueList = convertMultipleOrValueToList(value);
- List orPredicates = new ArrayList();
- for (String currentValue : valueList) {
- Predicate orPredicate = buildPredicateWithOperator(path, name, currentValue);
- orPredicates.add(orPredicate);
- }
- predicate = criteriaBuilder.or(orPredicates.toArray(new Predicate[orPredicates.size()]));
- } else if (isMultipleAndValue(value)) {
- // name=(subname1=value1&subname2=value&...&subnameN=valueN)
- // => name.subname1=value1 AND name.subname2=value AND ... AND name.subnameN=valueN
+ if (isMultipleAndValue(value)) {
+ // name=(subname1=value1&subname2=value2&...&subnameN=valueN)
+ // => name.subname1=value1 AND name.subname2=value2 AND ... AND name.subnameN=valueN
List> subFieldNameValue = convertMultipleAndValue(value);
List andPredicates = new ArrayList();
- Path root = path.get(name);
+ Path root = tt.get(name);
for (Map.Entry entry : subFieldNameValue) {
String currentsubFieldName = entry.getKey();
String currentValue = entry.getValue();
@@ -182,25 +243,35 @@ private Predicate buildSimplePredicate(Path path, String name, String value)
andPredicates.add(andPredicate);
}
predicate = criteriaBuilder.and(andPredicates.toArray(new Predicate[andPredicates.size()]));
+ } else if (isMultipleOrValue(value)) {
+ // name=value1,value2,...,valueN
+ // => name=value1 OR name=value2 OR ... OR name=valueN
+ List valueList = convertMultipleOrValueToList(value);
+ List orPredicates = new ArrayList();
+ for (String currentValue : valueList) {
+ Predicate orPredicate = buildPredicateWithOperator(tt, name, currentValue);
+ orPredicates.add(orPredicate);
+ }
+ predicate = criteriaBuilder.or(orPredicates.toArray(new Predicate[orPredicates.size()]));
} else {
// name=value
- predicate = buildPredicateWithOperator(path, name, value);
+ predicate = buildPredicateWithOperator(tt, name, value);
}
return predicate;
}
- // value has format value1,value,...,valueN
+ // value has format value1,value2,...,valueN
private static boolean isMultipleOrValue(String value) {
return (value.indexOf(",") > -1);
}
- // value has format (value1&value&...&valueN)
+ // value has format (value1&value2&...&valueN)
private static boolean isMultipleAndValue(String value) {
return (value.startsWith("(") && value.endsWith(")"));
}
- // convert String "value1,value,...,valueN"
- // to List [value1, value, ..., valueN]
+ // convert String "value1,value2,...,valueN"
+ // to List [value1, value2, ..., valueN]
private static List convertMultipleOrValueToList(String value) {
List valueList = new ArrayList();
String[] tokenArray = value.split(",");
@@ -208,8 +279,8 @@ private static List convertMultipleOrValueToList(String value) {
return valueList;
}
- // convert String "(name1=value1&name2=value&...&nameN=valueN)"
- // to List of Entry [name1=value1, name2=value, ..., nameN=valueN]
+ // convert String "(name1=value1&name2=value2&...&nameN=valueN)"
+ // to List of Entry [name1=value1, name2=value2, ..., nameN=valueN]
// Conversion is not to a Map since there can be a same name with differents values
private static List> convertMultipleAndValue(String multipleValue) {
List> nameValueList = new ArrayList>();
@@ -228,68 +299,116 @@ private static List> convertMultipleAndValue(String mu
return nameValueList;
}
- protected Predicate buildPredicateWithOperator(Path path, String name, String value) {
+ // safe Enum.valueOf without exception
+ private Enum safeEnumValueOf(Class enumType, String name) {
+ Enum enumValue = null;
+ if (name != null) {
+ try {
+ enumValue = Enum.valueOf(enumType, name);
+ } catch (Exception e) {
+ enumValue = null;
+ }
+ }
+ return enumValue;
+ }
+ private Object convertStringValueToObject(String value, Class clazz) throws BadUsageException {
+ Object convertedValue = null;
+ if (clazz.isEnum()) {
+ convertedValue = safeEnumValueOf(clazz, value);
+ } else if (Date.class.isAssignableFrom(clazz)) {
+ convertedValue = TMFDate.parse(value);
+ } else if ((clazz.isPrimitive() && !clazz.equals(boolean.class))
+ || (Number.class.isAssignableFrom(clazz))) {
+ try {
+ convertedValue = NumberFormat.getInstance().parse(value);
+ } catch (ParseException ex) {
+ convertedValue = null;
+ }
+ } else {
+ convertedValue = value;
+ }
+ if (convertedValue != null) {
+ return convertedValue;
+ } else {
+ throw new BadUsageException(ExceptionType.BAD_USAGE_FORMAT, "Wrong format for value " + value);
+ }
+
+ }
+
+ // operators = and <> are compatibles with all types
+ // operators < > <= >= are compatibles with numbers and dates
+ // operator "LIKE" is compatible with String
+ private boolean classCompatibleWithOperator(Class clazz, Operator operator) {
+ if (operator == null) {
+ return true;
+ } else {
+ switch (operator) {
+ case NE:
+ case EQ:
+ return true;
+ case GT:
+ case GTE:
+ case LT:
+ case LTE:
+ return (Date.class.isAssignableFrom(clazz)
+ || (clazz.isPrimitive() && !clazz.equals(boolean.class))
+ || Number.class.isAssignableFrom(clazz));
+ case EX:
+ return String.class.equals(clazz);
+ default:
+ return false;
+ }
+ }
+ }
+
+ /**
+ *
+ * @param tt
+ * @param name
+ * @param value
+ * @return
+ * @throws BadUsageException
+ */
+ protected Predicate buildPredicateWithOperator(Path tt, String name, String value) throws BadUsageException {
CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
Operator operator = Operator.fromString(name);
// perform operation, default operation is equal
if (operator == null) {
- Path attribute = path.get(name);
- Object valueObject = convertStringValueToObject(attribute, value);
+ Path attribute = tt.get(name);
+ Object valueObject = convertStringValueToObject(value, attribute.getJavaType());
+ System.out.println("### bp RETURN " + name + "=" + value);
return criteriaBuilder.equal(attribute, valueObject);
} else {
+ Class javaType = tt.getJavaType();
+ if (!classCompatibleWithOperator(javaType, operator)) {
+ throw new BadUsageException(ExceptionType.BAD_USAGE_OPERATOR, operator.getValue() + " operator incompatible with field");
+ }
+ Object valueObject = convertStringValueToObject(value, javaType);
switch (operator) {
case GT:
- return criteriaBuilder.greaterThan((Expression) path, value);
+ return criteriaBuilder.greaterThan((Expression) tt, (Comparable) valueObject);
case GTE:
- return criteriaBuilder.greaterThanOrEqualTo((Expression) path, value);
+ return criteriaBuilder.greaterThanOrEqualTo((Expression) tt, (Comparable) valueObject);
case LT:
- return criteriaBuilder.lessThan((Expression) path, value);
+ return criteriaBuilder.lessThan((Expression) tt, (Comparable) valueObject);
case LTE:
- return criteriaBuilder.lessThanOrEqualTo((Expression) path, value);
- case NE: {
- Object valueObject = convertStringValueToObject(path, value);
- return criteriaBuilder.notEqual(path, valueObject);
- }
- case EQ: {
- Object valueObject = convertStringValueToObject(path, value);
- return criteriaBuilder.equal(path, valueObject);
- }
+ return criteriaBuilder.lessThanOrEqualTo((Expression) tt, (Comparable) valueObject);
+ case NE:
+ return criteriaBuilder.notEqual(tt, valueObject);
+ case EQ:
+ return criteriaBuilder.equal(tt, valueObject);
case EX:
- return criteriaBuilder.like((Expression) path, value.replace('*', '%'));
+ return criteriaBuilder.like((Expression) tt, value.replace('*', '%'));
default: {
- Path attribute = path.get(name);
- Object valueObject = convertStringValueToObject(attribute, value);
+ Path attribute = tt.get(name);
+ valueObject = convertStringValueToObject(value, attribute.getJavaType());
return criteriaBuilder.equal(attribute, valueObject);
}
}
}
-
- }
-
- private Enum safeEnumValueOf(Class enumType, String name) {
- Enum enumValue = null;
- if (name != null) {
- try {
- enumValue = Enum.valueOf(enumType, name);
- } catch (Exception e) {
- enumValue = null;
- }
- }
- return enumValue;
- }
-
- private Object convertStringValueToObject(Path tt, String value) {
- Class javaType = tt.getJavaType();
- if (javaType.isEnum()) {
- Enum enumValue = safeEnumValueOf(javaType, value);
- return enumValue;
- } else {
- return value;
- }
}
- //protected abstract Predicate buildPredicateForEnum(Path path, String name, String value);
enum Operator {
EQ("eq"),
@@ -320,4 +439,4 @@ public static Operator fromString(String value) {
return null;
}
}
-}
+}
\ No newline at end of file
diff --git a/src/main/java/org/tmf/dsmapi/commons/jaxrs/CorsFilter.java b/src/main/java/org/tmf/dsmapi/commons/jaxrs/CorsFilter.java
new file mode 100644
index 0000000..6a8b4f3
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/commons/jaxrs/CorsFilter.java
@@ -0,0 +1,32 @@
+package org.tmf.dsmapi.commons.jaxrs;
+
+import java.io.IOException;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.annotation.WebFilter;
+import javax.servlet.http.HttpServletResponse;
+
+@WebFilter(filterName = "CorsFilter", urlPatterns = {"/*"})
+public class CorsFilter implements javax.servlet.Filter {
+
+ @Override
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+ HttpServletResponse res = (HttpServletResponse) response;
+ res.addHeader("Access-Control-Allow-Origin", "*");
+ res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
+ res.addHeader("Access-Control-Allow-Headers", "Content-Type");
+ chain.doFilter(request, response);
+ }
+
+ @Override
+ public void init(FilterConfig filterConfig) throws ServletException {
+ }
+
+ @Override
+ public void destroy() {
+ }
+
+}
diff --git a/src/java/tmf/org/dsmapi/tt/service/JsonFault.java b/src/main/java/org/tmf/dsmapi/commons/jaxrs/model/JsonFault.java
similarity index 90%
rename from src/java/tmf/org/dsmapi/tt/service/JsonFault.java
rename to src/main/java/org/tmf/dsmapi/commons/jaxrs/model/JsonFault.java
index b632c03..45b4157 100644
--- a/src/java/tmf/org/dsmapi/tt/service/JsonFault.java
+++ b/src/main/java/org/tmf/dsmapi/commons/jaxrs/model/JsonFault.java
@@ -1,8 +1,8 @@
-package tmf.org.dsmapi.tt.service;
+package org.tmf.dsmapi.commons.jaxrs.model;
import javax.xml.bind.annotation.XmlRootElement;
import org.codehaus.jackson.map.annotate.JsonSerialize;
-import tmf.org.dsmapi.commons.exceptions.ExceptionBean;
+import org.tmf.dsmapi.commons.exceptions.ExceptionBean;
@XmlRootElement
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
diff --git a/src/java/tmf/org/dsmapi/tt/service/Report.java b/src/main/java/org/tmf/dsmapi/commons/jaxrs/model/Report.java
similarity index 97%
rename from src/java/tmf/org/dsmapi/tt/service/Report.java
rename to src/main/java/org/tmf/dsmapi/commons/jaxrs/model/Report.java
index ff5c7be..6d3341a 100644
--- a/src/java/tmf/org/dsmapi/tt/service/Report.java
+++ b/src/main/java/org/tmf/dsmapi/commons/jaxrs/model/Report.java
@@ -1,4 +1,4 @@
-package tmf.org.dsmapi.tt.service;
+package org.tmf.dsmapi.commons.jaxrs.model;
import javax.xml.bind.annotation.XmlRootElement;
import org.codehaus.jackson.map.annotate.JsonSerialize;
diff --git a/src/java/tmf/org/dsmapi/tt/service/mapper/BadUsageExceptionMapper.java b/src/main/java/org/tmf/dsmapi/commons/jaxrs/provider/BadUsageExceptionMapper.java
similarity index 77%
rename from src/java/tmf/org/dsmapi/tt/service/mapper/BadUsageExceptionMapper.java
rename to src/main/java/org/tmf/dsmapi/commons/jaxrs/provider/BadUsageExceptionMapper.java
index 6ad564d..aa1288c 100644
--- a/src/java/tmf/org/dsmapi/tt/service/mapper/BadUsageExceptionMapper.java
+++ b/src/main/java/org/tmf/dsmapi/commons/jaxrs/provider/BadUsageExceptionMapper.java
@@ -2,13 +2,13 @@
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
-package tmf.org.dsmapi.tt.service.mapper;
+package org.tmf.dsmapi.commons.jaxrs.provider;
-import tmf.org.dsmapi.tt.service.JsonFault;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
-import tmf.org.dsmapi.commons.exceptions.BadUsageException;
+import org.tmf.dsmapi.commons.exceptions.BadUsageException;
+import org.tmf.dsmapi.commons.jaxrs.model.JsonFault;
@Provider
public class BadUsageExceptionMapper implements ExceptionMapper {
diff --git a/src/java/tmf/org/dsmapi/tt/service/mapper/JacksonConfigurator.java b/src/main/java/org/tmf/dsmapi/commons/jaxrs/provider/JacksonConfigurator.java
similarity index 90%
rename from src/java/tmf/org/dsmapi/tt/service/mapper/JacksonConfigurator.java
rename to src/main/java/org/tmf/dsmapi/commons/jaxrs/provider/JacksonConfigurator.java
index fdca7bd..45b43c2 100644
--- a/src/java/tmf/org/dsmapi/tt/service/mapper/JacksonConfigurator.java
+++ b/src/main/java/org/tmf/dsmapi/commons/jaxrs/provider/JacksonConfigurator.java
@@ -2,7 +2,7 @@
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
-package tmf.org.dsmapi.tt.service.mapper;
+package org.tmf.dsmapi.commons.jaxrs.provider;
import javax.ws.rs.Produces;
import javax.ws.rs.ext.ContextResolver;
diff --git a/src/java/tmf/org/dsmapi/tt/service/mapper/JsonMappingExceptionMapper.java b/src/main/java/org/tmf/dsmapi/commons/jaxrs/provider/JsonMappingExceptionMapper.java
similarity index 80%
rename from src/java/tmf/org/dsmapi/tt/service/mapper/JsonMappingExceptionMapper.java
rename to src/main/java/org/tmf/dsmapi/commons/jaxrs/provider/JsonMappingExceptionMapper.java
index 1d148b0..b79ba9e 100644
--- a/src/java/tmf/org/dsmapi/tt/service/mapper/JsonMappingExceptionMapper.java
+++ b/src/main/java/org/tmf/dsmapi/commons/jaxrs/provider/JsonMappingExceptionMapper.java
@@ -2,14 +2,14 @@
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
-package tmf.org.dsmapi.tt.service.mapper;
+package org.tmf.dsmapi.commons.jaxrs.provider;
-import tmf.org.dsmapi.tt.service.JsonFault;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import org.codehaus.jackson.map.JsonMappingException;
-import tmf.org.dsmapi.commons.exceptions.ExceptionType;
+import org.tmf.dsmapi.commons.exceptions.ExceptionType;
+import org.tmf.dsmapi.commons.jaxrs.model.JsonFault;
@Provider
public class JsonMappingExceptionMapper implements ExceptionMapper {
diff --git a/src/java/tmf/org/dsmapi/tt/service/mapper/UnknowResourceExceptionMapper.java b/src/main/java/org/tmf/dsmapi/commons/jaxrs/provider/UnknowResourceExceptionMapper.java
similarity index 76%
rename from src/java/tmf/org/dsmapi/tt/service/mapper/UnknowResourceExceptionMapper.java
rename to src/main/java/org/tmf/dsmapi/commons/jaxrs/provider/UnknowResourceExceptionMapper.java
index 583adf8..8f37327 100644
--- a/src/java/tmf/org/dsmapi/tt/service/mapper/UnknowResourceExceptionMapper.java
+++ b/src/main/java/org/tmf/dsmapi/commons/jaxrs/provider/UnknowResourceExceptionMapper.java
@@ -2,13 +2,13 @@
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
-package tmf.org.dsmapi.tt.service.mapper;
+package org.tmf.dsmapi.commons.jaxrs.provider;
-import tmf.org.dsmapi.tt.service.JsonFault;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
-import tmf.org.dsmapi.commons.exceptions.UnknownResourceException;
+import org.tmf.dsmapi.commons.exceptions.UnknownResourceException;
+import org.tmf.dsmapi.commons.jaxrs.model.JsonFault;
@Provider
public class UnknowResourceExceptionMapper implements ExceptionMapper {
diff --git a/src/main/java/org/tmf/dsmapi/commons/utils/BeanUtils.java b/src/main/java/org/tmf/dsmapi/commons/utils/BeanUtils.java
new file mode 100644
index 0000000..54dd724
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/commons/utils/BeanUtils.java
@@ -0,0 +1,75 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.tmf.dsmapi.commons.utils;
+
+import java.util.Iterator;
+import org.apache.commons.beanutils.PropertyUtilsBean;
+import org.codehaus.jackson.JsonNode;
+
+/**
+ *
+ * @author maig7313
+ */
+public class BeanUtils {
+
+ private static final PropertyUtilsBean PUB = new PropertyUtilsBean();
+
+ /**
+ *
+ * @param bean
+ * @param name
+ * @return
+ */
+ public static Object getNestedProperty(Object bean, String name) {
+ try {
+ return PUB.getNestedProperty(bean, name);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ /**
+ *
+ * @param bean
+ * @param name
+ * @param value
+ */
+ public static void setNestedProperty(Object bean, String name, Object value) {
+ try {
+ PUB.setNestedProperty(bean, name, value);
+ } catch (Exception ex) {
+ }
+ }
+
+ /**
+ *
+ * @param bean
+ * @param patchBean
+ * @param node
+ */
+ public static void patch(Object bean, Object patch, JsonNode node) {
+ String name;
+ JsonNode child;
+ Object value;
+ Object patchValue;
+ Iterator it = node.getFieldNames();
+ while (it.hasNext()) {
+ name = it.next();
+ patchValue = BeanUtils.getNestedProperty(patch, name);
+ child = node.get(name);
+ if (child.isObject()) {
+ value = BeanUtils.getNestedProperty(bean, name);
+ if (value != null) {
+ patch(value, patchValue, child);
+ BeanUtils.setNestedProperty(bean, name, value);
+ } else {
+ BeanUtils.setNestedProperty(bean, name, patchValue);
+ }
+ } else {
+ BeanUtils.setNestedProperty(bean, name, patchValue);
+ }
+ }
+ }
+}
diff --git a/src/main/java/org/tmf/dsmapi/commons/utils/CustomJsonDateSerializer.java.toto b/src/main/java/org/tmf/dsmapi/commons/utils/CustomJsonDateSerializer.java.toto
new file mode 100644
index 0000000..6c511e2
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/commons/utils/CustomJsonDateSerializer.java.toto
@@ -0,0 +1,33 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.tmf.dsmapi.commons.utils;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.map.JsonSerializer;
+import org.codehaus.jackson.map.SerializerProvider;
+
+/**
+ *
+ * @author ecus6396
+ */
+public class CustomJsonDateSerializer extends JsonSerializer
+{
+ @Override
+ public void serialize(Date aDate, JsonGenerator aJsonGenerator, SerializerProvider aSerializerProvider)
+ throws IOException, JsonProcessingException {
+//
+// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");
+// "2013-07-21 08:16:39ZGMT+1"
+// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss'Z'zzz");
+// dateFormat.setTimeZone(TimeZone.getTimeZone("PST"));
+ String dateString = dateFormat.format(aDate);
+ aJsonGenerator.writeString(dateString);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/org/tmf/dsmapi/commons/utils/Jackson.java b/src/main/java/org/tmf/dsmapi/commons/utils/Jackson.java
new file mode 100644
index 0000000..124c3fb
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/commons/utils/Jackson.java
@@ -0,0 +1,161 @@
+package org.tmf.dsmapi.commons.utils;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.ws.rs.core.MultivaluedHashMap;
+import javax.ws.rs.core.MultivaluedMap;
+import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.JsonParser;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+import org.codehaus.jackson.node.ArrayNode;
+import org.codehaus.jackson.node.ObjectNode;
+
+public class Jackson {
+
+ private Jackson() {
+ }
+
+ public static ObjectNode createNode(Object bean, Set fieldNames) {
+ ObjectMapper mapper = new ObjectMapper();
+ return createNode(mapper, bean, fieldNames);
+ }
+
+ public static List createNodes(Collection list, Set fieldNames) {
+ List nodeList = new ArrayList();
+ for (Object element : list) {
+ ObjectNode node = createNode(element, fieldNames);
+ nodeList.add(node);
+ }
+ return nodeList;
+ }
+
+ public static Object refineBean(Object bean, Set fieldNames) {
+ ObjectNode rootNode = Jackson.createNode(bean, fieldNames);
+ Object result = null;
+ try {
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
+ mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
+ mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
+ result = mapper.treeToValue(rootNode, bean.getClass());
+ } catch (IOException ex) {
+ Logger.getLogger(Jackson.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ return result;
+ }
+
+ private static ObjectNode createNode(ObjectMapper mapper, Object bean, Set names) {
+ // split fieldNames in 2 categories :
+ // simpleFields for simple property names with no '.'
+ // nestedFields for nested property names with a '.'
+ Set simpleFields = new HashSet();
+ MultivaluedMap nestedFields = new MultivaluedHashMap();
+ for (String name : names) {
+ int index = name.indexOf('.');
+ boolean isNestedField = index > 0 && index < name.length();
+ if (isNestedField) {
+ String rootFieldName = name.substring(0, index);
+ String subFieldName = name.substring(index + 1);
+ nestedFields.add(rootFieldName, subFieldName);
+ } else {
+ simpleFields.add(name);
+ }
+ }
+
+ // create a simple node with only one level containing all simples properties
+ ObjectNode rootNode = createNodeWithSimpleFields(mapper, bean, simpleFields);
+
+ // create nested nodes with deeper levels
+ Set>> entrySet = nestedFields.entrySet();
+ // for each nested value, create recursively a node
+ for (Map.Entry> entry : entrySet) {
+ String rootFieldName = entry.getKey();
+ // add in current node only if full value is not already present in 1st level
+ if (!simpleFields.contains(rootFieldName)) {
+ Object nestedBean = BeanUtils.getNestedProperty(bean, rootFieldName);
+ // add only non null fields
+ if (nestedBean == null) {
+ break;
+ }
+ Set nestedFieldNames = new HashSet(entry.getValue());
+ // current node is an array or a list
+ if ((nestedBean.getClass().isArray()) || (Collection.class.isAssignableFrom(nestedBean.getClass()))) {
+ Object[] array = null;
+ if ((nestedBean.getClass().isArray())) {
+ array = (Object[]) nestedBean;
+ } else {
+ Collection collection = (Collection) nestedBean;
+ array = collection.toArray();
+ }
+ if (array.length > 0) {
+ // create a node for each element in array
+ // and add created node in an arrayNode
+ Collection nodes = new LinkedList();
+ for (Object object : array) {
+ ObjectNode nestedNode = createNode(mapper, object, nestedFieldNames);
+ if (nestedNode != null && nestedNode.size() > 0) {
+ nodes.add(nestedNode);
+ }
+ }
+ ArrayNode arrayNode = mapper.createArrayNode();
+ arrayNode.addAll(nodes);
+ if (arrayNode.size() > 0) {
+ rootNode.put(rootFieldName, arrayNode);
+ }
+ }
+ } else {
+ // create recursively a node and add it in current root node
+ ObjectNode nestedNode = createNode(mapper, nestedBean, nestedFieldNames);
+ if (nestedNode != null && nestedNode.size() > 0) {
+ rootNode.put(rootFieldName, nestedNode);
+ }
+ }
+ }
+ }
+ return rootNode;
+ }
+
+ // create a simple flat node with only one-level fields
+ private static ObjectNode createNodeWithSimpleFields(ObjectMapper mapper, Object bean, Set names) {
+ ObjectNode node = mapper.createObjectNode();
+ Object value;
+ for (String name : names) {
+ value = BeanUtils.getNestedProperty(bean, name);
+ if (value != null) {
+ nodePut(node, name, value);
+ }
+ }
+ return node;
+ }
+
+ // generic node.put for any Object
+ private static void nodePut(ObjectNode node, String name, Object value) {
+ if (value instanceof Boolean) {
+ node.put(name, (Boolean) value);
+ } else if (value instanceof Integer) {
+ node.put(name, (Integer) value);
+ } else if (value instanceof Long) {
+ node.put(name, (Long) value);
+ } else if (value instanceof Float) {
+ node.put(name, (Float) value);
+ } else if (value instanceof Double) {
+ node.put(name, (Double) value);
+ } else if (value instanceof BigDecimal) {
+ node.put(name, (BigDecimal) value);
+ } else if (value instanceof String) {
+ node.put(name, (String) value);
+ } else {
+ node.putPOJO(name, value);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/java/tmf/org/dsmapi/commons/jaxrs/PATCH.java b/src/main/java/org/tmf/dsmapi/commons/utils/PATCH.java
similarity index 82%
rename from src/java/tmf/org/dsmapi/commons/jaxrs/PATCH.java
rename to src/main/java/org/tmf/dsmapi/commons/utils/PATCH.java
index bf81b81..abdeaa9 100644
--- a/src/java/tmf/org/dsmapi/commons/jaxrs/PATCH.java
+++ b/src/main/java/org/tmf/dsmapi/commons/utils/PATCH.java
@@ -2,7 +2,7 @@
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
-package tmf.org.dsmapi.commons.jaxrs;
+package org.tmf.dsmapi.commons.utils;
@@ -13,6 +13,10 @@
import javax.ws.rs.HttpMethod;
import java.lang.annotation.*;
+/**
+ *
+ * @author maig7313
+ */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("PATCH")
diff --git a/src/main/java/org/tmf/dsmapi/commons/utils/TMFDate.java b/src/main/java/org/tmf/dsmapi/commons/utils/TMFDate.java
new file mode 100644
index 0000000..fc29d36
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/commons/utils/TMFDate.java
@@ -0,0 +1,64 @@
+package org.tmf.dsmapi.commons.utils;
+
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.TimeZone;
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.map.JsonSerializer;
+import org.codehaus.jackson.map.SerializerProvider;
+
+/**
+ *
+ * @author maig7313
+ */
+public class TMFDate extends JsonSerializer{
+
+ private static SimpleDateFormat FORMATER;
+ private static String label="yyyy-MM-dd'T'HH:mm:ssz";
+
+ /**
+ *
+ * @param date
+ * @return
+ */
+ public static String toString(Date date) {
+ return getFormater().format(date);
+ }
+
+ /**
+ *
+ * @param date
+ * @return
+ */
+ public static Date parse(String value) {
+ try {
+ return getFormater().parse(value);
+ } catch (ParseException ex) {
+ return null;
+ }
+ }
+
+ private static SimpleDateFormat getFormater() {
+ if (FORMATER == null) {
+// FORMATER = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");
+ FORMATER = new SimpleDateFormat(label);
+ TimeZone tz = TimeZone.getTimeZone("UTC");
+ FORMATER.setTimeZone(tz);
+ }
+ return FORMATER;
+ }
+
+ @Override
+ public void serialize(Date t, JsonGenerator jg, SerializerProvider sp)
+ throws IOException, JsonProcessingException {
+ SimpleDateFormat dateFormat = new SimpleDateFormat(label);
+// "2013-07-21 08:16:39ZGMT+1"
+// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss'Z'zzz");
+// dateFormat.setTimeZone(TimeZone.getTimeZone("PST"));
+ String dateString = dateFormat.format(t);
+ jg.writeString(dateString);
+ }
+}
diff --git a/src/main/java/org/tmf/dsmapi/commons/utils/URIParser.java b/src/main/java/org/tmf/dsmapi/commons/utils/URIParser.java
new file mode 100644
index 0000000..60a400a
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/commons/utils/URIParser.java
@@ -0,0 +1,153 @@
+package org.tmf.dsmapi.commons.utils;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URLDecoder;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.ws.rs.core.MultivaluedHashMap;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.UriInfo;
+
+/**
+ *
+ * @author maig7313
+ */
+public class URIParser {
+
+ public static final String ALL_FIELDS = "all";
+ public static final String ID_FIELD = "id";
+ private static final String QUERY_KEY_FIELD = "fields";
+ private static final String QUERY_KEY_FIELD_ESCAPE = ":";
+
+ private URIParser() {
+ }
+
+ /**
+ *
+ * @param queryParameters
+ * @return
+ */
+ public static Set getFieldsSelection(Map> queryParameters) {
+ Set fieldSet = new HashSet();
+ if (queryParameters != null) {
+ List queryParameterField = queryParameters.remove(QUERY_KEY_FIELD_ESCAPE + QUERY_KEY_FIELD);
+ if (queryParameterField == null) {
+ queryParameterField = queryParameters.remove(QUERY_KEY_FIELD);
+ }
+ if (queryParameterField != null && !queryParameterField.isEmpty()) {
+ String queryParameterValue = queryParameterField.get(0);
+ if (queryParameterValue != null) {
+ String[] tokenArray = queryParameterValue.split(",");
+ fieldSet.addAll(Arrays.asList(tokenArray));
+ }
+ }
+ }
+ return fieldSet;
+ }
+
+ public static MultivaluedMap getParameters(UriInfo info) {
+ if (info != null) {
+ URI requestUri = info.getRequestUri();
+ if (requestUri != null) {
+ String rawQuery = requestUri.getRawQuery();
+ return getParameters(rawQuery);
+ }
+ }
+ return new MultivaluedHashMap();
+ }
+
+ public static MultivaluedMap getParameters(String rawQuery) {
+ MultivaluedMap map = new MultivaluedHashMap();
+ //return info.getQueryParameters();
+ try {
+ if (rawQuery == null || rawQuery.length() == 0) {
+ return map;
+ }
+ String query = URLDecoder.decode(rawQuery, "UTF-8");
+ if (query == null || query.length() == 0) {
+ return map;
+ }
+
+ StringBuffer attribute = new StringBuffer();
+ StringBuffer value = new StringBuffer();
+ boolean inAttr = true;
+ boolean inValue = false;
+ int brackets = 0;
+ for (int i = 0; i < query.length(); i++) {
+ char c = query.charAt(i);
+ switch (c) {
+ case '&':
+ if (brackets <= 0) {
+ brackets = 0;
+ if (attribute.length() > 0) {
+ map.putSingle(attribute.toString(), value.toString());
+ }
+ attribute = new StringBuffer();
+ value = new StringBuffer();
+ inAttr = true;
+ inValue = false;
+ } else {
+ if (inValue) {
+ value.append(c);
+ } else if (inAttr) {
+ attribute.append(c);
+ }
+ }
+ break;
+ case '=':
+ if (brackets <= 0) {
+ brackets = 0;
+ inValue = true;
+ inAttr = false;
+ value = new StringBuffer();
+ } else {
+ if (inValue) {
+ value.append(c);
+ } else if (inAttr) {
+ attribute.append(c);
+ }
+ }
+ break;
+ case '(':
+ if (inValue) {
+ brackets++;
+ value.append(c);
+ } else if (inAttr) {
+ attribute.append(c);
+ }
+ break;
+ case ')':
+ if (inValue) {
+ brackets--;
+ value.append(c);
+ } else if (inAttr) {
+ attribute.append(c);
+ }
+ break;
+
+ default:
+ if (inValue) {
+ value.append(c);
+ } else if (inAttr) {
+ attribute.append(c);
+ }
+ break;
+ }
+ }
+ if (attribute.length() > 0) {
+ map.putSingle(attribute.toString(), value.toString());
+ }
+
+ } catch (UnsupportedEncodingException ex) {
+ Logger.getLogger(URIParser.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ return map;
+
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/org/tmf/dsmapi/hub/model/Event.java b/src/main/java/org/tmf/dsmapi/hub/model/Event.java
new file mode 100644
index 0000000..62f40e9
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/hub/model/Event.java
@@ -0,0 +1,90 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.tmf.dsmapi.hub.model;
+
+import java.io.Serializable;
+import java.util.Date;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.xml.bind.annotation.XmlRootElement;
+import org.codehaus.jackson.annotate.JsonPropertyOrder;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+import org.tmf.dsmapi.commons.utils.TMFDate;
+import org.tmf.dsmapi.troubleTicket.model.TroubleTicket;
+
+/**
+ *
+ * @author pierregauthier
+ */
+@XmlRootElement
+@Entity
+@JsonPropertyOrder(value = {"event", "reason", "dateEvent", "eventType"})
+@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@Table(name="EventTroubleTicket")
+public class Event implements Serializable {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private String id;
+ private String reason;
+ @Temporal(TemporalType.TIMESTAMP)
+ @JsonSerialize(using = TMFDate.class)
+ private Date dateEvent;
+ private TroubleTicket resource; //checl for object
+ @Enumerated(value = EnumType.STRING)
+ private EventTypeEnum eventType;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public EventTypeEnum getEventType() {
+ return eventType;
+ }
+
+ public void setEventType(EventTypeEnum eventType) {
+ this.eventType = eventType;
+ }
+
+ public String getReason() {
+ return reason;
+ }
+
+ public void setReason(String reason) {
+ this.reason = reason;
+ }
+
+ public Date getDate() {
+ return dateEvent;
+ }
+
+ public void setDate(Date date) {
+ this.dateEvent = date;
+ }
+
+ public TroubleTicket getResource() {
+ return resource;
+ }
+
+ public void setResource(TroubleTicket resource) {
+ this.resource = resource;
+ }
+
+ @Override
+ public String toString() {
+ return "Event{" + "id=" + id + ", eventType=" + eventType + ", reason=" + reason + ", dateEvent=" + dateEvent + ", resource=" + resource + "}";
+ }
+}
diff --git a/src/java/tmf/org/dsmapi/hub/TroubleTicketEventTypeEnum.java b/src/main/java/org/tmf/dsmapi/hub/model/EventTypeEnum.java
similarity index 58%
rename from src/java/tmf/org/dsmapi/hub/TroubleTicketEventTypeEnum.java
rename to src/main/java/org/tmf/dsmapi/hub/model/EventTypeEnum.java
index c261dd5..96dcad8 100644
--- a/src/java/tmf/org/dsmapi/hub/TroubleTicketEventTypeEnum.java
+++ b/src/main/java/org/tmf/dsmapi/hub/model/EventTypeEnum.java
@@ -2,34 +2,58 @@
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
-package tmf.org.dsmapi.hub;
+package org.tmf.dsmapi.hub.model;
/**
*
* @author pierregauthier
*/
-public enum TroubleTicketEventTypeEnum {
+public enum EventTypeEnum {
+ /**
+ *
+ */
TicketCreateNotification("TicketCreateNotification"),
+ /**
+ *
+ */
TicketStatusChangedNotification("TicketStatusChangedNotification"),
- TicketChangedNotification("TicketStatusChangedNotification"),
+ /**
+ *
+ */
+ TicketChangedNotification("TicketChangedNotification"),
+ /**
+ *
+ */
TicketClearanceRequestNotification("TicketClearanceRequestNotification"),
+ /**
+ *
+ */
InformationRequiredNotification("InformationRequiredNotification");
private String text;
- TroubleTicketEventTypeEnum(String text) {
+ EventTypeEnum(String text) {
this.text = text;
}
+ /**
+ *
+ * @return
+ */
public String getText() {
return this.text;
}
- public static tmf.org.dsmapi.hub.TroubleTicketEventTypeEnum fromString(String text) {
+ /**
+ *
+ * @param text
+ * @return
+ */
+ public static org.tmf.dsmapi.hub.model.EventTypeEnum fromString(String text) {
if (text != null) {
- for (TroubleTicketEventTypeEnum b : TroubleTicketEventTypeEnum.values()) {
+ for (EventTypeEnum b : EventTypeEnum.values()) {
if (text.equalsIgnoreCase(b.text)) {
return b;
}
diff --git a/src/java/tmf/org/dsmapi/hub/Hub.java b/src/main/java/org/tmf/dsmapi/hub/model/Hub.java
similarity index 75%
rename from src/java/tmf/org/dsmapi/hub/Hub.java
rename to src/main/java/org/tmf/dsmapi/hub/model/Hub.java
index ece9845..ef2638b 100644
--- a/src/java/tmf/org/dsmapi/hub/Hub.java
+++ b/src/main/java/org/tmf/dsmapi/hub/model/Hub.java
@@ -2,14 +2,19 @@
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
-package tmf.org.dsmapi.hub;
+package org.tmf.dsmapi.hub.model;
import java.io.Serializable;
+import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
import javax.xml.bind.annotation.XmlRootElement;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+import org.tmf.dsmapi.commons.utils.TMFDate;
/**
*
@@ -17,6 +22,8 @@
*/
@Entity
@XmlRootElement
+@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@Table(name="HubTroubleTicket")
public class Hub implements Serializable {
private static final long serialVersionUID = 1L;
@@ -24,6 +31,12 @@ public class Hub implements Serializable {
@GeneratedValue(strategy = GenerationType.AUTO)
private String id;
+ private Integer leaseSeconds;
+
+ @Temporal(javax.persistence.TemporalType.DATE)
+ @JsonSerialize(using = TMFDate.class)
+ private Date dateTime;
+
public String getId() {
return id;
}
@@ -72,6 +85,6 @@ public boolean equals(Object object) {
@Override
public String toString() {
- return "tmf.org.dsmapi.hub.Hub[ id=" + id + " ]";
+ return "tmf.org.dsmapi.hub.model.Hub[ id=" + id + " ]";
}
}
diff --git a/src/main/java/org/tmf/dsmapi/hub/service/EventFacade.java b/src/main/java/org/tmf/dsmapi/hub/service/EventFacade.java
new file mode 100644
index 0000000..eb9cdb0
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/hub/service/EventFacade.java
@@ -0,0 +1,34 @@
+package org.tmf.dsmapi.hub.service;
+
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import org.tmf.dsmapi.commons.facade.AbstractFacade;
+import org.tmf.dsmapi.hub.model.Event;
+
+/**
+ *
+ * @author pierregauthier
+ */
+@Stateless
+public class EventFacade extends AbstractFacade {
+
+ @PersistenceContext(unitName = "DSTroubleTicketPU")
+ private EntityManager em;
+
+
+
+ /**
+ *
+ */
+ public EventFacade() {
+ super(Event.class);
+ }
+
+
+ @Override
+ protected EntityManager getEntityManager() {
+ return em;
+ }
+
+}
diff --git a/src/main/java/org/tmf/dsmapi/hub/service/EventPublisher.java b/src/main/java/org/tmf/dsmapi/hub/service/EventPublisher.java
new file mode 100644
index 0000000..0d786f3
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/hub/service/EventPublisher.java
@@ -0,0 +1,105 @@
+package org.tmf.dsmapi.hub.service;
+
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.ejb.Asynchronous;
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import org.tmf.dsmapi.commons.exceptions.BadUsageException;
+import org.tmf.dsmapi.hub.model.Event;
+import org.tmf.dsmapi.hub.model.EventTypeEnum;
+import org.tmf.dsmapi.hub.model.Hub;
+import org.tmf.dsmapi.troubleTicket.model.TroubleTicket;
+
+/**
+ *
+ * @author pierregauthier should be async or called with MDB
+ */
+@Stateless
+@Asynchronous
+public class EventPublisher implements EventPublisherLocal {
+
+ @EJB
+ HubFacade hubFacade;
+ @EJB
+ EventFacade eventFacade;
+ @EJB
+ RESTEventPublisherLocal restEventPublisherLocal;
+
+ // Add business logic below. (Right-click in editor and choose
+ // "Insert Code > Add Business Method")
+ //Access Hubs using callbacks and send to http publisher
+ //(pool should be configured around the RESTEventPublisher bean)
+ //Loop into array of Hubs
+ //Call RestEventPublisher - Need to implement resend policy plus eviction
+ //Filtering is done in RestEventPublisher based on query expression
+ @Override
+ public void publish(Event event) {
+ try {
+ eventFacade.create(event);
+ } catch (BadUsageException ex) {
+ Logger.getLogger(EventPublisher.class.getName()).log(Level.SEVERE, null, ex);
+ }
+
+ List hubList = hubFacade.findAll();
+ Iterator it = hubList.iterator();
+ while (it.hasNext()) {
+ Hub hub = it.next();
+ restEventPublisherLocal.publish(hub, event);
+ }
+ }
+
+ @Override
+ public void createNotification(TroubleTicket bean, String reason, Date date) {
+ Event event = new Event();
+ event.setResource(bean);
+ event.setDate(date);
+ event.setReason(reason);
+ event.setEventType(EventTypeEnum.TicketCreateNotification);
+ publish(event);
+
+ }
+
+ @Override
+ public void changedNotification(TroubleTicket bean, String reason, Date date) {
+ Event event = new Event();
+ event.setResource(bean);
+ event.setDate(date);
+ event.setReason(reason);
+ event.setEventType(EventTypeEnum.TicketChangedNotification);
+ publish(event);
+ }
+
+ @Override
+ public void statusChangedNotification(TroubleTicket bean, String reason, Date date) {
+ Event event = new Event();
+ event.setResource(bean);
+ event.setDate(date);
+ event.setReason(reason);
+ event.setEventType(EventTypeEnum.TicketStatusChangedNotification);
+ publish(event);
+ }
+
+ @Override
+ public void clearanceNotification(TroubleTicket bean, String reason, Date date) {
+ Event event = new Event();
+ event.setResource(bean);
+ event.setDate(date);
+ event.setReason(reason);
+ event.setEventType(EventTypeEnum.TicketClearanceRequestNotification);
+ publish(event);
+ }
+
+ @Override
+ public void informationRequiredNotification(TroubleTicket bean, String reason, Date date) {
+ Event event = new Event();
+ event.setResource(bean);
+ event.setDate(date);
+ event.setReason(reason);
+ event.setEventType(EventTypeEnum.InformationRequiredNotification);
+ publish(event);
+ }
+}
diff --git a/src/main/java/org/tmf/dsmapi/hub/service/EventPublisherLocal.java b/src/main/java/org/tmf/dsmapi/hub/service/EventPublisherLocal.java
new file mode 100644
index 0000000..f1568b5
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/hub/service/EventPublisherLocal.java
@@ -0,0 +1,49 @@
+package org.tmf.dsmapi.hub.service;
+
+import java.util.Date;
+import javax.ejb.Local;
+import org.tmf.dsmapi.hub.model.Event;
+import org.tmf.dsmapi.troubleTicket.model.TroubleTicket;
+
+
+
+/**
+ *
+ * @author pierregauthier
+ */
+@Local
+public interface EventPublisherLocal {
+
+ void publish(Event event);
+
+ /**
+ *
+ * @param tt
+ */
+ public void createNotification(TroubleTicket bean, String reason, Date date);
+
+ /**
+ *
+ * @param tt
+ */
+ public void statusChangedNotification(TroubleTicket bean, String reason, Date date);
+
+ /**
+ *
+ * @param tt
+ */
+ public void changedNotification(TroubleTicket bean, String reason, Date date);
+
+ /**
+ *
+ * @param tt
+ */
+ public void clearanceNotification(TroubleTicket bean, String reason, Date date);
+
+ /**
+ *
+ * @param tt
+ */
+ public void informationRequiredNotification(TroubleTicket bean, String reason, Date date);
+
+}
diff --git a/src/java/tmf/org/dsmapi/hub/service/HubFacade.java b/src/main/java/org/tmf/dsmapi/hub/service/HubFacade.java
similarity index 73%
rename from src/java/tmf/org/dsmapi/hub/service/HubFacade.java
rename to src/main/java/org/tmf/dsmapi/hub/service/HubFacade.java
index ed28e80..6c0d931 100644
--- a/src/java/tmf/org/dsmapi/hub/service/HubFacade.java
+++ b/src/main/java/org/tmf/dsmapi/hub/service/HubFacade.java
@@ -1,13 +1,10 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-package tmf.org.dsmapi.hub.service;
+package org.tmf.dsmapi.hub.service;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
-import tmf.org.dsmapi.hub.Hub;
+import org.tmf.dsmapi.commons.facade.AbstractFacade;
+import org.tmf.dsmapi.hub.model.Hub;
/**
*
@@ -18,9 +15,7 @@ public class HubFacade extends AbstractFacade{
@PersistenceContext(unitName = "DSTroubleTicketPU")
private EntityManager em;
-
-
/**
*
*/
@@ -28,10 +23,9 @@ public HubFacade() {
super(Hub.class);
}
-
@Override
protected EntityManager getEntityManager() {
return em;
}
-
+
}
diff --git a/src/main/java/org/tmf/dsmapi/hub/service/RESTClient.java b/src/main/java/org/tmf/dsmapi/hub/service/RESTClient.java
new file mode 100644
index 0000000..00a33ff
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/hub/service/RESTClient.java
@@ -0,0 +1,60 @@
+package org.tmf.dsmapi.hub.service;
+
+import java.util.HashMap;
+import javax.ejb.Stateless;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.MediaType;
+import org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider;
+import org.codehaus.jackson.map.DeserializationConfig;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.SerializationConfig;
+import org.codehaus.jackson.node.ObjectNode;
+import org.glassfish.jersey.client.ClientConfig;
+import org.glassfish.jersey.client.ClientProperties;
+
+@Stateless
+public class RESTClient {
+
+ private static Client jaxrsClient;
+ private final HashMap webTarget = new HashMap();
+
+ public void publishEvent(String callbackURL, Object requestEntity) {
+ System.out.println("publishEvent " + requestEntity);
+ WebTarget webResource = getWebResource(callbackURL);
+ Entity entity = Entity.entity(requestEntity, MediaType.APPLICATION_JSON);
+ webResource.request(javax.ws.rs.core.MediaType.APPLICATION_JSON).post(entity);
+ }
+
+ public void publishEvent(String callbackURL, ObjectNode node) {
+ System.out.println("publishEvent " + node);
+ WebTarget webResource = getWebResource(callbackURL);
+ Entity entity = Entity.entity(node, MediaType.APPLICATION_JSON);
+ webResource.request(javax.ws.rs.core.MediaType.APPLICATION_JSON).post(entity);
+ }
+
+ private Client getJaxrsClient() {
+ if (jaxrsClient == null) {
+ ObjectMapper mapper = new ObjectMapper().configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false).configure(SerializationConfig.Feature.INDENT_OUTPUT, true).configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, true);
+ JacksonJaxbJsonProvider jacksonProvider = new JacksonJaxbJsonProvider();
+ jacksonProvider.setMapper(mapper);
+ ClientConfig config = new ClientConfig();
+ config.register(jacksonProvider);
+ jaxrsClient = ClientBuilder.newClient(config);
+ jaxrsClient.property(ClientProperties.CONNECT_TIMEOUT, 3000);
+ jaxrsClient.property(ClientProperties.READ_TIMEOUT, 3000);
+ }
+ return jaxrsClient;
+ }
+
+ // In memory caching, webTarget and client are thread safe see jersey doc
+ private WebTarget getWebResource(String endpointURL) {
+ if (!webTarget.containsKey(endpointURL)) {
+ WebTarget webResource = getJaxrsClient().target(endpointURL).path("");
+ webTarget.put(endpointURL, webResource);
+ }
+ return webTarget.get(endpointURL);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/org/tmf/dsmapi/hub/service/RESTEventPublisher.java b/src/main/java/org/tmf/dsmapi/hub/service/RESTEventPublisher.java
new file mode 100644
index 0000000..567a012
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/hub/service/RESTEventPublisher.java
@@ -0,0 +1,56 @@
+package org.tmf.dsmapi.hub.service;
+
+import java.util.List;
+import java.util.Set;
+import javax.ejb.Asynchronous;
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.ws.rs.core.MultivaluedMap;
+import org.codehaus.jackson.node.ObjectNode;
+import org.tmf.dsmapi.commons.utils.Jackson;
+import org.tmf.dsmapi.commons.utils.URIParser;
+import org.tmf.dsmapi.hub.model.Event;
+import org.tmf.dsmapi.hub.model.Hub;
+
+/**
+ *
+ * @author pierregauthier
+ */
+@Stateless
+@Asynchronous
+public class RESTEventPublisher implements RESTEventPublisherLocal {
+
+ @EJB
+ EventFacade eventFacade;
+
+ @EJB
+ RESTClient client;
+
+ @Override
+ public void publish(Hub hub, Event event) {
+
+ MultivaluedMap query = URIParser.getParameters(hub.getQuery());
+ query.putSingle("id", event.getId());
+
+ // fields to filter view
+ Set fieldSet = URIParser.getFieldsSelection(query);
+
+ List resultList = null;
+ resultList = eventFacade.findByCriteria(query, Event.class);
+
+ if (resultList != null && !resultList.isEmpty()) {
+ if (!fieldSet.isEmpty() && !fieldSet.contains(URIParser.ALL_FIELDS)) {
+ fieldSet.add("id");
+ fieldSet.add("date");
+ fieldSet.add("eventType");
+ fieldSet.add("reason");
+ ObjectNode rootNode = Jackson.createNode(event, fieldSet);
+ client.publishEvent(hub.getCallback(), rootNode);
+ } else {
+ client.publishEvent(hub.getCallback(), event);
+ }
+
+ }
+ }
+
+}
diff --git a/src/main/java/org/tmf/dsmapi/hub/service/RESTEventPublisherLocal.java b/src/main/java/org/tmf/dsmapi/hub/service/RESTEventPublisherLocal.java
new file mode 100644
index 0000000..90033b0
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/hub/service/RESTEventPublisherLocal.java
@@ -0,0 +1,16 @@
+package org.tmf.dsmapi.hub.service;
+
+import javax.ejb.Local;
+import org.tmf.dsmapi.hub.model.Event;
+import org.tmf.dsmapi.hub.model.Hub;
+
+/**
+ *
+ * @author pierregauthier
+ */
+@Local
+public interface RESTEventPublisherLocal {
+
+ public void publish(Hub hub, Event event);
+
+}
diff --git a/src/main/java/org/tmf/dsmapi/jaxrs/ApplicationConfig.java b/src/main/java/org/tmf/dsmapi/jaxrs/ApplicationConfig.java
new file mode 100644
index 0000000..809dede
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/jaxrs/ApplicationConfig.java
@@ -0,0 +1,33 @@
+package org.tmf.dsmapi.jaxrs;
+
+import java.util.Set;
+import javax.ws.rs.core.Application;
+
+@javax.ws.rs.ApplicationPath("troubleTicketApi")
+public class ApplicationConfig extends Application {
+
+ @Override
+ public Set> getClasses() {
+ return getRestResourceClasses();
+ }
+
+ private Set> getRestResourceClasses() {
+ Set> resources = new java.util.HashSet>();
+ resources.add(org.tmf.dsmapi.commons.jaxrs.provider.BadUsageExceptionMapper.class);
+ resources.add(org.tmf.dsmapi.commons.jaxrs.provider.JacksonConfigurator.class);
+ resources.add(org.tmf.dsmapi.commons.jaxrs.provider.JsonMappingExceptionMapper.class);
+ resources.add(org.tmf.dsmapi.commons.jaxrs.provider.UnknowResourceExceptionMapper.class);
+ resources.add(org.tmf.dsmapi.jaxrs.resource.AdminResource.class);
+ resources.add(org.tmf.dsmapi.jaxrs.resource.HubResource.class);
+ resources.add(org.tmf.dsmapi.jaxrs.resource.TroubleTicketResource.class);
+ // following code can be used to customize Jersey 1.x JSON provider:
+ try {
+ Class jacksonProvider = Class.forName("org.codehaus.jackson.jaxrs.JacksonJsonProvider");
+ resources.add(jacksonProvider);
+ } catch (ClassNotFoundException ex) {
+ java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE, null, ex);
+ }
+ return resources;
+ }
+
+}
diff --git a/src/main/java/org/tmf/dsmapi/jaxrs/resource/AdminResource.java b/src/main/java/org/tmf/dsmapi/jaxrs/resource/AdminResource.java
new file mode 100644
index 0000000..e8dfd5a
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/jaxrs/resource/AdminResource.java
@@ -0,0 +1,237 @@
+package org.tmf.dsmapi.jaxrs.resource;
+
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Response;
+import org.tmf.dsmapi.troubleTicket.model.Report;
+import org.tmf.dsmapi.commons.exceptions.BadUsageException;
+import org.tmf.dsmapi.commons.exceptions.UnknownResourceException;
+import org.tmf.dsmapi.hub.model.Event;
+import org.tmf.dsmapi.hub.service.EventFacade;
+import org.tmf.dsmapi.hub.service.EventPublisherLocal;
+import org.tmf.dsmapi.hub.service.HubFacade;
+import org.tmf.dsmapi.troubleTicket.model.TroubleTicket;
+import org.tmf.dsmapi.troubleTicket.service.TroubleTicketFacade;
+
+/**
+ *
+ * @author maig7313
+ */
+@Stateless
+@Path("admin")
+public class AdminResource {
+
+ @EJB
+ TroubleTicketFacade troubleTicketFacade;
+ @EJB
+ EventFacade eventFacade;
+ @EJB
+ HubFacade hubFacade;
+ @EJB
+ EventPublisherLocal publisher;
+
+ /**
+ *
+ * @param entities
+ * @return
+ */
+ @POST
+ @Path("")
+ @Consumes({"application/json"})
+ @Produces({"application/json"})
+ public Response post(List entities) {
+
+ if (entities == null) {
+ return Response.status(Response.Status.BAD_REQUEST.getStatusCode()).build();
+ }
+
+ int previousRows = troubleTicketFacade.count();
+ int affectedRows;
+
+ // Try to persist entities
+ try {
+ affectedRows = troubleTicketFacade.create(entities);
+ } catch (BadUsageException e) {
+ return Response.status(Response.Status.BAD_REQUEST.getStatusCode()).build();
+ }
+
+ Report stat = new Report(troubleTicketFacade.count());
+ stat.setAffectedRows(affectedRows);
+ stat.setPreviousRows(previousRows);
+
+ // 201 OK
+ return Response.created(null).
+ entity(stat).
+ build();
+ }
+
+ /**
+ *
+ * @return
+ * @throws tmf.org.dsmapi.commons.exceptions.UnknownResourceException
+ */
+ @DELETE
+ @Path("")
+ public Report deleteAll() throws UnknownResourceException {
+
+ eventFacade.removeAll();
+ int previousRows = troubleTicketFacade.count();
+ troubleTicketFacade.removeAll();
+ List tts = troubleTicketFacade.findAll();
+ for (TroubleTicket tt : tts) {
+ delete(tt.getId());
+ }
+ int currentRows = troubleTicketFacade.count();
+ int affectedRows = previousRows - currentRows;
+
+ Report stat = new Report(currentRows);
+ stat.setAffectedRows(affectedRows);
+ stat.setPreviousRows(previousRows);
+
+ return stat;
+ }
+
+ /**
+ *
+ * @param id
+ * @return
+ * @throws UnknownResourceException
+ */
+ @DELETE
+ @Path("{id}")
+// public Report delete(@PathParam("id") String id) throws UnknownResourceException {
+ public Response delete(@PathParam("id") String id) {
+ try {
+ // int previousRows = troubleTicketFacade.count();
+ TroubleTicket entity = troubleTicketFacade.find(id);
+
+ try {
+ //Pause for 4 seconds to finish notification
+ Thread.sleep(4000);
+ } catch (InterruptedException ex) {
+ Logger.getLogger(AdminResource.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ // remove event(s) binding to the resource
+ List events = eventFacade.findAll();
+ for (Event event : events) {
+ if (event.getResource().getId().equals(id)) {
+ eventFacade.remove(event.getId());
+ }
+ }
+ //remove resource
+ troubleTicketFacade.remove(id);
+
+ // int affectedRows = 1;
+ // Report stat = new Report(troubleTicketFacade.count());
+ // stat.setAffectedRows(affectedRows);
+ // stat.setPreviousRows(previousRows);
+ // return stat;
+ // 200
+ Response response = Response.ok(entity).build();
+ return response;
+ } catch (UnknownResourceException ex) {
+ Logger.getLogger(AdminResource.class.getName()).log(Level.SEVERE, null, ex);
+ Response response = Response.status(Response.Status.NOT_FOUND).build();
+ return response;
+ }
+ }
+
+ /**
+ *
+ * @return
+ */
+ @DELETE
+ @Path("hub")
+ public Report deleteAllHub() {
+
+ int previousRows = hubFacade.count();
+ hubFacade.removeAll();
+ int currentRows = hubFacade.count();
+ int affectedRows = previousRows - currentRows;
+
+ Report stat = new Report(currentRows);
+ stat.setAffectedRows(affectedRows);
+ stat.setPreviousRows(previousRows);
+
+ return stat;
+ }
+
+ @DELETE
+ @Path("event")
+ public Report deleteAllEvent() {
+
+ int previousRows = eventFacade.count();
+ eventFacade.removeAll();
+ int currentRows = eventFacade.count();
+ int affectedRows = previousRows - currentRows;
+
+ Report stat = new Report(currentRows);
+ stat.setAffectedRows(affectedRows);
+ stat.setPreviousRows(previousRows);
+
+ return stat;
+ }
+
+ @DELETE
+ @Path("event/{id}")
+// public Report deleteEvent(@PathParam("id") String id) throws UnknownResourceException {
+ public Response deleteEvent(@PathParam("id") String id) throws UnknownResourceException {
+
+// int previousRows = eventFacade.count();
+ List events = eventFacade.findAll();
+ Event oneEvent = null;
+ for (Event event : events) {
+ if (event.getResource().getId().equals(id)) {
+ oneEvent = event;
+ eventFacade.remove(event.getId());
+
+ }
+ }
+// int currentRows = eventFacade.count();
+// int affectedRows = previousRows - currentRows;
+//
+// Report stat = new Report(currentRows);
+// stat.setAffectedRows(affectedRows);
+// stat.setPreviousRows(previousRows);
+//
+// return stat;
+ // 200
+ Response response = Response.ok(oneEvent).build();
+ return response;
+ }
+
+ /**
+ *
+ * @return
+ */
+ @GET
+ @Path("count")
+ @Produces({"application/json"})
+ public Report count() {
+ return new Report(troubleTicketFacade.count());
+ }
+// /**
+// *
+// */
+// @DELETE
+// @Path("troubleTicket/cache")
+// public void clearCache() {
+// troubleTicketFacade.clearCache();
+// }
+//
+// @PUT
+// @Path("troubleTicket/wf/delay/{value}")
+// public void patchDelay(@PathParam("value") long value) {
+// troubleTicketFacade.setDelay(value);
+// }
+}
diff --git a/src/main/java/org/tmf/dsmapi/jaxrs/resource/HubResource.java b/src/main/java/org/tmf/dsmapi/jaxrs/resource/HubResource.java
new file mode 100644
index 0000000..13ce996
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/jaxrs/resource/HubResource.java
@@ -0,0 +1,177 @@
+package org.tmf.dsmapi.jaxrs.resource;
+
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import org.codehaus.jackson.node.ObjectNode;
+import org.tmf.dsmapi.commons.exceptions.BadUsageException;
+import org.tmf.dsmapi.commons.exceptions.UnknownResourceException;
+import org.tmf.dsmapi.commons.utils.Jackson;
+import org.tmf.dsmapi.commons.utils.URIParser;
+import org.tmf.dsmapi.hub.model.Event;
+import org.tmf.dsmapi.hub.model.EventTypeEnum;
+import org.tmf.dsmapi.hub.model.Hub;
+import org.tmf.dsmapi.hub.service.EventFacade;
+import org.tmf.dsmapi.hub.service.HubFacade;
+import org.tmf.dsmapi.troubleTicket.model.TroubleTicket;
+
+/**
+ *
+ * @author pierregauthier
+ */
+@Stateless
+@Path("hub")
+public class HubResource {
+
+ @EJB
+ HubFacade hubFacade;
+ @EJB
+ EventFacade eventFacade;
+
+ public HubResource() {
+ }
+
+ @POST
+ @Path("")
+ @Consumes({"application/json"})
+ @Produces({"application/json"})
+ public Response create(Hub entity) throws BadUsageException {
+ entity.setId(null);
+ hubFacade.create(entity);
+ Response response = Response.ok(entity).build();
+ return response;
+ }
+
+ @DELETE
+ @Path("{id}")
+ public void remove(@PathParam("id") String id) throws UnknownResourceException {
+ hubFacade.remove(id);
+ }
+
+ @GET
+ @Path("{id}")
+ @Produces({"application/json"})
+ public Response findById(@PathParam("id") String id, @Context UriInfo info) throws UnknownResourceException {
+ // fields to filter view
+ Set fieldSet = URIParser.getFieldsSelection(info.getQueryParameters());
+
+ Hub entity = hubFacade.find(id);
+ Response response;
+ if (entity != null) {
+ // 200
+ if (fieldSet.isEmpty() || fieldSet.contains(URIParser.ALL_FIELDS)) {
+ response = Response.ok(entity).build();
+ } else {
+ fieldSet.add(URIParser.ID_FIELD);
+ ObjectNode node = Jackson.createNode(entity, fieldSet);
+ response = Response.ok(node).build();
+ }
+ } else {
+ // 404 not found
+ response = Response.status(Response.Status.NOT_FOUND).build();
+ }
+ return response;
+ }
+
+ @GET
+ @Produces({"application/json"})
+ public List findAll() {
+ return hubFacade.findAll();
+ }
+
+ @POST
+ @Path("listener")
+ @Consumes({"application/json"})
+ @Produces({"application/json"})
+ public void publishEvent(Event event) {
+
+ System.out.println("HubEvent =" + event);
+ System.out.println("Event = " + event.getResource());
+ System.out.println("Event type = " + event.getEventType());
+
+ }
+
+
+ @GET
+ @Path("listener")
+ @Produces({"application/json"})
+ public Response findEvents(@Context UriInfo info) {
+
+ // search criteria
+ MultivaluedMap parameters = URIParser.getParameters(info);
+ // fields to filter view
+ Set fieldsSelection = URIParser.getFieldsSelection(parameters);
+
+ Set resultList = findByCriteria(parameters);
+
+ Response response;
+ if (fieldsSelection.isEmpty() || fieldsSelection.contains(URIParser.ALL_FIELDS)) {
+ response = Response.ok(resultList).build();
+ } else {
+ fieldsSelection.add(URIParser.ID_FIELD);
+ List nodeList = Jackson.createNodes(resultList, fieldsSelection);
+ response = Response.ok(nodeList).build();
+ }
+ return response;
+ }
+
+ // return Set of unique elements to avoid List with same elements in case of join
+ private Set findByCriteria(MultivaluedMap criteria) {
+ List resultList = null;
+ if (criteria != null && !criteria.isEmpty()) {
+ resultList = eventFacade.findByCriteria(criteria, Event.class);
+ } else {
+ resultList = eventFacade.findAll();
+ }
+ if (resultList == null) {
+ return new LinkedHashSet();
+ } else {
+ return new LinkedHashSet(resultList);
+ }
+ }
+
+ @GET
+ @Path("proto")
+ @Produces({"application/json"})
+ public Hub hubProto() {
+ Hub hub = new Hub();
+ hub.setCallback("callback");
+ hub.setQuery("queryString");
+ hub.setId("id");
+ return hub;
+ }
+
+ @GET
+ @Path("eventProto")
+ @Produces({"application/json"})
+ public Event eventProto() {
+ Event event = new Event();
+ event.setResource(proto());
+ event.setEventType(EventTypeEnum.TicketCreateNotification);
+ System.out.println("Event = " + event.getResource().toString());
+ System.out.println("Event type = " + event.getEventType().getText());
+ return event;
+ }
+
+ /**
+ *
+ * @return
+ */
+ public TroubleTicket proto() {
+ TroubleTicket tt = new TroubleTicket();
+ return tt;
+ }
+}
diff --git a/src/main/java/org/tmf/dsmapi/jaxrs/resource/TroubleTicketResource.java b/src/main/java/org/tmf/dsmapi/jaxrs/resource/TroubleTicketResource.java
new file mode 100644
index 0000000..d9a66fd
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/jaxrs/resource/TroubleTicketResource.java
@@ -0,0 +1,284 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.tmf.dsmapi.jaxrs.resource;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.ejb.TransactionAttribute;
+import javax.ejb.TransactionAttributeType;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.node.ObjectNode;
+import org.tmf.dsmapi.commons.exceptions.BadUsageException;
+import org.tmf.dsmapi.commons.exceptions.TechnicalException;
+import org.tmf.dsmapi.commons.exceptions.UnknownResourceException;
+import org.tmf.dsmapi.commons.utils.Jackson;
+import org.tmf.dsmapi.commons.utils.PATCH;
+import org.tmf.dsmapi.commons.utils.TMFDate;
+import org.tmf.dsmapi.commons.utils.URIParser;
+import org.tmf.dsmapi.hub.service.EventPublisherLocal;
+import org.tmf.dsmapi.troubleTicket.model.Note;
+import org.tmf.dsmapi.troubleTicket.model.RelatedObject;
+import org.tmf.dsmapi.troubleTicket.model.RelatedParty;
+import org.tmf.dsmapi.troubleTicket.model.Severity;
+import org.tmf.dsmapi.troubleTicket.model.Status;
+import org.tmf.dsmapi.troubleTicket.model.TroubleTicket;
+import org.tmf.dsmapi.troubleTicket.model.TroubleTicketField;
+import org.tmf.dsmapi.troubleTicket.service.TroubleTicketFacade;
+
+/**
+ *
+ * @author pierregauthier
+ */
+@Stateless
+@Path("troubleTicket")
+@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
+public class TroubleTicketResource {
+
+ @EJB
+ TroubleTicketFacade troubleTicketFacade;
+ @EJB
+ EventPublisherLocal publisher;
+
+ public TroubleTicketResource() {
+ }
+
+ @GET
+ @Produces({"application/json"})
+ public Response findByCriteriaWithFields(@Context UriInfo info) throws BadUsageException {
+
+ // search queryParameters
+ MultivaluedMap queryParameters = info.getQueryParameters();
+ // fields to filter view
+ Set fieldSet = URIParser.getFieldsSelection(queryParameters);
+
+ Set resultList = findByCriteria(queryParameters);
+
+ Response response;
+ if (fieldSet.isEmpty() || fieldSet.contains(URIParser.ALL_FIELDS)) {
+ response = Response.ok(resultList).build();
+ } else {
+ fieldSet.add(URIParser.ID_FIELD);
+ List nodeList = Jackson.createNodes(resultList, fieldSet);
+ response = Response.ok(nodeList).build();
+ }
+ return response;
+ }
+
+ // return Set of unique elements to avoid List with same elements in case of join
+ private Set findByCriteria(MultivaluedMap criteria) throws BadUsageException {
+
+ List resultList = null;
+ if (criteria != null && !criteria.isEmpty()) {
+ resultList = troubleTicketFacade.findByCriteria(criteria, TroubleTicket.class);
+ } else {
+ resultList = troubleTicketFacade.findAll();
+ }
+ if (resultList == null) {
+ return new LinkedHashSet();
+ } else {
+ return new LinkedHashSet(resultList);
+ }
+ }
+
+ /**
+ *
+ * @param id
+ * @param info
+ * @return
+ * @throws UnknownResourceException
+ */
+ @GET
+ @Path("{id}")
+ @Produces({"application/json"})
+ public Response findById(@PathParam("id") String id, @Context UriInfo info) throws UnknownResourceException {
+
+ // fields to filter view
+ Set fieldSet = URIParser.getFieldsSelection(info.getQueryParameters());
+
+ TroubleTicket troubleTicket = troubleTicketFacade.find(id);
+ Response response;
+ if (troubleTicket != null) {
+ // 200
+ if (fieldSet.isEmpty() || fieldSet.contains(URIParser.ALL_FIELDS)) {
+ response = Response.ok(troubleTicket).build();
+ } else {
+ fieldSet.add(URIParser.ID_FIELD);
+ ObjectNode node = Jackson.createNode(troubleTicket, fieldSet);
+ response = Response.ok(node).build();
+ }
+ } else {
+ // 404 not found
+ response = Response.status(Response.Status.NOT_FOUND).build();
+ }
+ return response;
+ }
+
+ /**
+ *
+ * @param entity
+ * @return
+ * @throws BadUsageException
+ * @throws TechnicalException
+ */
+ @POST
+ @Consumes({"application/json"})
+ @Produces({"application/json"})
+ public Response create(TroubleTicket entity) throws BadUsageException, TechnicalException {
+
+ entity.setStatus(Status.Submitted);
+ entity.setStatusChangeDate(TMFDate.toString(new Date()));
+ troubleTicketFacade.create(entity);
+ publisher.createNotification(entity, "New TroubleTicket", new Date());
+ // 201
+ Response response = Response.status(Response.Status.CREATED).entity(entity).build();
+ return response;
+
+ }
+
+ /**
+ *
+ * @param id
+ * @param entity
+ * @return
+ * @throws UnknownResourceException
+ */
+ @PUT
+ @Path("{id}")
+ @Consumes({"application/json"})
+ @Produces({"application/json"})
+ public Response put(@PathParam("id") String id, TroubleTicket entity) throws UnknownResourceException {
+
+ Response response = null;
+ TroubleTicket troubleTicket = troubleTicketFacade.find(id);
+ if (troubleTicket != null) {
+ entity.setId(id);
+ troubleTicketFacade.edit(entity);
+ publisher.changedNotification(entity, "TroubleTicket Modified", new Date());
+ // 201 OK + location
+ response = Response.status(Response.Status.CREATED).entity(entity).build();
+
+ } else {
+ // 404 not found
+ response = Response.status(Response.Status.NOT_FOUND).build();
+ }
+ return response;
+ }
+
+ /**
+ *
+ * @param id
+ * @param jsonNode
+ * @return
+ * @throws BadUsageException
+ * @throws UnknownResourceException
+ */
+ @PATCH
+ @Path("{id}")
+ @Consumes({"application/json"})
+ @Produces({"application/json"})
+ public Response patch(@PathParam("id") String id, JsonNode jsonNode) throws BadUsageException, UnknownResourceException {
+
+ Set fields = new HashSet();
+
+ // Iterate over first level to set received tokens
+ Iterator it = jsonNode.getFieldNames();
+ while (it.hasNext()) {
+ fields.add(TroubleTicketField.fromString(it.next()));
+ }
+
+ ObjectMapper mapper = new ObjectMapper();
+ TroubleTicket partialTT;
+ try {
+ partialTT = mapper.readValue(jsonNode, TroubleTicket.class);
+ } catch (Exception ex) {
+ Logger.getLogger(TroubleTicketResource.class.getName()).log(Level.SEVERE, null, ex);
+ throw new TechnicalException();
+ }
+
+ // id is in URL
+ partialTT.setId(id);
+
+ // Status is updated when correlationId==nul ( admin or demo purpose only)
+ TroubleTicket fullTT = troubleTicketFacade.updateAttributes(partialTT, fields);
+
+ // 201
+ Response response = Response.status(Response.Status.CREATED).entity(fullTT).build();
+ return response;
+
+ }
+
+ /**
+ *
+ * @return
+ */
+ @GET
+ @Path("mock")
+ @Produces({"application/json"})
+ public TroubleTicket mock() {
+ TroubleTicket tt = new TroubleTicket();
+ tt.setId("id");
+ Date dt = new Date();
+ String dts = TMFDate.toString(dt);
+ tt.setDescription("Some Description");
+
+
+ tt.setCreationDate(dts);
+ tt.setStatus(Status.Acknowledged);
+ tt.setSeverity(Severity.Medium);
+ tt.setType("Bills, charges or payment");
+ tt.setResolutionDate(dts);
+ tt.setTargetResolutionDate(dts);
+
+ RelatedObject ro = new RelatedObject();
+ ro.setInvolvement("involvment");
+ ro.setReference("referenceobject");
+
+ List relatedObjects = new ArrayList();
+ relatedObjects.add(ro);
+ relatedObjects.add(ro);
+ tt.setRelatedObjects(relatedObjects);
+
+ RelatedParty rp = new RelatedParty();
+ rp.setRole("role");
+ rp.setReference("reference party");
+
+ List relatedParties = new ArrayList();
+ relatedParties.add(rp);
+ relatedParties.add(rp);
+ tt.setRelatedParties(relatedParties);
+
+ Note note = new Note();
+ note.setAuthor("author");
+ note.setDate(dts);
+ note.setText("text");
+ List notes = new ArrayList();
+ notes.add(note);
+ notes.add(note);
+ tt.setNotes(notes);
+ return tt;
+
+ }
+}
diff --git a/src/main/java/org/tmf/dsmapi/subscriber/model/EventBag.java b/src/main/java/org/tmf/dsmapi/subscriber/model/EventBag.java
new file mode 100644
index 0000000..37f86b3
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/subscriber/model/EventBag.java
@@ -0,0 +1,51 @@
+package org.tmf.dsmapi.subscriber.model;
+
+import java.io.Serializable;
+import java.util.Date;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.Temporal;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+import org.tmf.dsmapi.commons.utils.TMFDate;
+
+@Entity
+public class EventBag implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private String id;
+ @Lob
+ private byte[] event;
+ @Temporal(javax.persistence.TemporalType.TIMESTAMP)
+ @JsonSerialize(using = TMFDate.class)
+ private Date date;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public byte[] getEvent() {
+ return event;
+ }
+
+ public void setEvent(byte[] event) {
+ this.event = event;
+ }
+
+ public Date getDate() {
+ return date;
+ }
+
+ public void setDate(Date date) {
+ this.date = date;
+ }
+
+}
diff --git a/src/main/java/org/tmf/dsmapi/subscriber/resource/Current.java b/src/main/java/org/tmf/dsmapi/subscriber/resource/Current.java
new file mode 100644
index 0000000..fce535c
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/subscriber/resource/Current.java
@@ -0,0 +1,54 @@
+package org.tmf.dsmapi.subscriber.resource;
+
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.List;
+import javax.ejb.EJB;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.tmf.dsmapi.subscriber.model.EventBag;
+import org.tmf.dsmapi.subscriber.service.EventApiFacade;
+
+@WebServlet("/subscriber/eventApi/current")
+public class Current extends HttpServlet {
+
+ @EJB
+ EventApiFacade eventApiFacade;
+
+ public Current() {
+ }
+
+ public void doGet(HttpServletRequest request, HttpServletResponse response)
+ throws IOException {
+
+ ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
+ DataOutputStream out = new DataOutputStream(byteOut);
+
+ List events = eventApiFacade.findAll();
+ ServletOutputStream servletOut = response.getOutputStream();
+ EventBag mostRecentNotif = null;
+ for (int i = 0; events.size() > i; i++) {
+ mostRecentNotif = events.get(i);
+ if (events.get(i).getDate().before(mostRecentNotif.getDate())) {
+ mostRecentNotif = events.get(i);
+ }
+ }
+ if (null != mostRecentNotif) {
+ servletOut.write(mostRecentNotif.getEvent());
+ response.setContentType("application/json");
+ response.setStatus(200);
+ } else {
+ servletOut.write("no event found".getBytes());
+ response.setContentType("application/text");
+ response.setStatus(404);
+ }
+ out.flush();
+ servletOut.close();
+ byteOut.close();
+ byteOut = null;
+ }
+}
diff --git a/src/main/java/org/tmf/dsmapi/subscriber/resource/Event.java b/src/main/java/org/tmf/dsmapi/subscriber/resource/Event.java
new file mode 100644
index 0000000..25762e3
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/subscriber/resource/Event.java
@@ -0,0 +1,92 @@
+package org.tmf.dsmapi.subscriber.resource;
+
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.util.Date;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.ejb.EJB;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.tmf.dsmapi.commons.exceptions.BadUsageException;
+import org.tmf.dsmapi.commons.utils.TMFDate;
+import org.tmf.dsmapi.subscriber.model.EventBag;
+import org.tmf.dsmapi.subscriber.service.EventApiFacade;
+
+@WebServlet("/subscriber/eventApi/event")
+public class Event extends HttpServlet {
+
+ @EJB
+ EventApiFacade eventApiFacade;
+
+ private static long index = 0;
+
+ public synchronized String getIndex() {
+ return Long.toString(index++);
+ }
+
+
+ public Event() {
+ }
+
+ public void doPost(HttpServletRequest request, HttpServletResponse response)
+ throws IOException {
+ EventBag notification = new EventBag();
+ response.setContentType("application/json");
+ notification.setDate(TMFDate.parse(TMFDate.toString(new Date())));
+ ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
+ DataInputStream in = new DataInputStream(request.getInputStream());
+ byte[] buffer = new byte[256];
+ int bytesRead = 0;
+ while ((bytesRead = in.read(buffer)) != -1) {
+ byteOut.write(buffer, 0, bytesRead);
+ }
+ notification.setEvent(byteOut.toByteArray());
+ try {
+ eventApiFacade.create(notification);
+ response.setStatus(201);
+ } catch (BadUsageException ex) {
+ Logger.getLogger(Event.class.getName()).log(Level.SEVERE, null, ex);
+ response.setStatus(500);
+ }
+ byteOut.close();
+ byteOut = null;
+ System.gc();
+ }
+
+ public void doGet(HttpServletRequest request, HttpServletResponse response)
+ throws IOException {
+
+ ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
+ response.setContentType("application/json");
+ List notifications = eventApiFacade.findAll();
+ ServletOutputStream servletOut = response.getOutputStream();
+ servletOut.write("[".getBytes());
+ for (int i = 0; notifications.size() > i; i++) {
+ servletOut.write(notifications.get(i).getEvent());
+ if (i + 1 < notifications.size()) {
+ servletOut.write(",".getBytes());
+ }
+ }
+ servletOut.write("]".getBytes());
+ response.setStatus(200);
+ servletOut.close();
+ byteOut.close();
+ byteOut = null;
+ System.gc();
+ }
+
+ public void doDelete(HttpServletRequest request, HttpServletResponse response)
+ throws IOException {
+ List notifications = eventApiFacade.findAll();
+ eventApiFacade.removeAll();
+ response.setStatus(200);
+ response.getWriter().println(notifications.size()+" event(s) deleted");
+ }
+
+}
diff --git a/src/main/java/org/tmf/dsmapi/subscriber/resource/History.java b/src/main/java/org/tmf/dsmapi/subscriber/resource/History.java
new file mode 100644
index 0000000..fdaa048
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/subscriber/resource/History.java
@@ -0,0 +1,54 @@
+package org.tmf.dsmapi.subscriber.resource;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.List;
+import javax.ejb.EJB;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.tmf.dsmapi.subscriber.model.EventBag;
+import org.tmf.dsmapi.subscriber.service.EventApiFacade;
+
+@WebServlet("/subscriber/eventApi/history")
+public class History extends HttpServlet {
+
+ @EJB
+ EventApiFacade eventApiFacade;
+
+ public History() {
+ }
+
+ public void doGet(HttpServletRequest request, HttpServletResponse response)
+ throws IOException {
+
+ ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
+ response.setContentType("application/json");
+ List notifications = eventApiFacade.findAll();
+ ServletOutputStream servletOut = response.getOutputStream();
+ servletOut.write("[".getBytes());
+ for (int i = 0; notifications.size() > i; i++) {
+ servletOut.write(notifications.get(i).getEvent());
+ if (i + 1 < notifications.size()) {
+ servletOut.write(",".getBytes());
+ }
+ }
+ servletOut.write("]".getBytes());
+ response.setStatus(200);
+ servletOut.close();
+ byteOut.close();
+ byteOut = null;
+ System.gc();
+ }
+
+ public void doDelete(HttpServletRequest request, HttpServletResponse response)
+ throws IOException {
+ List notifications = eventApiFacade.findAll();
+ eventApiFacade.removeAll();
+ response.setStatus(200);
+ response.getWriter().println(notifications.size()+" event(s) deleted");
+ }
+
+}
diff --git a/src/main/java/org/tmf/dsmapi/subscriber/service/EventApiFacade.java b/src/main/java/org/tmf/dsmapi/subscriber/service/EventApiFacade.java
new file mode 100644
index 0000000..a584433
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/subscriber/service/EventApiFacade.java
@@ -0,0 +1,28 @@
+package org.tmf.dsmapi.subscriber.service;
+
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import org.tmf.dsmapi.commons.facade.AbstractFacade;
+import org.tmf.dsmapi.subscriber.model.EventBag;
+
+/**
+ *
+ * @author ecus6396
+ */
+@Stateless
+public class EventApiFacade extends AbstractFacade {
+
+ @PersistenceContext(unitName = "DSTroubleTicketPU")
+ private EntityManager em;
+
+ public EventApiFacade() {
+ super(EventBag.class);
+ }
+
+ @Override
+ protected EntityManager getEntityManager() {
+ return em;
+ }
+
+}
diff --git a/src/main/java/org/tmf/dsmapi/troubleTicket/model/IncidentType.java b/src/main/java/org/tmf/dsmapi/troubleTicket/model/IncidentType.java
new file mode 100644
index 0000000..a341abd
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/troubleTicket/model/IncidentType.java
@@ -0,0 +1,36 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.tmf.dsmapi.troubleTicket.model;
+
+/**
+ * none that i know
+ * @author pierregauthier ATMFORUM
+ */
+public enum IncidentType {
+ /**
+ *
+ */
+ Submitted,
+ /**
+ *
+ */
+ Acknowledged,
+ /**
+ *
+ */
+ InProgress,
+ /**
+ *
+ */
+ Resolved,
+ /**
+ *
+ */
+ Closed,
+ /**
+ *
+ */
+ Rejected; //; is optional
+}
diff --git a/src/main/java/org/tmf/dsmapi/troubleTicket/model/JsonError.java b/src/main/java/org/tmf/dsmapi/troubleTicket/model/JsonError.java
new file mode 100644
index 0000000..d33922a
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/troubleTicket/model/JsonError.java
@@ -0,0 +1,74 @@
+package org.tmf.dsmapi.troubleTicket.model;
+
+import org.tmf.dsmapi.commons.exceptions.KeyValue;
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlRootElement;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+import org.tmf.dsmapi.commons.exceptions.ExceptionBean;
+
+@XmlRootElement
+@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+public class JsonError {
+
+ private ExceptionBean error;
+ private String detail;
+ private List keyValue;
+
+ public JsonError(ExceptionBean error) {
+ this.error = error;
+ }
+
+ public JsonError(ExceptionBean error, String detail) {
+ this.error = error;
+ this.detail = detail;
+ }
+
+ public JsonError(ExceptionBean error, String detail, List keyValue) {
+ this.error = error;
+ this.detail = detail;
+ this.keyValue = keyValue;
+ }
+
+ /**
+ * @return the type
+ */
+ public ExceptionBean getError() {
+ return error;
+ }
+
+ /**
+ * @param type the type to set
+ */
+ public void setError(ExceptionBean error) {
+ this.error = error;
+ }
+
+ /**
+ * @return the detail
+ */
+ public String getDetail() {
+ return detail;
+ }
+
+ /**
+ * @param detail the detail to set
+ */
+ public void setDetail(String detail) {
+ this.detail = detail;
+ }
+
+ /**
+ * @return the keyValue
+ */
+ public List getKeyValue() {
+ return keyValue;
+ }
+
+ public void addKeyValue(KeyValue keyValue) {
+ if (this.keyValue == null) {
+ this.keyValue = new ArrayList();
+ }
+ this.keyValue.add(keyValue);
+ }
+}
diff --git a/src/java/tmf/org/dsmapi/tt/Note.java b/src/main/java/org/tmf/dsmapi/troubleTicket/model/Note.java
similarity index 78%
rename from src/java/tmf/org/dsmapi/tt/Note.java
rename to src/main/java/org/tmf/dsmapi/troubleTicket/model/Note.java
index 0320a08..b42bf8f 100644
--- a/src/java/tmf/org/dsmapi/tt/Note.java
+++ b/src/main/java/org/tmf/dsmapi/troubleTicket/model/Note.java
@@ -2,7 +2,7 @@
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
-package tmf.org.dsmapi.tt;
+package org.tmf.dsmapi.troubleTicket.model;
import java.io.Serializable;
import javax.persistence.Embeddable;
@@ -22,26 +22,50 @@ public class Note implements Serializable {
private String author;
private String text;
+ /**
+ *
+ * @return
+ */
public String getDate() {
return date;
}
+ /**
+ *
+ * @param date
+ */
public void setDate(String date) {
this.date = date;
}
+ /**
+ *
+ * @return
+ */
public String getAuthor() {
return author;
}
+ /**
+ *
+ * @param author
+ */
public void setAuthor(String author) {
this.author = author;
}
+ /**
+ *
+ * @return
+ */
public String getText() {
return text;
}
+ /**
+ *
+ * @param text
+ */
public void setText(String text) {
this.text = text;
}
diff --git a/src/java/tmf/org/dsmapi/tt/RelatedObject.java b/src/main/java/org/tmf/dsmapi/troubleTicket/model/RelatedObject.java
similarity index 82%
rename from src/java/tmf/org/dsmapi/tt/RelatedObject.java
rename to src/main/java/org/tmf/dsmapi/troubleTicket/model/RelatedObject.java
index 0064553..120110c 100644
--- a/src/java/tmf/org/dsmapi/tt/RelatedObject.java
+++ b/src/main/java/org/tmf/dsmapi/troubleTicket/model/RelatedObject.java
@@ -2,7 +2,7 @@
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
-package tmf.org.dsmapi.tt;
+package org.tmf.dsmapi.troubleTicket.model;
import java.io.Serializable;
import javax.persistence.Embeddable;
@@ -29,18 +29,34 @@ public class RelatedObject implements Serializable {
private String reference;
private String involvement;
+ /**
+ *
+ * @return
+ */
public String getInvolvement() {
return involvement;
}
+ /**
+ *
+ * @param involvement
+ */
public void setInvolvement(String involvement) {
this.involvement = involvement;
}
+ /**
+ *
+ * @return
+ */
public String getReference() {
return reference;
}
+ /**
+ *
+ * @param reference
+ */
public void setReference(String reference) {
this.reference = reference;
}
diff --git a/src/java/tmf/org/dsmapi/tt/RelatedParty.java b/src/main/java/org/tmf/dsmapi/troubleTicket/model/RelatedParty.java
similarity index 83%
rename from src/java/tmf/org/dsmapi/tt/RelatedParty.java
rename to src/main/java/org/tmf/dsmapi/troubleTicket/model/RelatedParty.java
index 5583582..616f074 100644
--- a/src/java/tmf/org/dsmapi/tt/RelatedParty.java
+++ b/src/main/java/org/tmf/dsmapi/troubleTicket/model/RelatedParty.java
@@ -2,7 +2,7 @@
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
-package tmf.org.dsmapi.tt;
+package org.tmf.dsmapi.troubleTicket.model;
import java.io.Serializable;
import javax.persistence.Embeddable;
@@ -32,18 +32,34 @@ public class RelatedParty implements Serializable {
private String role;
private String reference;
+ /**
+ *
+ * @return
+ */
public String getRole() {
return role;
}
+ /**
+ *
+ * @param role
+ */
public void setRole(String role) {
this.role = role;
}
+ /**
+ *
+ * @return
+ */
public String getReference() {
return reference;
}
+ /**
+ *
+ * @param reference
+ */
public void setReference(String reference) {
this.reference = reference;
}
diff --git a/src/main/java/org/tmf/dsmapi/troubleTicket/model/Report.java b/src/main/java/org/tmf/dsmapi/troubleTicket/model/Report.java
new file mode 100644
index 0000000..c0d96f1
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/troubleTicket/model/Report.java
@@ -0,0 +1,70 @@
+package org.tmf.dsmapi.troubleTicket.model;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+@XmlRootElement
+@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+public class Report {
+
+ private String previousRows;
+ private String currentRows;
+ private String affectedRows;
+
+ /**
+ *
+ */
+ public Report () {
+ }
+
+ /**
+ *
+ * @param currentRows
+ */
+ public Report (int currentRows) {
+ this.currentRows=String.valueOf(currentRows);
+ }
+
+ /**
+ * @return the currentRows
+ */
+ public String getCurrentRows() {
+ return currentRows;
+ }
+
+ /**
+ * @param currentRows the currentRows to set
+ */
+ public void setCurrentRows(int currentRows) {
+ this.currentRows = String.valueOf(currentRows);
+ }
+
+ /**
+ * @return the previousRows
+ */
+ public String getPreviousRows() {
+ return previousRows;
+ }
+
+ /**
+ * @param previousRows the previousRows to set
+ */
+ public void setPreviousRows(int previousRows) {
+ this.previousRows = String.valueOf(previousRows);
+ }
+
+ /**
+ * @return the affectedRows
+ */
+ public String getAffectedRows() {
+ return affectedRows;
+ }
+
+ /**
+ * @param affectedRows the affectedRows to set
+ */
+ public void setAffectedRows(int affectedRows) {
+ this.affectedRows = String.valueOf(affectedRows);
+ }
+
+}
diff --git a/src/java/tmf/org/dsmapi/tt/Severity.java b/src/main/java/org/tmf/dsmapi/troubleTicket/model/Severity.java
similarity index 72%
rename from src/java/tmf/org/dsmapi/tt/Severity.java
rename to src/main/java/org/tmf/dsmapi/troubleTicket/model/Severity.java
index a1c41e5..bfa0271 100644
--- a/src/java/tmf/org/dsmapi/tt/Severity.java
+++ b/src/main/java/org/tmf/dsmapi/troubleTicket/model/Severity.java
@@ -2,7 +2,7 @@
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
-package tmf.org.dsmapi.tt;
+package org.tmf.dsmapi.troubleTicket.model;
/**
*
@@ -10,11 +10,28 @@
*/
public enum Severity {
+ /**
+ *
+ */
Low,
+ /**
+ *
+ */
Critical,
+ /**
+ *
+ */
Medium,
+ /**
+ *
+ */
High; //; is optional
+ /**
+ *
+ * @param text
+ * @return
+ */
public static Severity fromString(String text) {
if (text != null) {
for (Severity b : Severity.values()) {
diff --git a/src/java/tmf/org/dsmapi/tt/Status.java b/src/main/java/org/tmf/dsmapi/troubleTicket/model/Status.java
similarity index 65%
rename from src/java/tmf/org/dsmapi/tt/Status.java
rename to src/main/java/org/tmf/dsmapi/troubleTicket/model/Status.java
index 7b34e79..5974055 100644
--- a/src/java/tmf/org/dsmapi/tt/Status.java
+++ b/src/main/java/org/tmf/dsmapi/troubleTicket/model/Status.java
@@ -2,7 +2,7 @@
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
-package tmf.org.dsmapi.tt;
+package org.tmf.dsmapi.troubleTicket.model;
/**
*
@@ -10,15 +10,48 @@
*/
public enum Status {
+ /**
+ *
+ */
Submitted,
+ /**
+ *
+ */
Acknowledged,
+ /**
+ *
+ */
+ InProgress,
+ /**
+ *
+ */
InProgress_Held,
+ /**
+ *
+ */
InProgress_Pending,
+ /**
+ *
+ */
Resolved,
+ /**
+ *
+ */
Closed,
+ /**
+ *
+ */
Rejected,
+ /**
+ *
+ */
Cancelled; //; is optional
+ /**
+ *
+ * @param text
+ * @return
+ */
public static Status fromString(String text) {
if (text != null) {
for (Status b : Status.values()) {
diff --git a/src/java/tmf/org/dsmapi/tt/SubStatus.java b/src/main/java/org/tmf/dsmapi/troubleTicket/model/SubStatus.java
similarity index 55%
rename from src/java/tmf/org/dsmapi/tt/SubStatus.java
rename to src/main/java/org/tmf/dsmapi/troubleTicket/model/SubStatus.java
index 22feef1..b6b46e0 100644
--- a/src/java/tmf/org/dsmapi/tt/SubStatus.java
+++ b/src/main/java/org/tmf/dsmapi/troubleTicket/model/SubStatus.java
@@ -2,12 +2,19 @@
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
-package tmf.org.dsmapi.tt;
+package org.tmf.dsmapi.troubleTicket.model;
/**
*
* @author pierregauthier
*/
public enum SubStatus {
- Pending, Held; //; is optional
+ /**
+ *
+ */
+ Pending,
+ /**
+ *
+ */
+ Held; //; is optional
}
diff --git a/src/java/tmf/org/dsmapi/tt/TroubleTicket.java b/src/main/java/org/tmf/dsmapi/troubleTicket/model/TroubleTicket.java
similarity index 77%
rename from src/java/tmf/org/dsmapi/tt/TroubleTicket.java
rename to src/main/java/org/tmf/dsmapi/troubleTicket/model/TroubleTicket.java
index b63acd0..09d429a 100644
--- a/src/java/tmf/org/dsmapi/tt/TroubleTicket.java
+++ b/src/main/java/org/tmf/dsmapi/troubleTicket/model/TroubleTicket.java
@@ -2,11 +2,11 @@
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
-package tmf.org.dsmapi.tt;
+package org.tmf.dsmapi.troubleTicket.model;
import java.io.Serializable;
+import java.util.ArrayList;
import java.util.List;
-import java.util.Set;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
@@ -15,9 +15,7 @@
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
-import javax.persistence.Transient;
import javax.xml.bind.annotation.XmlRootElement;
-import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.annotate.JsonSerialize;
/**
@@ -45,24 +43,28 @@ public class TroubleTicket implements Serializable {
//Add other static strings as required....
private static final long serialVersionUID = 1L;
- // Used for incremental update
- @Transient
- @JsonIgnore
- private Set fieldsIN;
@Id
- @Column(name="TT_ID")
+ @Column(name = "TT_ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private String id;
+ /**
+ *
+ * @return
+ */
public String getId() {
return id;
}
+ /**
+ *
+ * @param id
+ */
public void setId(String id) {
this.id = id;
}
private String correlationId;
- private String description;
+ private String description;
private Severity severity;
private String type;
private String creationDate;
@@ -72,21 +74,18 @@ public void setId(String id) {
private String statusChangeReason;
private String statusChangeDate;
private String resolutionDate;
-
@ElementCollection
@CollectionTable(
name = "RELATED_OBJECT",
joinColumns =
@JoinColumn(name = "OWNER_ID"))
private List relatedObjects;
-
@ElementCollection
@CollectionTable(
name = "NOTES",
joinColumns =
@JoinColumn(name = "OWNER_ID"))
private List notes;
-
@ElementCollection
@CollectionTable(
name = "RELATED_PARTY",
@@ -94,117 +93,237 @@ public void setId(String id) {
@JoinColumn(name = "OWNER_ID"))
private List relatedParties;
+ /**
+ *
+ * @return
+ */
public String getCorrelationId() {
return correlationId;
}
+ /**
+ *
+ * @param correlationId
+ */
public void setCorrelationId(String correlationId) {
this.correlationId = correlationId;
}
+ /**
+ *
+ * @return
+ */
public String getDescription() {
return description;
}
+ /**
+ *
+ * @param description
+ */
public void setDescription(String description) {
this.description = description;
}
+ /**
+ *
+ * @return
+ */
public Severity getSeverity() {
return severity;
}
+ /**
+ *
+ * @param severity
+ */
public void setSeverity(Severity severity) {
this.severity = severity;
}
+ /**
+ *
+ * @return
+ */
public String getType() {
return type;
}
+ /**
+ *
+ * @param type
+ */
public void setType(String type) {
this.type = type;
}
+ /**
+ *
+ * @return
+ */
public String getCreationDate() {
return creationDate;
}
+ /**
+ *
+ * @param creationDate
+ */
public void setCreationDate(String creationDate) {
this.creationDate = creationDate;
}
+ /**
+ *
+ * @return
+ */
public String getTargetResolutionDate() {
return targetResolutionDate;
}
+ /**
+ *
+ * @param targetResolutionDate
+ */
public void setTargetResolutionDate(String targetResolutionDate) {
this.targetResolutionDate = targetResolutionDate;
}
+ /**
+ *
+ * @return
+ */
public Status getStatus() {
return status;
}
+ /**
+ *
+ * @param status
+ */
public void setStatus(Status status) {
this.status = status;
}
+ /**
+ *
+ * @return
+ */
public SubStatus getSubStatus() {
return subStatus;
}
+ /**
+ *
+ * @param subStatus
+ */
public void setSubStatus(SubStatus subStatus) {
this.subStatus = subStatus;
}
+ /**
+ *
+ * @return
+ */
public String getStatusChangeReason() {
return statusChangeReason;
}
+ /**
+ *
+ * @param statusChangeReason
+ */
public void setStatusChangeReason(String statusChangeReason) {
this.statusChangeReason = statusChangeReason;
}
+ /**
+ *
+ * @return
+ */
public String getStatusChangeDate() {
return statusChangeDate;
}
+ /**
+ *
+ * @param statusChangeDate
+ */
public void setStatusChangeDate(String statusChangeDate) {
this.statusChangeDate = statusChangeDate;
}
+ /**
+ *
+ * @return
+ */
public String getResolutionDate() {
return resolutionDate;
}
+ /**
+ *
+ * @param resolutionDate
+ */
public void setResolutionDate(String resolutionDate) {
this.resolutionDate = resolutionDate;
}
+ /**
+ *
+ * @return
+ */
public List getRelatedObjects() {
- if (relatedObjects.isEmpty()) return null;
- else return relatedObjects;
+ if (relatedObjects == null || relatedObjects.isEmpty()) {
+ return null;
+ } else {
+ return relatedObjects;
+ }
}
+ /**
+ *
+ * @param relatedObjects
+ */
public void setRelatedObjects(List relatedObjects) {
this.relatedObjects = relatedObjects;
}
+ /**
+ *
+ * @return
+ */
public List getNotes() {
- if (notes.isEmpty()) return null;
- else return notes;
+ if (notes == null) {
+ notes = new ArrayList();
+ }
+ return notes;
}
+ /**
+ *
+ * @param notes
+ */
public void setNotes(List notes) {
this.notes = notes;
}
+ /**
+ *
+ * @return
+ */
public List getRelatedParties() {
- if (relatedParties.isEmpty()) return null;
- else return relatedParties;
+ if (relatedParties == null || relatedParties.isEmpty()) {
+ return null;
+ } else {
+ return relatedParties;
+ }
}
+ /**
+ *
+ * @param relatedParties
+ */
public void setRelatedParties(List relatedParties) {
this.relatedParties = relatedParties;
}
@@ -235,17 +354,4 @@ public String toString() {
return "tmf.org.dsmtt.TroubleTicket[ id=" + id + " ]";
}
- /**
- * @return the fieldsIN
- */
- public Set getFieldsIN() {
- return fieldsIN;
- }
-
- /**
- * @param fieldsIN the fieldsIN to set
- */
- public void setFieldsIN(Set fields) {
- this.fieldsIN = fields;
- }
}
diff --git a/src/java/tmf/org/dsmapi/tt/TroubleTicketField.java b/src/main/java/org/tmf/dsmapi/troubleTicket/model/TroubleTicketField.java
similarity index 75%
rename from src/java/tmf/org/dsmapi/tt/TroubleTicketField.java
rename to src/main/java/org/tmf/dsmapi/troubleTicket/model/TroubleTicketField.java
index a7592e8..f9ae95b 100644
--- a/src/java/tmf/org/dsmapi/tt/TroubleTicketField.java
+++ b/src/main/java/org/tmf/dsmapi/troubleTicket/model/TroubleTicketField.java
@@ -1,25 +1,77 @@
-package tmf.org.dsmapi.tt;
+package org.tmf.dsmapi.troubleTicket.model;
import java.util.HashSet;
import java.util.Set;
+/**
+ *
+ * @author maig7313
+ */
public enum TroubleTicketField {
+ /**
+ *
+ */
ALL("all"),
+ /**
+ *
+ */
ID("id"),
+ /**
+ *
+ */
CORRELATION_ID("correlationId"),
+ /**
+ *
+ */
CREATION_DATE("creationDate"),
+ /**
+ *
+ */
DESCRIPTION("description"),
+ /**
+ *
+ */
NOTES("notes"),
+ /**
+ *
+ */
RELATED_OBJECTS("relatedObjects"),
+ /**
+ *
+ */
RELATED_PARTIES("relatedParties"),
+ /**
+ *
+ */
RESOLUTION_DATE("resolutionDate"),
+ /**
+ *
+ */
SEVERITY("severity"),
+ /**
+ *
+ */
STATUS("status"),
+ /**
+ *
+ */
STATUS_CHANGE_DATE("statusChangeDate"),
+ /**
+ *
+ */
STATUS_CHANGE_REASON("statusChangeReason"),
+ /**
+ *
+ */
SUB_STATUS("subStatus"),
+ /**
+ *
+ */
TARGET_RESOLUTION_DATE("targetResolutionDate"),
+ /**
+ *
+ */
TYPE("type");
private String text;
@@ -27,10 +79,19 @@ public enum TroubleTicketField {
this.text = text;
}
+ /**
+ *
+ * @return
+ */
public String getText() {
return this.text;
}
+ /**
+ *
+ * @param text
+ * @return
+ */
public static TroubleTicketField fromString(String text) {
if (text != null) {
for (TroubleTicketField b : TroubleTicketField.values()) {
@@ -42,6 +103,11 @@ public static TroubleTicketField fromString(String text) {
return null;
}
+ /**
+ *
+ * @param fields
+ * @return
+ */
public static Set fromStringToSet(String fields) {
// Convert fields parameter to a set of TroubleTicketField
Set fieldsSet = new HashSet();
diff --git a/src/main/java/org/tmf/dsmapi/troubleTicket/service/TroubleTicketFacade.java b/src/main/java/org/tmf/dsmapi/troubleTicket/service/TroubleTicketFacade.java
new file mode 100644
index 0000000..c83cf82
--- /dev/null
+++ b/src/main/java/org/tmf/dsmapi/troubleTicket/service/TroubleTicketFacade.java
@@ -0,0 +1,219 @@
+package org.tmf.dsmapi.troubleTicket.service;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.ws.rs.core.MultivaluedMap;
+import org.tmf.dsmapi.commons.exceptions.BadUsageException;
+import org.tmf.dsmapi.commons.exceptions.ExceptionType;
+import org.tmf.dsmapi.commons.exceptions.UnknownResourceException;
+import org.tmf.dsmapi.commons.facade.AbstractFacade;
+import org.tmf.dsmapi.commons.utils.TMFDate;
+import org.tmf.dsmapi.hub.service.EventPublisherLocal;
+import org.tmf.dsmapi.troubleTicket.model.Status;
+import org.tmf.dsmapi.troubleTicket.model.TroubleTicket;
+import org.tmf.dsmapi.troubleTicket.model.TroubleTicketField;
+import static org.tmf.dsmapi.troubleTicket.model.TroubleTicketField.STATUS;
+import static org.tmf.dsmapi.troubleTicket.model.TroubleTicketField.STATUS_CHANGE_REASON;
+
+/**
+ *
+ * @author maig7313
+ *
+ */
+@Stateless
+public class TroubleTicketFacade extends AbstractFacade {
+
+ @PersistenceContext(unitName = "DSTroubleTicketPU")
+ private EntityManager em;
+ private static long delay = 3000;
+
+ @EJB
+ EventPublisherLocal publisher;
+
+ /**
+ *
+ */
+ public TroubleTicketFacade() {
+ super(TroubleTicket.class);
+ }
+
+ /**
+ *
+ * @param tt
+ * @return
+ * @throws UnknownResourceException
+ */
+ @Override
+ public TroubleTicket edit(TroubleTicket tt) throws UnknownResourceException {
+ TroubleTicket targetEntity = this.find(tt.getId());
+ if (targetEntity == null) {
+ throw new UnknownResourceException(ExceptionType.UNKNOWN_RESOURCE);
+ }
+ tt = super.edit(tt);
+ return tt;
+ }
+
+ /**
+ *
+ * @param patchTT
+ * @param fields
+ * @return
+ * @throws BadUsageException
+ * @throws UnknownResourceException
+ */
+ public TroubleTicket updateAttributes(TroubleTicket patchTT, Set fields) throws BadUsageException, UnknownResourceException {
+
+ TroubleTicket currentTT = this.find(patchTT.getId());
+
+ if (currentTT == null) {
+ throw new UnknownResourceException(ExceptionType.UNKNOWN_RESOURCE);
+ }
+
+ if (fields.contains(STATUS) & !(fields.contains(STATUS_CHANGE_REASON))) {
+ throw new BadUsageException(ExceptionType.BAD_USAGE_MANDATORY_FIELDS, "While updating 'status', please provide a 'statusChangeReason'");
+ }
+
+ // Allow status update when there is no correlationId, for demo or admin purpose
+ if (fields.contains(STATUS) && (patchTT.getCorrelationId() == null)) {
+ // isValidTransition if this transition is allowed
+ currentTT.setStatus(patchTT.getStatus());
+ currentTT.setStatusChangeDate(TMFDate.toString(new Date()));
+ currentTT.setStatusChangeReason(patchTT.getStatusChangeReason());
+ // notify Status change
+ publisher.changedNotification(currentTT, null, new Date());
+ }
+
+ for (TroubleTicketField token : fields) {
+ switch (token) {
+ case CREATION_DATE:
+ currentTT.setCreationDate(patchTT.getCreationDate());
+ break;
+ case DESCRIPTION:
+ if (patchTT.getDescription() != null) {
+ currentTT.setDescription(patchTT.getDescription());
+ }
+ break;
+ case NOTES:
+ currentTT.setNotes(patchTT.getNotes()); // Replace Notes
+ break;
+ case RELATED_OBJECTS:
+ currentTT.setRelatedObjects(patchTT.getRelatedObjects());
+ break;
+ case RELATED_PARTIES:
+ currentTT.setRelatedParties(patchTT.getRelatedParties());
+ break;
+ case RESOLUTION_DATE:
+ currentTT.setResolutionDate(patchTT.getResolutionDate());
+ break;
+ case SEVERITY:
+ if (patchTT.getSeverity() != null) {
+ currentTT.setSeverity(patchTT.getSeverity());
+ }
+ break;
+ case TARGET_RESOLUTION_DATE:
+ currentTT.setResolutionDate(patchTT.getResolutionDate());
+ break;
+ case TYPE:
+ if (patchTT.getType() != null) {
+ currentTT.setType(patchTT.getType());
+ }
+ break;
+ }
+ }
+ em.merge(currentTT);
+
+ // Event tt changed
+ publisher.changedNotification(currentTT, null, new Date());
+ return currentTT;
+ }
+
+ /**
+ *
+ * @param troubleTicket
+ * @param status
+ * @param reason
+ * @return
+ */
+ public TroubleTicket updateStatus(TroubleTicket troubleTicket, Status status, String reason) {
+ troubleTicket.setStatus(status);
+ troubleTicket.setStatusChangeDate(TMFDate.toString(new Date()));
+ troubleTicket.setStatusChangeReason(reason);
+ em.merge(troubleTicket);
+ return troubleTicket;
+ }
+
+ /**
+ *
+ * @param tt
+ * @throws BadUsageException
+ */
+ @Override
+ public void create(TroubleTicket tt) throws BadUsageException {
+
+ if (tt.getId() != null) {
+ throw new BadUsageException(ExceptionType.BAD_USAGE_GENERIC, "While creating a TT id should be null");
+ }
+
+ if ((tt.getDescription() == null) || (tt.getSeverity() == null) || (tt.getType() == null)) {
+ String fieldName = null;
+ if (tt.getDescription() == null) {
+ fieldName = TroubleTicketField.DESCRIPTION.getText();
+ } else {
+ if (tt.getSeverity() == null) {
+ fieldName = TroubleTicketField.SEVERITY.getText();
+ } else if (tt.getType() == null) {
+ fieldName = TroubleTicketField.TYPE.getText();
+ }
+ }
+ throw new BadUsageException(ExceptionType.BAD_USAGE_MANDATORY_FIELDS, fieldName);
+ }
+
+ super.create(tt);
+
+ }
+
+ /**
+ *
+ * @return
+ */
+ @Override
+ protected EntityManager getEntityManager() {
+ return em;
+ }
+
+ /**
+ *
+ * @param queryParameters
+ * @return
+ */
+ public List find(MultivaluedMap