package org.bonitasoft.web.rest.server.api.extension;
import java.io.IOException;
import java.util.Map;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import org.bonitasoft.console.common.server.page.PageMappingService;
import org.bonitasoft.console.common.server.page.RestApiRenderer;
import org.bonitasoft.console.common.server.page.RestApiResponse;
import org.bonitasoft.engine.exception.BonitaException;
import org.restlet.Request;
import org.restlet.data.CharacterSet;
import org.restlet.data.CookieSetting;
import org.restlet.data.Header;
import org.restlet.data.MediaType;
import org.restlet.data.Status;
import org.restlet.ext.servlet.ServletUtils;
import org.restlet.representation.Representation;
import org.restlet.representation.StringRepresentation;
import org.restlet.resource.ServerResource;
/**
* @author Laurent Leseigneur
*/
public class ApiExtensionResource extends ServerResource {
public static final String EMPTY_RESPONSE = "";
private final RestApiRenderer restApiRenderer;
private PageMappingService pageMappingService;
public ApiExtensionResource(RestApiRenderer restApiRenderer, PageMappingService pageMappingService) {
this.restApiRenderer = restApiRenderer;
this.pageMappingService = pageMappingService;
}
@Override
public Representation doHandle() {
final StringRepresentation stringRepresentation = new StringRepresentation(EMPTY_RESPONSE);
try {
final RestApiResponse restApiResponse = handleRequest();
fillAllContent(stringRepresentation, restApiResponse);
return stringRepresentation;
} catch (BonitaException e) {
return new StringRepresentation(e.getMessage());
}
}
private void fillAllContent(StringRepresentation stringRepresentation, RestApiResponse restApiResponse) throws BonitaException {
if (restApiResponse == null) {
throw new BonitaException("error: restApiResponse is null");
}
stringRepresentation.setCharacterSet(new CharacterSet(restApiResponse.getCharacterSet()));
stringRepresentation.setMediaType(new MediaType(restApiResponse.getMediaType()));
getResponse().setStatus(new Status(restApiResponse.getHttpStatus()));
fillContent(stringRepresentation, restApiResponse);
fillHeaders(restApiResponse);
fillCookies(restApiResponse);
}
private void fillCookies(RestApiResponse restApiResponse) {
for (Cookie cookie : restApiResponse.getAdditionalCookies()) {
getResponse().getCookieSettings().add(new CookieSetting(cookie.getVersion(), cookie.getName(), cookie.getValue(), cookie.getPath(), cookie.getDomain(), cookie.getComment(), cookie.getMaxAge(), cookie.getSecure()));
}
}
private void fillHeaders(RestApiResponse restApiResponse) {
for (Map.Entry<String, String> entry : restApiResponse.getAdditionalHeaders().entrySet()) {
getResponse().getHeaders().add(new Header(entry.getKey(), entry.getValue()));
}
}
private void fillContent(StringRepresentation stringRepresentation, RestApiResponse restApiResponse) {
if (restApiResponse.getResponse() != null) {
stringRepresentation.setText(restApiResponse.getResponse().toString());
}
}
private RestApiResponse handleRequest() throws BonitaException {
final Request request = getRequest();
final ResourceExtensionResolver resourceExtensionResolver = new ResourceExtensionResolver(request, pageMappingService);
final HttpServletRequest httpServletRequest = ServletUtils.getRequest(request);
try {
return restApiRenderer.handleRestApiCall(httpServletRequest, resourceExtensionResolver);
} catch (InstantiationException | IllegalAccessException | IOException | BonitaException e) {
throw new BonitaException(e.getMessage());
}
}
}