/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.api.core.rest; import org.eclipse.che.dto.server.JsonSerializable; import javax.ws.rs.HttpMethod; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Request; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import java.util.List; import static org.eclipse.che.api.core.rest.DownloadFileResponseFilter.EntityType.JSON_SERIALIZABLE; import static org.eclipse.che.api.core.rest.DownloadFileResponseFilter.EntityType.STRING; import static org.eclipse.che.api.core.rest.DownloadFileResponseFilter.EntityType.UNKNOWN; /** * Abstract Filter used to provide the json result as a file download operation. * It is applying on GET method and JSON content type only. * * @author Florent Benoit */ public abstract class DownloadFileResponseFilter { /** * Entity type that we will be able to handle. */ public enum EntityType { JSON_SERIALIZABLE, STRING, UNKNOWN } /** * Query parameter used to ask to specify headers that will propose JSON object to be downloaded. */ public static final String QUERY_DOWNLOAD_PARAMETER = "downloadAsFile"; /** * Check if we need to apply a filter * @param request * @return */ protected String getFileName(Request request, MediaType mediaType, UriInfo uriInfo, int responseStatus) { // manage only GET requests if (!HttpMethod.GET.equals(request.getMethod())) { return null; } // manage only OK code if (Response.Status.OK.getStatusCode() != responseStatus) { return null; } // Only handle JSON content if (!MediaType.APPLICATION_JSON_TYPE.equals(mediaType)) { return null; } // check if parameter filename is given MultivaluedMap<String, String> queryParameters = uriInfo.getQueryParameters(); return queryParameters.getFirst(QUERY_DOWNLOAD_PARAMETER); } /** * Check if entity is compliant with our filter * @param entity the entity embedded in response. * @return true if it's a type that we can handle */ protected boolean hasCompliantEntity(Object entity) { // no entity, skip if (entity == null) { return false; } // Check entity type if (entity instanceof List) { List<?> entities = (List)entity; for (Object simpleEntity : entities) { if (getElementType(simpleEntity) == UNKNOWN) { return false; } } } else if (getElementType(entity) == UNKNOWN) { // unknown entity type, will not configure it as a download return false; } return true; } /** * Helper method for getting the type of the JSON entity * * @param entity * the entity object * @return the type of the element */ protected EntityType getElementType(Object entity) { if (JsonSerializable.class.isAssignableFrom(entity.getClass())) { return JSON_SERIALIZABLE; } if (String.class.isAssignableFrom(entity.getClass())) { return STRING; } return UNKNOWN; } }