Commit d661964c by Suma Shivaprasad

ATLAS-858 Unable to delete terms via API which are 3 or more levels deep(jspeidel via sumasai)

parent 9e23fdc1
......@@ -22,6 +22,7 @@ ATLAS-409 Atlas will not import avro tables with schema read from a file (dosset
ATLAS-379 Create sqoop and falcon metadata addons (venkatnrangan,bvellanki,sowmyaramesh via shwethags)
ALL CHANGES:
ATLAS-858 Unable to delete terms via API which are 3 or more levels deep (jspeidel via sumasai)
ATLAS-848 Atlas UI: Search term box in left navigation is not auto refresh.(Kalyanikashikar via sumasai)
ATLAS-793 Business Catalog Delete (jspeidel via yhemanth)
ATLAS-846 Atlas UI : Add Pagination to Tags and Terms tabs of asset detailes page (kevalbhatt18 via yhemanth)
......
......@@ -297,6 +297,12 @@
<artifactId>atlas-dashboardv2</artifactId>
<type>war</type>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>3.4</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
......
......@@ -40,6 +40,7 @@ import java.util.Map;
public abstract class BaseService {
private static final Gson gson = new Gson();
private final Logger LOG = LoggerFactory.getLogger(getClass());
private final static JsonSerializer serializer = new JsonSerializer();
protected Result getResource(ResourceProvider provider, Request request)
throws ResourceNotFoundException {
......@@ -118,16 +119,20 @@ public abstract class BaseService {
}
}
private RuntimeException wrapRuntimeException(RuntimeException e) {
return e instanceof CatalogRuntimeException ? e : new CatalogRuntimeException(e);
protected JsonSerializer getSerializer() {
return serializer;
}
//todo: abstract via AtlasTypeSystem
// ensure that the thread wasn't re-pooled with an existing transaction
private void initializeGraphTransaction() {
protected void initializeGraphTransaction() {
TitanGraphProvider.getGraphInstance().rollback();
}
private RuntimeException wrapRuntimeException(RuntimeException e) {
return e instanceof CatalogRuntimeException ? e : new CatalogRuntimeException(e);
}
@XmlRootElement
// the name of this class is used as the collection name in the returned json when returning a collection
public static class Results {
......
......@@ -38,7 +38,6 @@ public class EntityService extends BaseService {
private final EntityResourceProvider entityResourceProvider;
private final EntityTagResourceProvider entityTagResourceProvider;
private static JsonSerializer m_serializer = new JsonSerializer();
@Inject
public EntityService(MetadataService metadataService) {
......@@ -55,7 +54,7 @@ public class EntityService extends BaseService {
BaseRequest request = new CollectionRequest(Collections.<String, Object>emptyMap(), queryString);
Result result = getResources(entityResourceProvider, request);
return Response.status(Response.Status.OK).entity(m_serializer.serialize(result, ui)).build();
return Response.status(Response.Status.OK).entity(getSerializer().serialize(result, ui)).build();
}
@GET
......@@ -68,7 +67,7 @@ public class EntityService extends BaseService {
BaseRequest request = new InstanceRequest(Collections.<String, Object>singletonMap("id", entityId));
Result result = getResource(entityResourceProvider, request);
return Response.status(Response.Status.OK).entity(m_serializer.serialize(result, ui)).build();
return Response.status(Response.Status.OK).entity(getSerializer().serialize(result, ui)).build();
}
@GET
......@@ -84,7 +83,7 @@ public class EntityService extends BaseService {
properties.put("name", tagName);
Result result = getResource(entityTagResourceProvider, new InstanceRequest(properties));
return Response.status(Response.Status.OK).entity(m_serializer.serialize(result, ui)).build();
return Response.status(Response.Status.OK).entity(getSerializer().serialize(result, ui)).build();
}
@GET
......@@ -98,7 +97,7 @@ public class EntityService extends BaseService {
decode(getQueryString(ui)));
Result result = getResources(entityTagResourceProvider, request);
return Response.status(Response.Status.OK).entity(m_serializer.serialize(result, ui)).build();
return Response.status(Response.Status.OK).entity(getSerializer().serialize(result, ui)).build();
}
@POST
......
......@@ -41,15 +41,14 @@ import java.util.Map;
@Singleton
public class TaxonomyService extends BaseService {
private final TaxonomyResourceProvider taxonomyResourceProvider;
private static TermResourceProvider termResourceProvider;
private static JsonSerializer serializer = new JsonSerializer();
private ResourceProvider taxonomyResourceProvider;
private ResourceProvider termResourceProvider;
@Inject
public TaxonomyService(MetadataService metadataService) {
public void setMetadataService(MetadataService metadataService) {
DefaultTypeSystem typeSystem = new DefaultTypeSystem(metadataService);
taxonomyResourceProvider = new TaxonomyResourceProvider(typeSystem);
termResourceProvider = new TermResourceProvider(typeSystem);
taxonomyResourceProvider = createTaxonomyResourceProvider(typeSystem);
termResourceProvider = createTermResourceProvider(typeSystem);
}
@GET
......@@ -62,7 +61,7 @@ public class TaxonomyService extends BaseService {
Map<String, Object> properties = new HashMap<>();
properties.put("name", taxonomyName);
Result result = getResource(taxonomyResourceProvider, new InstanceRequest(properties));
return Response.status(Response.Status.OK).entity(serializer.serialize(result, ui)).build();
return Response.status(Response.Status.OK).entity(getSerializer().serialize(result, ui)).build();
}
@GET
......@@ -71,7 +70,7 @@ public class TaxonomyService extends BaseService {
String queryString = decode(getQueryString(ui));
Request request = new CollectionRequest(Collections.<String, Object>emptyMap(), queryString);
Result result = getResources(taxonomyResourceProvider, request);
return Response.status(Response.Status.OK).entity(serializer.serialize(result, ui)).build();
return Response.status(Response.Status.OK).entity(getSerializer().serialize(result, ui)).build();
}
@POST
......@@ -120,7 +119,7 @@ public class TaxonomyService extends BaseService {
properties.put("termPath", termPath);
Result result = getResource(termResourceProvider, new InstanceRequest(properties));
return Response.status(Response.Status.OK).entity(serializer.serialize(result, ui)).build();
return Response.status(Response.Status.OK).entity(getSerializer().serialize(result, ui)).build();
}
@GET
......@@ -136,7 +135,7 @@ public class TaxonomyService extends BaseService {
Collections.<String, Object>singletonMap("termPath", termPath), queryString);
Result result = getResources(termResourceProvider, request);
return Response.status(Response.Status.OK).entity(serializer.serialize(result, ui)).build();
return Response.status(Response.Status.OK).entity(getSerializer().serialize(result, ui)).build();
}
@GET
......@@ -149,11 +148,6 @@ public class TaxonomyService extends BaseService {
@PathParam("remainder") String remainder) throws CatalogException {
Result result;
List<PathSegment> pathSegments = ui.getPathSegments();
int lastIndex = pathSegments.size() - 1;
String lastSegment = pathSegments.get(lastIndex).getPath();
String termName = String.format("%s%s", rootTerm,
remainder.replaceAll("/?terms/?([.]*)", "$1."));
String queryString = decode(getQueryString(ui));
......@@ -161,13 +155,17 @@ public class TaxonomyService extends BaseService {
Map<String, Object> properties = new HashMap<>();
properties.put("termPath", termPath);
List<PathSegment> pathSegments = ui.getPathSegments();
int lastIndex = pathSegments.size() - 1;
String lastSegment = pathSegments.get(lastIndex).getPath();
if (lastSegment.equals("terms") || (lastSegment.isEmpty() && pathSegments.get(lastIndex - 1).getPath().equals("terms"))) {
result = getResources(termResourceProvider, new CollectionRequest(properties, queryString));
} else {
result = getResource(termResourceProvider, new InstanceRequest(properties));
}
return Response.status(Response.Status.OK).entity(serializer.serialize(result, ui)).build();
return Response.status(Response.Status.OK).entity(getSerializer().serialize(result, ui)).build();
}
@POST
......@@ -188,6 +186,27 @@ public class TaxonomyService extends BaseService {
new Results(ui.getRequestUri().toString(), 201)).build();
}
@POST
@Path("{taxonomyName}/terms/{termName}/{remainder:.*}")
@Produces(Servlets.JSON_MEDIA_TYPE)
public Response createSubTerm(String body,
@Context HttpHeaders headers,
@Context UriInfo ui,
@PathParam("taxonomyName") String taxonomyName,
@PathParam("termName") String termName,
@PathParam("remainder") String remainder) throws CatalogException {
Map<String, Object> properties = parsePayload(body);
String[] pathTokens = remainder.split("/");
validateName(pathTokens[pathTokens.length -1]);
properties.put("termPath", new TermPath(taxonomyName, String.format("%s%s", termName,
remainder.replaceAll("/?terms/?([.]*)", "$1."))));
createResource(termResourceProvider, new InstanceRequest(properties));
return Response.status(Response.Status.CREATED).entity(
new Results(ui.getRequestUri().toString(), 201)).build();
}
@DELETE
@Path("{taxonomyName}/terms/{termName}")
@Produces(Servlets.JSON_MEDIA_TYPE)
......@@ -204,25 +223,30 @@ public class TaxonomyService extends BaseService {
new Results(ui.getRequestUri().toString(), 200)).build();
}
@POST
@DELETE
@Path("{taxonomyName}/terms/{termName}/{remainder:.*}")
@Produces(Servlets.JSON_MEDIA_TYPE)
public Response createSubTerms(String body,
@Context HttpHeaders headers,
@Context UriInfo ui,
@PathParam("taxonomyName") String taxonomyName,
@PathParam("termName") String termName,
@PathParam("remainder") String remainder) throws CatalogException {
public Response deleteSubTerm(@Context HttpHeaders headers,
@Context UriInfo ui,
@PathParam("taxonomyName") String taxonomyName,
@PathParam("termName") String termName,
@PathParam("remainder") String remainder) throws CatalogException {
Map<String, Object> properties = parsePayload(body);
String[] pathTokens = remainder.split("/");
validateName(pathTokens[pathTokens.length -1]);
Map<String, Object> properties = new HashMap<>();
properties.put("termPath", new TermPath(taxonomyName, String.format("%s%s", termName,
remainder.replaceAll("/?terms/?([.]*)", "$1."))));
createResource(termResourceProvider, new InstanceRequest(properties));
deleteResource(termResourceProvider, new InstanceRequest(properties));
return Response.status(Response.Status.CREATED).entity(
new Results(ui.getRequestUri().toString(), 201)).build();
return Response.status(Response.Status.OK).entity(
new Results(ui.getRequestUri().toString(), 200)).build();
}
protected ResourceProvider createTaxonomyResourceProvider(AtlasTypeSystem typeSystem) {
return new TaxonomyResourceProvider(typeSystem);
}
protected ResourceProvider createTermResourceProvider(AtlasTypeSystem typeSystem) {
return new TermResourceProvider(typeSystem);
}
private void validateName(String name) throws InvalidPayloadException {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment