Java tutorial
/* * 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 * * http://www.apache.org/licenses/LICENSE-2.0 * * 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.usergrid.rest; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; import java.util.UUID; import javax.xml.bind.annotation.XmlAnyElement; import javax.xml.bind.annotation.XmlRootElement; import org.codehaus.jackson.annotate.JsonAnyGetter; import org.codehaus.jackson.annotate.JsonAnySetter; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonPropertyOrder; import org.codehaus.jackson.map.annotate.JsonSerialize; import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion; import org.springframework.beans.factory.annotation.Autowired; import org.apache.usergrid.persistence.AggregateCounterSet; import org.apache.usergrid.persistence.Entity; import org.apache.usergrid.persistence.entities.Application; import org.apache.usergrid.security.oauth.ClientCredentialsInfo; import org.apache.usergrid.services.ServiceRequest; import org.apache.usergrid.services.ServiceResults; import org.apache.usergrid.utils.InflectionUtils; import org.apache.commons.lang.ClassUtils; import org.apache.commons.lang.StringUtils; import static org.apache.usergrid.utils.InflectionUtils.pluralize; @JsonPropertyOrder({ "action", "application", "params", "path", "query", "uri", "status", "error", "applications", "entity", "entities", "list", "data", "next", "timestamp", "duration" }) @XmlRootElement public class ApiResponse { private ServiceRequest esp; private String error; private String errorDescription; private String errorUri; private String exception; private String callback; private String path; private String uri; private String status; private long timestamp; private String organization; private String applicationName; private UUID application; private List<Entity> entities; private UUID next; private String cursor; private Integer count; private String action; private List<Object> list; private Object data; private Map<String, UUID> applications; private Map<String, Object> metadata; private Map<String, List<String>> params; private List<AggregateCounterSet> counters; private ClientCredentialsInfo credentials; protected Map<String, Object> properties = new TreeMap<String, Object>(String.CASE_INSENSITIVE_ORDER); @Autowired protected ServerEnvironmentProperties serverEnvironmentProperties; public ApiResponse() { timestamp = System.currentTimeMillis(); } public ApiResponse(ServerEnvironmentProperties properties) { this.serverEnvironmentProperties = properties; timestamp = System.currentTimeMillis(); } @JsonSerialize(include = Inclusion.NON_NULL) public String getCallback() { return callback; } public void setCallback(String callback) { this.callback = callback; } @JsonSerialize(include = Inclusion.NON_NULL) public String getError() { return error; } public void setError(String code) { error = code; } public static String exceptionToErrorCode(Throwable e) { if (e == null) { return "service_error"; } String s = ClassUtils.getShortClassName(e.getClass()); s = StringUtils.removeEnd(s, "Exception"); s = InflectionUtils.underscore(s).toLowerCase(); return s; } public ApiResponse withError(String code) { return withError(code, null, null); } public void setError(Throwable e) { setError(null, null, e); } public ApiResponse withError(Throwable e) { return withError(null, null, e); } public void setError(String description, Throwable e) { setError(null, description, e); } public ApiResponse withError(String description, Throwable e) { return withError(null, description, e); } public void setError(String code, String description, Throwable e) { if (code == null) { code = exceptionToErrorCode(e); } error = code; errorDescription = description; if (e != null) { if (description == null) { errorDescription = e.getMessage(); } exception = e.getClass().getName(); } } public ApiResponse withError(String code, String description, Throwable e) { setError(code, description, e); return this; } @JsonSerialize(include = Inclusion.NON_NULL) @JsonProperty("error_description") public String getErrorDescription() { return errorDescription; } @JsonProperty("error_description") public void setErrorDescription(String errorDescription) { this.errorDescription = errorDescription; } @JsonSerialize(include = Inclusion.NON_NULL) @JsonProperty("error_uri") public String getErrorUri() { return errorUri; } @JsonProperty("error_uri") public void setErrorUri(String errorUri) { this.errorUri = errorUri; } @JsonSerialize(include = Inclusion.NON_NULL) public String getException() { return exception; } public void setException(String exception) { this.exception = exception; } @JsonSerialize(include = Inclusion.NON_NULL) public String getPath() { return path; } public void setPath(String path) { if (path == null) { this.path = null; uri = null; } this.path = path; uri = createPath(path); } @JsonSerialize(include = Inclusion.NON_NULL) public String getUri() { return uri; } public void setServiceRequest(ServiceRequest p) { esp = p; if (p != null) { path = p.getPath(); uri = createPath(path); } } public ApiResponse withServiceRequest(ServiceRequest p) { setServiceRequest(p); return this; } @JsonSerialize(include = Inclusion.NON_NULL) public String getStatus() { return status; } public void setSuccess() { status = "ok"; } public ApiResponse withSuccess() { status = "ok"; return this; } @JsonSerialize(include = Inclusion.NON_NULL) public long getDuration() { return System.currentTimeMillis() - timestamp; } public void setTimestamp(long timestamp) { this.timestamp = timestamp; } public ApiResponse withTimestamp(long timestamp) { this.timestamp = timestamp; return this; } @JsonSerialize(include = Inclusion.NON_NULL) public long getTimestamp() { return timestamp; } @JsonSerialize(include = Inclusion.NON_NULL) public String getAction() { return action; } public void setAction(String action) { this.action = action; } public ApiResponse withAction(String action) { this.action = action; return this; } @JsonSerialize(include = Inclusion.NON_NULL) public UUID getApplication() { return application; } @JsonSerialize(include = Inclusion.NON_NULL) public String applicationName() { return applicationName; } /** @return the orgId */ @JsonSerialize(include = Inclusion.NON_NULL) public String getOrganization() { return organization; } /** Set the application and organization information */ public void setApplication(Application app) { this.organization = app.getOrganizationName(); this.applicationName = app.getApplicationName(); this.application = app.getUuid(); if (esp != null) { uri = createPath(esp.toString()); } } @JsonSerialize(include = Inclusion.NON_NULL) @XmlAnyElement public List<Entity> getEntities() { return entities; } public void setEntities(List<Entity> entities) { if (entities != null) { this.entities = entities; } else { this.entities = new ArrayList<Entity>(); } } public ApiResponse withEntities(List<Entity> entities) { setEntities(entities); return this; } public void setResults(ServiceResults results) { if (results != null) { setPath(results.getPath()); entities = results.getEntities(); next = results.getNextResult(); cursor = results.getCursor(); counters = results.getCounters(); } else { entities = new ArrayList<Entity>(); } } public ApiResponse withResults(ServiceResults results) { setResults(results); return this; } public ApiResponse withResultsCount(ServiceResults results) { setResults(results); if (results != null) { count = results.size(); } return this; } @JsonSerialize(include = Inclusion.NON_NULL) public UUID getNext() { return next; } public void setNext(UUID next) { this.next = next; } @JsonSerialize(include = Inclusion.NON_NULL) public String getCursor() { return cursor; } public void setCursor(String cursor) { this.cursor = cursor; } @JsonSerialize(include = Inclusion.NON_NULL) public Integer getCount() { return count; } public void setCount(Integer count) { this.count = count; } public ApiResponse withEntity(Entity entity) { entities = new ArrayList<Entity>(); entities.add(entity); return this; } @JsonSerialize(include = Inclusion.NON_NULL) public List<Object> getList() { return list; } public void setList(List<Object> list) { if (list != null) { this.list = list; } else { this.list = new ArrayList<Object>(); } } public ApiResponse withList(List<Object> list) { setList(list); return this; } public ApiResponse withListCount(List<Object> list) { setList(list); if (!list.isEmpty()) { this.count = list.size(); } return this; } @JsonSerialize(include = Inclusion.NON_NULL) public Object getData() { return data; } public void setData(Object data) { if (data != null) { this.data = data; } else { this.data = new LinkedHashMap<String, Object>(); } } public ApiResponse withData(Object data) { setData(data); return this; } @JsonSerialize(include = Inclusion.NON_NULL) public List<AggregateCounterSet> getCounters() { return counters; } public void setCounters(List<AggregateCounterSet> counters) { this.counters = counters; } @JsonSerialize(include = Inclusion.NON_NULL) public Map<String, UUID> getApplications() { return applications; } public void setApplications(Map<String, UUID> applications) { this.applications = applications; } public ApiResponse withApplications(Map<String, UUID> applications) { this.applications = applications; return this; } @JsonSerialize(include = Inclusion.NON_NULL) public ClientCredentialsInfo getCredentials() { return credentials; } public void setCredentials(ClientCredentialsInfo credentials) { this.credentials = credentials; } public ApiResponse withCredentials(ClientCredentialsInfo credentials) { this.credentials = credentials; return this; } @JsonSerialize(include = Inclusion.NON_NULL) public Map<String, List<String>> getParams() { return params; } public void setParams(Map<String, List<String>> params) { Map<String, List<String>> q = new LinkedHashMap<String, List<String>>(); for (String k : params.keySet()) { List<String> v = params.get(k); if (v != null) { q.put(k, new ArrayList<String>(v)); } } this.params = q; } @JsonSerialize(include = Inclusion.NON_NULL) public Map<String, Object> getMetadata() { return metadata; } public void setMetadata(Map<String, Object> metadata) { this.metadata = metadata; } public String getEntityPath(String url_base, Entity entity) { String entity_uri = null; if (!Application.ENTITY_TYPE.equals(entity.getType())) { entity_uri = createPath(pluralize(entity.getType()), entity.getUuid().toString()); } else { entity_uri = createPath(); } return entity_uri; } public void prepareEntities() { if (uri != null) { String url_base = serverEnvironmentProperties.getApiBase(); if (entities != null) { for (Entity entity : entities) { String entity_uri = getEntityPath(url_base, entity); entity.setMetadata("uri", entity_uri); entity.setMetadata("path", path + "/" + entity.getUuid()); } } } } @JsonAnyGetter public Map<String, Object> getProperties() { return properties; } @JsonAnySetter public void setProperty(String key, Object value) { properties.put(key, value); } /** * Create a path * * @return ` */ private String createPath(String... suffixes) { StringBuilder builder = new StringBuilder(); builder.append(serverEnvironmentProperties.getApiBase()); if (!serverEnvironmentProperties.getApiBase().endsWith("/")) { builder.append("/"); } builder.append(organization); builder.append("/"); builder.append(applicationName); if (suffixes.length == 0) { return builder.toString(); } for (String current : suffixes) { if (current == null) { continue; } if (!current.startsWith("/")) { builder.append("/"); } builder.append(current); } return builder.toString(); } }