YARN-2804. Fixed Timeline service to not fill the logs with JAXB bindings exceptions. Contributed by Zhijie Shen.
This commit is contained in:
parent
d794f785de
commit
b76179895d
@ -859,6 +859,9 @@ Release 2.6.0 - UNRELEASED
|
|||||||
YARN-2010. Handle app-recovery failures gracefully.
|
YARN-2010. Handle app-recovery failures gracefully.
|
||||||
(Jian He and Karthik Kambatla via kasha)
|
(Jian He and Karthik Kambatla via kasha)
|
||||||
|
|
||||||
|
YARN-2804. Fixed Timeline service to not fill the logs with JAXB bindings
|
||||||
|
exceptions. (Zhijie Shen via vinodkv)
|
||||||
|
|
||||||
Release 2.5.2 - UNRELEASED
|
Release 2.5.2 - UNRELEASED
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
import javax.xml.bind.annotation.XmlElement;
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
import javax.xml.bind.annotation.XmlRootElement;
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
|
||||||
|
import org.apache.hadoop.classification.InterfaceAudience.Private;
|
||||||
import org.apache.hadoop.classification.InterfaceAudience.Public;
|
import org.apache.hadoop.classification.InterfaceAudience.Public;
|
||||||
import org.apache.hadoop.classification.InterfaceStability.Unstable;
|
import org.apache.hadoop.classification.InterfaceStability.Unstable;
|
||||||
|
|
||||||
@ -58,11 +59,11 @@ public class TimelineEntity implements Comparable<TimelineEntity> {
|
|||||||
private String entityId;
|
private String entityId;
|
||||||
private Long startTime;
|
private Long startTime;
|
||||||
private List<TimelineEvent> events = new ArrayList<TimelineEvent>();
|
private List<TimelineEvent> events = new ArrayList<TimelineEvent>();
|
||||||
private Map<String, Set<String>> relatedEntities =
|
private HashMap<String, Set<String>> relatedEntities =
|
||||||
new HashMap<String, Set<String>>();
|
new HashMap<String, Set<String>>();
|
||||||
private Map<String, Set<Object>> primaryFilters =
|
private HashMap<String, Set<Object>> primaryFilters =
|
||||||
new HashMap<String, Set<Object>>();
|
new HashMap<String, Set<Object>>();
|
||||||
private Map<String, Object> otherInfo =
|
private HashMap<String, Object> otherInfo =
|
||||||
new HashMap<String, Object>();
|
new HashMap<String, Object>();
|
||||||
private String domainId;
|
private String domainId;
|
||||||
|
|
||||||
@ -175,11 +176,17 @@ public void setEvents(List<TimelineEvent> events) {
|
|||||||
*
|
*
|
||||||
* @return the related entities
|
* @return the related entities
|
||||||
*/
|
*/
|
||||||
@XmlElement(name = "relatedentities")
|
|
||||||
public Map<String, Set<String>> getRelatedEntities() {
|
public Map<String, Set<String>> getRelatedEntities() {
|
||||||
return relatedEntities;
|
return relatedEntities;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Required by JAXB
|
||||||
|
@Private
|
||||||
|
@XmlElement(name = "relatedentities")
|
||||||
|
public HashMap<String, Set<String>> getRelatedEntitiesJAXB() {
|
||||||
|
return relatedEntities;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add an entity to the existing related entity map
|
* Add an entity to the existing related entity map
|
||||||
*
|
*
|
||||||
@ -224,7 +231,11 @@ public void addRelatedEntities(Map<String, Set<String>> relatedEntities) {
|
|||||||
*/
|
*/
|
||||||
public void setRelatedEntities(
|
public void setRelatedEntities(
|
||||||
Map<String, Set<String>> relatedEntities) {
|
Map<String, Set<String>> relatedEntities) {
|
||||||
this.relatedEntities = relatedEntities;
|
if (relatedEntities != null && !(relatedEntities instanceof HashMap)) {
|
||||||
|
this.relatedEntities = new HashMap<String, Set<String>>(relatedEntities);
|
||||||
|
} else {
|
||||||
|
this.relatedEntities = (HashMap<String, Set<String>>) relatedEntities;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -232,11 +243,17 @@ public void setRelatedEntities(
|
|||||||
*
|
*
|
||||||
* @return the primary filters
|
* @return the primary filters
|
||||||
*/
|
*/
|
||||||
@XmlElement(name = "primaryfilters")
|
|
||||||
public Map<String, Set<Object>> getPrimaryFilters() {
|
public Map<String, Set<Object>> getPrimaryFilters() {
|
||||||
return primaryFilters;
|
return primaryFilters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Required by JAXB
|
||||||
|
@Private
|
||||||
|
@XmlElement(name = "primaryfilters")
|
||||||
|
public HashMap<String, Set<Object>> getPrimaryFiltersJAXB() {
|
||||||
|
return primaryFilters;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a single piece of primary filter to the existing primary filter map
|
* Add a single piece of primary filter to the existing primary filter map
|
||||||
*
|
*
|
||||||
@ -280,7 +297,11 @@ public void addPrimaryFilters(Map<String, Set<Object>> primaryFilters) {
|
|||||||
* a map of primary filters
|
* a map of primary filters
|
||||||
*/
|
*/
|
||||||
public void setPrimaryFilters(Map<String, Set<Object>> primaryFilters) {
|
public void setPrimaryFilters(Map<String, Set<Object>> primaryFilters) {
|
||||||
this.primaryFilters = primaryFilters;
|
if (primaryFilters != null && !(primaryFilters instanceof HashMap)) {
|
||||||
|
this.primaryFilters = new HashMap<String, Set<Object>>(primaryFilters);
|
||||||
|
} else {
|
||||||
|
this.primaryFilters = (HashMap<String, Set<Object>>) primaryFilters;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -288,11 +309,17 @@ public void setPrimaryFilters(Map<String, Set<Object>> primaryFilters) {
|
|||||||
*
|
*
|
||||||
* @return the other information of the entity
|
* @return the other information of the entity
|
||||||
*/
|
*/
|
||||||
@XmlElement(name = "otherinfo")
|
|
||||||
public Map<String, Object> getOtherInfo() {
|
public Map<String, Object> getOtherInfo() {
|
||||||
return otherInfo;
|
return otherInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Required by JAXB
|
||||||
|
@Private
|
||||||
|
@XmlElement(name = "otherinfo")
|
||||||
|
public HashMap<String, Object> getOtherInfoJAXB() {
|
||||||
|
return otherInfo;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add one piece of other information of the entity to the existing other info
|
* Add one piece of other information of the entity to the existing other info
|
||||||
* map
|
* map
|
||||||
@ -323,7 +350,11 @@ public void addOtherInfo(Map<String, Object> otherInfo) {
|
|||||||
* a map of other information
|
* a map of other information
|
||||||
*/
|
*/
|
||||||
public void setOtherInfo(Map<String, Object> otherInfo) {
|
public void setOtherInfo(Map<String, Object> otherInfo) {
|
||||||
this.otherInfo = otherInfo;
|
if (otherInfo != null && !(otherInfo instanceof HashMap)) {
|
||||||
|
this.otherInfo = new HashMap<String, Object>(otherInfo);
|
||||||
|
} else {
|
||||||
|
this.otherInfo = (HashMap<String, Object>) otherInfo;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
import javax.xml.bind.annotation.XmlElement;
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
import javax.xml.bind.annotation.XmlRootElement;
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
|
||||||
|
import org.apache.hadoop.classification.InterfaceAudience.Private;
|
||||||
import org.apache.hadoop.classification.InterfaceAudience.Public;
|
import org.apache.hadoop.classification.InterfaceAudience.Public;
|
||||||
import org.apache.hadoop.classification.InterfaceStability.Unstable;
|
import org.apache.hadoop.classification.InterfaceStability.Unstable;
|
||||||
|
|
||||||
@ -43,7 +44,7 @@ public class TimelineEvent implements Comparable<TimelineEvent> {
|
|||||||
|
|
||||||
private long timestamp;
|
private long timestamp;
|
||||||
private String eventType;
|
private String eventType;
|
||||||
private Map<String, Object> eventInfo = new HashMap<String, Object>();
|
private HashMap<String, Object> eventInfo = new HashMap<String, Object>();
|
||||||
|
|
||||||
public TimelineEvent() {
|
public TimelineEvent() {
|
||||||
}
|
}
|
||||||
@ -93,11 +94,17 @@ public void setEventType(String eventType) {
|
|||||||
*
|
*
|
||||||
* @return the information of the event
|
* @return the information of the event
|
||||||
*/
|
*/
|
||||||
@XmlElement(name = "eventinfo")
|
|
||||||
public Map<String, Object> getEventInfo() {
|
public Map<String, Object> getEventInfo() {
|
||||||
return eventInfo;
|
return eventInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Required by JAXB
|
||||||
|
@Private
|
||||||
|
@XmlElement(name = "eventinfo")
|
||||||
|
public HashMap<String, Object> getEventInfoJAXB() {
|
||||||
|
return eventInfo;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add one piece of the information of the event to the existing information
|
* Add one piece of the information of the event to the existing information
|
||||||
* map
|
* map
|
||||||
@ -128,7 +135,11 @@ public void addEventInfo(Map<String, Object> eventInfo) {
|
|||||||
* a map of of the information of the event
|
* a map of of the information of the event
|
||||||
*/
|
*/
|
||||||
public void setEventInfo(Map<String, Object> eventInfo) {
|
public void setEventInfo(Map<String, Object> eventInfo) {
|
||||||
this.eventInfo = eventInfo;
|
if (eventInfo != null && !(eventInfo instanceof HashMap)) {
|
||||||
|
this.eventInfo = new HashMap<String, Object>(eventInfo);
|
||||||
|
} else {
|
||||||
|
this.eventInfo = (HashMap<String, Object>) eventInfo;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -19,19 +19,19 @@
|
|||||||
package org.apache.hadoop.yarn.api.records.timeline;
|
package org.apache.hadoop.yarn.api.records.timeline;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import org.junit.Assert;
|
import java.util.Set;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
import java.util.WeakHashMap;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.apache.hadoop.yarn.api.records.timeline.TimelineEntities;
|
|
||||||
import org.apache.hadoop.yarn.api.records.timeline.TimelineEntity;
|
|
||||||
import org.apache.hadoop.yarn.api.records.timeline.TimelineEvent;
|
|
||||||
import org.apache.hadoop.yarn.api.records.timeline.TimelineEvents;
|
|
||||||
import org.apache.hadoop.yarn.api.records.timeline.TimelinePutResponse;
|
|
||||||
import org.apache.hadoop.yarn.api.records.timeline.TimelinePutResponse.TimelinePutError;
|
import org.apache.hadoop.yarn.api.records.timeline.TimelinePutResponse.TimelinePutError;
|
||||||
import org.apache.hadoop.yarn.util.timeline.TimelineUtils;
|
import org.apache.hadoop.yarn.util.timeline.TimelineUtils;
|
||||||
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
public class TestTimelineRecords {
|
public class TestTimelineRecords {
|
||||||
@ -202,4 +202,118 @@ public void testTimelineDomain() throws Exception {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMapInterfaceOrTimelineRecords() throws Exception {
|
||||||
|
TimelineEntity entity = new TimelineEntity();
|
||||||
|
List<Map<String, Set<Object>>> primaryFiltersList =
|
||||||
|
new ArrayList<Map<String, Set<Object>>>();
|
||||||
|
primaryFiltersList.add(
|
||||||
|
Collections.singletonMap("pkey", Collections.singleton((Object) "pval")));
|
||||||
|
Map<String, Set<Object>> primaryFilters = new TreeMap<String, Set<Object>>();
|
||||||
|
primaryFilters.put("pkey1", Collections.singleton((Object) "pval1"));
|
||||||
|
primaryFilters.put("pkey2", Collections.singleton((Object) "pval2"));
|
||||||
|
primaryFiltersList.add(primaryFilters);
|
||||||
|
entity.setPrimaryFilters(null);
|
||||||
|
for (Map<String, Set<Object>> primaryFiltersToSet : primaryFiltersList) {
|
||||||
|
entity.setPrimaryFilters(primaryFiltersToSet);
|
||||||
|
assertPrimaryFilters(entity);
|
||||||
|
|
||||||
|
Map<String, Set<Object>> primaryFiltersToAdd =
|
||||||
|
new WeakHashMap<String, Set<Object>>();
|
||||||
|
primaryFiltersToAdd.put("pkey3", Collections.singleton((Object) "pval3"));
|
||||||
|
entity.addPrimaryFilters(primaryFiltersToAdd);
|
||||||
|
assertPrimaryFilters(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Map<String, Set<String>>> relatedEntitiesList =
|
||||||
|
new ArrayList<Map<String, Set<String>>>();
|
||||||
|
relatedEntitiesList.add(
|
||||||
|
Collections.singletonMap("rkey", Collections.singleton("rval")));
|
||||||
|
Map<String, Set<String>> relatedEntities = new TreeMap<String, Set<String>>();
|
||||||
|
relatedEntities.put("rkey1", Collections.singleton("rval1"));
|
||||||
|
relatedEntities.put("rkey2", Collections.singleton("rval2"));
|
||||||
|
relatedEntitiesList.add(relatedEntities);
|
||||||
|
entity.setRelatedEntities(null);
|
||||||
|
for (Map<String, Set<String>> relatedEntitiesToSet : relatedEntitiesList) {
|
||||||
|
entity.setRelatedEntities(relatedEntitiesToSet);
|
||||||
|
assertRelatedEntities(entity);
|
||||||
|
|
||||||
|
Map<String, Set<String>> relatedEntitiesToAdd =
|
||||||
|
new WeakHashMap<String, Set<String>>();
|
||||||
|
relatedEntitiesToAdd.put("rkey3", Collections.singleton("rval3"));
|
||||||
|
entity.addRelatedEntities(relatedEntitiesToAdd);
|
||||||
|
assertRelatedEntities(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Map<String, Object>> otherInfoList =
|
||||||
|
new ArrayList<Map<String, Object>>();
|
||||||
|
otherInfoList.add(Collections.singletonMap("okey", (Object) "oval"));
|
||||||
|
Map<String, Object> otherInfo = new TreeMap<String, Object>();
|
||||||
|
otherInfo.put("okey1", "oval1");
|
||||||
|
otherInfo.put("okey2", "oval2");
|
||||||
|
otherInfoList.add(otherInfo);
|
||||||
|
entity.setOtherInfo(null);
|
||||||
|
for (Map<String, Object> otherInfoToSet : otherInfoList) {
|
||||||
|
entity.setOtherInfo(otherInfoToSet);
|
||||||
|
assertOtherInfo(entity);
|
||||||
|
|
||||||
|
Map<String, Object> otherInfoToAdd = new WeakHashMap<String, Object>();
|
||||||
|
otherInfoToAdd.put("okey3", "oval3");
|
||||||
|
entity.addOtherInfo(otherInfoToAdd);
|
||||||
|
assertOtherInfo(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
TimelineEvent event = new TimelineEvent();
|
||||||
|
List<Map<String, Object>> eventInfoList =
|
||||||
|
new ArrayList<Map<String, Object>>();
|
||||||
|
eventInfoList.add(Collections.singletonMap("ekey", (Object) "eval"));
|
||||||
|
Map<String, Object> eventInfo = new TreeMap<String, Object>();
|
||||||
|
eventInfo.put("ekey1", "eval1");
|
||||||
|
eventInfo.put("ekey2", "eval2");
|
||||||
|
eventInfoList.add(eventInfo);
|
||||||
|
event.setEventInfo(null);
|
||||||
|
for (Map<String, Object> eventInfoToSet : eventInfoList) {
|
||||||
|
event.setEventInfo(eventInfoToSet);
|
||||||
|
assertEventInfo(event);
|
||||||
|
|
||||||
|
Map<String, Object> eventInfoToAdd = new WeakHashMap<String, Object>();
|
||||||
|
eventInfoToAdd.put("ekey3", "eval3");
|
||||||
|
event.addEventInfo(eventInfoToAdd);
|
||||||
|
assertEventInfo(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void assertPrimaryFilters(TimelineEntity entity) {
|
||||||
|
Assert.assertNotNull(entity.getPrimaryFilters());
|
||||||
|
Assert.assertNotNull(entity.getPrimaryFiltersJAXB());
|
||||||
|
Assert.assertTrue(entity.getPrimaryFilters() instanceof HashMap);
|
||||||
|
Assert.assertTrue(entity.getPrimaryFiltersJAXB() instanceof HashMap);
|
||||||
|
Assert.assertEquals(
|
||||||
|
entity.getPrimaryFilters(), entity.getPrimaryFiltersJAXB());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void assertRelatedEntities(TimelineEntity entity) {
|
||||||
|
Assert.assertNotNull(entity.getRelatedEntities());
|
||||||
|
Assert.assertNotNull(entity.getRelatedEntitiesJAXB());
|
||||||
|
Assert.assertTrue(entity.getRelatedEntities() instanceof HashMap);
|
||||||
|
Assert.assertTrue(entity.getRelatedEntitiesJAXB() instanceof HashMap);
|
||||||
|
Assert.assertEquals(
|
||||||
|
entity.getRelatedEntities(), entity.getRelatedEntitiesJAXB());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void assertOtherInfo(TimelineEntity entity) {
|
||||||
|
Assert.assertNotNull(entity.getOtherInfo());
|
||||||
|
Assert.assertNotNull(entity.getOtherInfoJAXB());
|
||||||
|
Assert.assertTrue(entity.getOtherInfo() instanceof HashMap);
|
||||||
|
Assert.assertTrue(entity.getOtherInfoJAXB() instanceof HashMap);
|
||||||
|
Assert.assertEquals(entity.getOtherInfo(), entity.getOtherInfoJAXB());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void assertEventInfo(TimelineEvent event) {
|
||||||
|
Assert.assertNotNull(event);
|
||||||
|
Assert.assertNotNull(event.getEventInfoJAXB());
|
||||||
|
Assert.assertTrue(event.getEventInfo() instanceof HashMap);
|
||||||
|
Assert.assertTrue(event.getEventInfoJAXB() instanceof HashMap);
|
||||||
|
Assert.assertEquals(event.getEventInfo(), event.getEventInfoJAXB());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,6 @@
|
|||||||
import javax.ws.rs.core.Context;
|
import javax.ws.rs.core.Context;
|
||||||
import javax.ws.rs.core.MediaType;
|
import javax.ws.rs.core.MediaType;
|
||||||
import javax.ws.rs.core.Response;
|
import javax.ws.rs.core.Response;
|
||||||
import javax.ws.rs.core.Response.Status;
|
|
||||||
import javax.xml.bind.annotation.XmlAccessType;
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
import javax.xml.bind.annotation.XmlAccessorType;
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
import javax.xml.bind.annotation.XmlElement;
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
@ -53,11 +52,11 @@
|
|||||||
import org.apache.hadoop.classification.InterfaceAudience.Public;
|
import org.apache.hadoop.classification.InterfaceAudience.Public;
|
||||||
import org.apache.hadoop.classification.InterfaceStability.Unstable;
|
import org.apache.hadoop.classification.InterfaceStability.Unstable;
|
||||||
import org.apache.hadoop.security.UserGroupInformation;
|
import org.apache.hadoop.security.UserGroupInformation;
|
||||||
|
import org.apache.hadoop.yarn.api.records.timeline.TimelineDomain;
|
||||||
|
import org.apache.hadoop.yarn.api.records.timeline.TimelineDomains;
|
||||||
import org.apache.hadoop.yarn.api.records.timeline.TimelineEntities;
|
import org.apache.hadoop.yarn.api.records.timeline.TimelineEntities;
|
||||||
import org.apache.hadoop.yarn.api.records.timeline.TimelineEntity;
|
import org.apache.hadoop.yarn.api.records.timeline.TimelineEntity;
|
||||||
import org.apache.hadoop.yarn.api.records.timeline.TimelineEvents;
|
import org.apache.hadoop.yarn.api.records.timeline.TimelineEvents;
|
||||||
import org.apache.hadoop.yarn.api.records.timeline.TimelineDomain;
|
|
||||||
import org.apache.hadoop.yarn.api.records.timeline.TimelineDomains;
|
|
||||||
import org.apache.hadoop.yarn.api.records.timeline.TimelinePutResponse;
|
import org.apache.hadoop.yarn.api.records.timeline.TimelinePutResponse;
|
||||||
import org.apache.hadoop.yarn.exceptions.YarnException;
|
import org.apache.hadoop.yarn.exceptions.YarnException;
|
||||||
import org.apache.hadoop.yarn.server.timeline.EntityIdentifier;
|
import org.apache.hadoop.yarn.server.timeline.EntityIdentifier;
|
||||||
@ -272,7 +271,7 @@ public TimelinePutResponse postEntities(
|
|||||||
@PUT
|
@PUT
|
||||||
@Path("/domain")
|
@Path("/domain")
|
||||||
@Consumes({ MediaType.APPLICATION_JSON /* , MediaType.APPLICATION_XML */})
|
@Consumes({ MediaType.APPLICATION_JSON /* , MediaType.APPLICATION_XML */})
|
||||||
public Response putDomain(
|
public TimelinePutResponse putDomain(
|
||||||
@Context HttpServletRequest req,
|
@Context HttpServletRequest req,
|
||||||
@Context HttpServletResponse res,
|
@Context HttpServletResponse res,
|
||||||
TimelineDomain domain) {
|
TimelineDomain domain) {
|
||||||
@ -295,7 +294,7 @@ public Response putDomain(
|
|||||||
throw new WebApplicationException(e,
|
throw new WebApplicationException(e,
|
||||||
Response.Status.INTERNAL_SERVER_ERROR);
|
Response.Status.INTERNAL_SERVER_ERROR);
|
||||||
}
|
}
|
||||||
return Response.status(Status.OK).build();
|
return new TimelinePutResponse();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user