com.safetys.framework.jmesa.worksheet.WorksheetUpdater.java Source code

Java tutorial

Introduction

Here is the source code for com.safetys.framework.jmesa.worksheet.WorksheetUpdater.java

Source

/*
 * Copyright 2004 original author or authors.
 *
 * 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.safetys.framework.jmesa.worksheet;

import java.io.UnsupportedEncodingException;
import static java.net.URLDecoder.decode;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import com.safetys.framework.jmesa.core.message.Messages;
import com.safetys.framework.jmesa.web.WebContext;
import com.safetys.framework.jmesa.worksheet.state.SessionWorksheetState;
import com.safetys.framework.jmesa.worksheet.state.WorksheetState;

/**
 * Will store the Worksheet object in the users session by the table id. However, once the servlet
 * is set up the developer will not ever have to deal with the fact that the Worksheet object is in
 * session. The ajax calls will abstract that out from the html table side. Then the TableFacade
 * will abstract out the retrieve of the Worksheet in the controller.
 *
 * @since 2.3
 * @author Jeff Johnston
 */
public class WorksheetUpdater {
    protected static String UNIQUE_PROPERTIES = "up_";
    protected static String COLUMN_PROPERTY = "cp_";
    protected static String ORIGINAL_VALUE = "ov_";
    protected static String CHANGED_VALUE = "cv_";

    protected static String ERROR_MESSAGE = "em_";

    protected static String COLUMN_REMOVED = "_rm_";
    protected static String COLUMN_UPDATED = "_uu_";
    protected static String COLUMN_HAS_ERROR = "_ue_";

    protected WorksheetState worksheetState;

    public String update(Messages messages, WebContext webContext) {
        Worksheet worksheet = getWorksheet(messages, webContext);
        WorksheetRow worksheetRow = getWorksheetRow(worksheet, webContext);

        WorksheetColumn worksheetColumn = getWorksheetColumn(worksheetRow, webContext);
        String columnStatus = validateWorksheet(worksheet, worksheetRow, worksheetColumn,
                webContext.getParameter(ERROR_MESSAGE));

        // for distributed deployment (e.g. GAE)
        getWorksheetState(webContext).persistWorksheet(worksheet);

        return columnStatus;
    }

    protected Worksheet getWorksheet(Messages messages, WebContext webContext) {
        worksheetState = getWorksheetState(webContext);
        Worksheet worksheet = worksheetState.retrieveWorksheet();
        if (worksheet == null) {
            String id = webContext.getParameter("id");
            worksheet = new Worksheet(id);
            worksheet.setWebContext(webContext);
            worksheet.setMessages(messages);
            worksheetState.persistWorksheet(worksheet);
        }

        return worksheet;
    }

    protected WorksheetState getWorksheetState(WebContext webContext) {
        if (worksheetState == null) {
            String id = webContext.getParameter("id");
            return new SessionWorksheetState(id, webContext);
        }

        return worksheetState;
    }

    protected WorksheetRow getWorksheetRow(Worksheet worksheet, WebContext webContext) {
        Map<?, ?> parameters = webContext.getParameterMap();
        for (Object param : parameters.keySet()) {
            String parameter = (String) param;
            if (parameter.startsWith(UNIQUE_PROPERTIES)) {
                String value = webContext.getParameter(parameter);
                String property = StringUtils.substringAfter(parameter, UNIQUE_PROPERTIES);

                UniqueProperty uniqueProperty = new UniqueProperty(property, value);
                WorksheetRow worksheetRow = worksheet.getRow(uniqueProperty);
                if (worksheetRow == null) {
                    worksheetRow = new WorksheetRow(uniqueProperty);
                    worksheetRow.setRowStatus(WorksheetRowStatus.MODIFY);
                    worksheet.addRow(worksheetRow);
                }

                return worksheetRow;
            }
        }

        return null;
    }

    protected WorksheetColumn getWorksheetColumn(WorksheetRow worksheetRow, WebContext webContext) {
        String property = webContext.getParameter(COLUMN_PROPERTY);
        WorksheetColumn worksheetColumn = worksheetRow.getColumn(property);
        if (worksheetColumn == null) {
            String orginalValue = webContext.getParameter(ORIGINAL_VALUE);
            try {
                orginalValue = decode(orginalValue, "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            worksheetColumn = new WorksheetColumn(property, orginalValue);
            worksheetRow.addColumn(worksheetColumn);
        }

        String changedValue = webContext.getParameter(CHANGED_VALUE);
        try {
            changedValue = decode(changedValue, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        worksheetColumn.setChangedValue(changedValue);

        return worksheetColumn;
    }

    /**
     * Validate that the columns original value is not the same as the changed value. If it is
     * then remove the column from the row.
     */
    protected String validateWorksheet(Worksheet worksheet, WorksheetRow row, WorksheetColumn column,
            String errorMessage) {
        String columnStatus = COLUMN_UPDATED;

        if (StringUtils.isNotEmpty(errorMessage)) {
            try {
                column.setError(decode(errorMessage, "UTF-8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            columnStatus = COLUMN_HAS_ERROR;
        } else if (column.hasError()) {
            column.removeError();
        }

        if (column.getChangedValue().equals(column.getOriginalValue())) {
            if (!row.getRowStatus().equals(WorksheetRowStatus.ADD)) {
                row.removeColumn(column);

                if (row.getColumns().size() == 0) {
                    worksheet.removeRow(row);
                }
            }

            if (!columnStatus.equals(COLUMN_HAS_ERROR)) {
                columnStatus = COLUMN_REMOVED;
            }
        }

        return columnStatus;
    }
}