/**
* Copyright (C) 2014 BonitaSoft S.A.
* BonitaSoft, 32 rue Gustave Eiffel - 38000 Grenoble
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2.0 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.bonitasoft.console.common.server.servlet;
import java.io.File;
import java.io.IOException;
import java.util.Properties;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.io.FileUtils;
import org.bonitasoft.console.common.server.page.CustomPageService;
import org.bonitasoft.console.common.server.preferences.properties.PropertiesFactory;
import org.bonitasoft.engine.exception.AlreadyExistsException;
import org.bonitasoft.engine.exception.BonitaException;
import org.bonitasoft.engine.exception.InvalidPageTokenException;
import org.bonitasoft.engine.exception.InvalidPageZipContentException;
import org.bonitasoft.engine.session.APISession;
public class PageUploadServlet extends TenantFileUploadServlet {
/**
* UID
*/
private static final long serialVersionUID = -5733037726905793432L;
protected static final String ACTION_PARAM_NAME = "action";
private static final String PROCESS_PARAM_NAME = "process";
protected static final String ADD_ACTION = "add";
protected static final String EDIT_ACTION = "edit";
protected static final String PAGE_PROPERTIES = "page.properties";
protected static final Logger LOGGER = Logger.getLogger(PageUploadServlet.class.getName());
@Override
protected String generateResponseString(final HttpServletRequest request, final String fileName, final File uploadedFile) throws Exception {
final String responseString = super.generateResponseString(request, fileName, uploadedFile);
final String permissions = getPermissions(request, uploadedFile);
return responseString + RESPONSE_SEPARATOR + permissions;
}
protected String getPermissions(final HttpServletRequest request, final File uploadedFile) throws IOException, BonitaException {
final String action = request.getParameter(ACTION_PARAM_NAME);
final boolean checkIfItAlreadyExists = ADD_ACTION.equals(action);
String permissions;
try {
final Set<String> permissionsSet = getPagePermissions(request, uploadedFile, checkIfItAlreadyExists);
permissions = permissionsSet.toString();
} catch (final InvalidPageZipContentException e) {
permissions = getPermissionsError(e);
} catch (final InvalidPageTokenException e) {
permissions = getPermissionsError(e);
} catch (final AlreadyExistsException e) {
permissions = getPermissionsError(e);
}
if (permissions == null) {
permissions = "[]";
}
return permissions;
}
protected String getPermissionsError(final Exception e) {
if (LOGGER.isLoggable(Level.WARNING)) {
LOGGER.log(Level.WARNING, e.getMessage());
}
return e.getClass().getSimpleName();
}
protected Set<String> getPagePermissions(final HttpServletRequest request, final File uploadedFile, final boolean checkIfItAlreadyExists)
throws InvalidPageZipContentException, InvalidPageTokenException, AlreadyExistsException, BonitaException,
IOException, InvalidPageZipContentException {
final APISession apiSession = getAPISession(request);
final Long processDefinitionId = getProcessDefinitionId(request);
final CustomPageService customPageService = new CustomPageService();
final Properties properties = customPageService.getPageProperties(apiSession, FileUtils.readFileToByteArray(uploadedFile),
checkIfItAlreadyExists, processDefinitionId);
return customPageService.getCustomPagePermissions(properties, PropertiesFactory.getResourcesPermissionsMapping(apiSession.getTenantId()), true);
}
private Long getProcessDefinitionId(final HttpServletRequest request) {
final String processStr = request.getParameter(PROCESS_PARAM_NAME);
Long processDefinitionId = null;
if (processStr != null) {
processDefinitionId = Long.parseLong(processStr);
}
return processDefinitionId;
}
}