/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.atlas.web.resources;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import org.apache.atlas.catalog.JsonSerializer;
import org.apache.atlas.catalog.Request;
import org.apache.atlas.catalog.ResourceProvider;
import org.apache.atlas.catalog.Result;
import org.apache.atlas.catalog.exception.CatalogException;
import org.apache.atlas.catalog.exception.CatalogRuntimeException;
import org.apache.atlas.catalog.exception.InvalidPayloadException;
import org.apache.atlas.catalog.exception.InvalidQueryException;
import org.apache.atlas.catalog.exception.ResourceNotFoundException;
import org.apache.atlas.repository.graph.AtlasGraphProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Collection;
import java.util.Map;
/**
* Base class for all v1 API services.
*/
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 {
try {
return provider.getResourceById(request);
} catch (RuntimeException e) {
throw wrapRuntimeException(e);
}
}
protected Result getResources(ResourceProvider provider, Request request)
throws ResourceNotFoundException, InvalidQueryException {
try {
return provider.getResources(request);
} catch (RuntimeException e) {
LOG.error("Error while retrieving taxonomy ", e);
throw wrapRuntimeException(e);
}
}
protected void createResource(ResourceProvider provider, Request request) throws CatalogException {
try {
provider.createResource(request);
} catch (RuntimeException e) {
throw wrapRuntimeException(e);
}
}
protected void updateResource(ResourceProvider provider, Request request) throws CatalogException {
try {
provider.updateResourceById(request);
} catch (RuntimeException e) {
throw wrapRuntimeException(e);
}
}
protected void deleteResource(ResourceProvider provider, Request request) throws CatalogException {
try {
provider.deleteResourceById(request);
} catch (RuntimeException e) {
throw wrapRuntimeException(e);
}
}
protected Collection<String> createResources(ResourceProvider provider, Request request) throws CatalogException {
try {
return provider.createResources(request);
} catch (RuntimeException e) {
throw wrapRuntimeException(e);
}
}
protected String getQueryString(@Context UriInfo ui) {
String uri = ui.getRequestUri().toASCIIString();
int qsBegin = uri.indexOf("?");
return (qsBegin == -1) ? null : uri.substring(qsBegin + 1);
}
protected <T extends Map> T parsePayload(String body) throws InvalidPayloadException {
T properties;
try {
properties = gson.<T>fromJson(body, Map.class);
} catch (JsonSyntaxException e) {
LOG.info("Unable to parse json in request body", e);
throw new InvalidPayloadException("Request payload contains invalid JSON: " + e.getMessage());
}
return properties;
}
protected String decode(String s) throws CatalogException {
try {
return s == null ? null : URLDecoder.decode(s, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new CatalogException("Unable to decode URL: " + e.getMessage(), 500);
}
}
protected JsonSerializer getSerializer() {
return serializer;
}
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 {
public String href;
public int status;
public Results() {
// required by JAXB
}
public Results(String href, int status) {
this.href = href;
this.status = status;
}
}
}