| /** |
| * 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; |
| } |
| } |
| } |