Java tutorial
// Copyright 2013 Google Inc. All Rights Reserved. // // Licensed 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 com.google.api.ads.adwords.jaxws.extensions.kratu.restserver; import com.google.api.ads.adwords.jaxws.extensions.kratu.data.StorageHelper; import com.google.api.ads.adwords.jaxws.extensions.report.model.util.DateUtil; import com.google.api.ads.adwords.jaxws.extensions.report.model.util.GsonUtil; import com.google.api.client.util.Maps; import com.google.gson.Gson; import org.apache.log4j.Logger; import org.restlet.Message; import org.restlet.data.MediaType; import org.restlet.data.Status; import org.restlet.engine.header.Header; import org.restlet.ext.json.JsonRepresentation; import org.restlet.representation.BufferingRepresentation; import org.restlet.representation.Representation; import org.restlet.representation.StringRepresentation; import org.restlet.resource.Delete; import org.restlet.resource.Get; import org.restlet.resource.Options; import org.restlet.resource.Post; import org.restlet.resource.Put; import org.restlet.resource.ServerResource; import org.restlet.util.Series; import org.springframework.context.ApplicationContext; import java.util.Date; import java.util.HashMap; import java.util.concurrent.ConcurrentMap; /** * AbstractServerResource * * @author jtoledo@google.com (Julian Toledo) */ public abstract class AbstractServerResource extends ServerResource { private static final Logger LOGGER = Logger.getLogger(AbstractServerResource.class.getName()); private static final String HEADERS_KEY = "org.restlet.http.headers"; protected static final Gson gson = GsonUtil.getGsonBuilder().create(); protected String file = ""; private ApplicationContext appCtx; private StorageHelper storageHelper; // HTTP Parameters protected boolean live = false; protected Long partnerId = null; protected Long topAccountId = null; protected Long accountId = null; protected Long campaignId = null; protected Long adGroupId = null; protected Long adId = null; protected Long criterionId = null; protected Long adExtensionId = null; protected String campaignIdcriterionIdString = null; protected Date dateStart = null; protected Date dateEnd = null; protected String dateRangeType = null; protected boolean includeZeroImpressions = false; @Get abstract public Representation getHandler(); @Delete abstract public void deleteHandler(); @Post @Put abstract public Representation postPutHandler(String json); @Options public void optionsHandler() { addHeaders(); } protected void getParameters() { try { file = (String) getContext().getAttributes().get("file"); String liveString = this.getReference().getQueryAsForm().getFirstValue("live"); String partnerIdString = (String) getRequestAttributes().get("partnerId"); String topAccountIdString = (String) getRequestAttributes().get("topAccountId"); String accountIdString = (String) getRequestAttributes().get("accountId"); String campaignIdString = (String) getRequestAttributes().get("campaignId"); String adGroupIdString = (String) getRequestAttributes().get("adGroupId"); String adIdString = (String) getRequestAttributes().get("adId"); String criterionIdString = (String) getRequestAttributes().get("criterionId"); String adExtensionIdString = (String) getRequestAttributes().get("adExtensionId"); campaignIdcriterionIdString = (String) getRequestAttributes().get("campaignId-criterionId"); String dateStartString = this.getReference().getQueryAsForm().getFirstValue("dateStart"); String dateEndString = this.getReference().getQueryAsForm().getFirstValue("dateEnd"); dateRangeType = this.getReference().getQueryAsForm().getFirstValue("dateRangeType"); String includeZeroImpressionsString = this.getReference().getQueryAsForm() .getFirstValue("includeZeroImpressions"); live = (liveString != null && liveString.equals("true")); partnerId = partnerIdString == null ? null : Long.parseLong(partnerIdString); topAccountId = topAccountIdString == null ? null : Long.parseLong(topAccountIdString); accountId = accountIdString == null ? null : Long.parseLong(accountIdString); campaignId = campaignIdString == null ? null : Long.parseLong(campaignIdString); adGroupId = adGroupIdString == null ? null : Long.parseLong(adGroupIdString); adId = adIdString == null ? null : Long.parseLong(adIdString); criterionId = criterionIdString == null ? null : Long.parseLong(criterionIdString); adExtensionId = adExtensionIdString == null ? null : Long.parseLong(adExtensionIdString); includeZeroImpressions = (includeZeroImpressionsString != null && includeZeroImpressionsString.equals("true")); if (dateStartString != null && dateEndString != null) { dateStart = DateUtil.parseDateTime(dateStartString).toDate(); dateEnd = DateUtil.parseDateTime(dateEndString).toDate(); } criterionId = criterionIdString == null ? null : Long.parseLong(criterionIdString); } catch (Exception exception) { throw new IllegalArgumentException(exception); } } protected void addHeaders() { getMessageHeaders(getResponse()).add("Access-Control-Allow-Origin", "*"); getMessageHeaders(getResponse()).add("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS"); getMessageHeaders(getResponse()).add("Cache-Control", "no-cache, no-store, must-revalidate"); getMessageHeaders(getResponse()).add("Pragma", "no-cache"); getMessageHeaders(getResponse()).add("Expires", "0"); } protected void addReadOnlyHeaders() { getMessageHeaders(getResponse()).add("Access-Control-Allow-Origin", "*"); getMessageHeaders(getResponse()).add("Access-Control-Allow-Methods", "GET"); getMessageHeaders(getResponse()).add("Cache-Control", "no-cache, no-store, must-revalidate"); getMessageHeaders(getResponse()).add("Pragma", "no-cache"); getMessageHeaders(getResponse()).add("Expires", "0"); } protected Representation createJsonResult(String result) { this.setAutoCommitting(true); if (result == null) { this.setStatus(Status.CLIENT_ERROR_NOT_FOUND); result = Status.CLIENT_ERROR_NOT_FOUND.getDescription(); } JsonRepresentation jsonRepresentation = new JsonRepresentation(result); // Buffering avoids a Chunked response, Chunked caused last chunk timeouts. BufferingRepresentation bufferingRep = new BufferingRepresentation(jsonRepresentation); return bufferingRep; } protected StringRepresentation createHtmlResult(String result) { if (result == null) { this.setStatus(Status.CLIENT_ERROR_NOT_FOUND); result = Status.CLIENT_ERROR_NOT_FOUND.getDescription(); } StringRepresentation stringRepresentation = new StringRepresentation(result); stringRepresentation.setMediaType(MediaType.TEXT_HTML); return stringRepresentation; } protected String stackTraceToString(Throwable e) { StringBuilder sb = new StringBuilder(); for (StackTraceElement element : e.getStackTrace()) { sb.append(element.toString()); sb.append("\n"); } return sb.toString(); } protected Representation handleException(Exception exception) { HashMap<String, String> result = Maps.newHashMap(); LOGGER.fatal(stackTraceToString(exception)); if (exception instanceof IllegalArgumentException) { this.setStatus(Status.CLIENT_ERROR_BAD_REQUEST); result.put("error", "invalid_params"); result.put("message", "Check your REST Parameters"); } else { result.put("error", "internal_error"); result.put("message", "There was an error processing the request, see the server logs for more info"); this.setStatus(Status.SERVER_ERROR_INTERNAL); } if (exception instanceof com.mongodb.MongoException) { result.put("error", "mongo_db_is_down"); result.put("message", "Check your MongoDB sercer and configuration"); } if (exception.getMessage() != null && exception.getMessage().length() > 0) { result.put("exception_message", exception.getMessage()); } return createJsonResult(gson.toJson(result)); } @SuppressWarnings("unchecked") static Series<Header> getMessageHeaders(Message message) { ConcurrentMap<String, Object> attrs = message.getAttributes(); Series<Header> headers = (Series<Header>) attrs.get(HEADERS_KEY); if (headers == null) { headers = new Series<Header>(Header.class); Series<Header> prev = (Series<Header>) attrs.putIfAbsent(HEADERS_KEY, headers); if (prev != null) { headers = prev; } } return headers; } protected ApplicationContext getApplicationContext() { if (appCtx == null) { appCtx = (ApplicationContext) getContext().getAttributes().get("appCtx"); } return appCtx; } protected StorageHelper getStorageHelper() { if (storageHelper == null) { storageHelper = getApplicationContext().getBean(StorageHelper.class); } return storageHelper; } }