/*
* Copyright 2002-2005 the 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 info.jtrac.wicket;
import info.jtrac.domain.ColumnHeading;
import info.jtrac.domain.ColumnHeading.Name;
import info.jtrac.domain.ExcelFile;
import info.jtrac.domain.ExcelFile.Cell;
import info.jtrac.domain.ExcelFile.Column;
import info.jtrac.domain.Space;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Check;
import org.apache.wicket.markup.html.form.CheckGroup;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.form.upload.FileUploadField;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.PropertyModel;
/**
* excel import and cleanup
*/
public class ExcelImportPage extends BasePage {
private ExcelFile excelFile;
private int action;
private Space space;
public void setSpace(Space space) {
this.space = space;
}
public Space getSpace() {
return space;
}
public ExcelFile getExcelFile() {
return excelFile;
}
public ExcelImportPage() {
add(new FeedbackPanel("feedback"));
final FileUploadField fileUploadField = new FileUploadField("file");
Form uploadForm = new Form("uploadForm") {
@Override
public void onSubmit() {
if(fileUploadField.getFileUpload() == null) {
return;
}
InputStream is = null;
try {
is = fileUploadField.getFileUpload().getInputStream();
excelFile = new ExcelFile(is);
} catch(Exception e) {
error(localize("excel_upload.error.invalidFile"));
return;
}
}
@Override
public boolean isVisible() {
return excelFile == null;
}
};
add(uploadForm);
uploadForm.add(fileUploadField);
Form form = new Form("form") {
@Override
public void onSubmit() {
if(action == 0) {
error(localize("excel_view.error.noActionSelected"));
return;
}
switch(action) {
case 1: // delete
if(!excelFile.isColumnSelected() && !excelFile.isRowSelected()) {
error(localize("excel_view.error.noColumnOrRowSelected"));
return;
}
excelFile.deleteSelectedRowsAndColumns();
break;
case 2: // convert to date
if(!excelFile.isColumnSelected()) {
error(localize("excel_view.error.noColumnSelected"));
return;
}
excelFile.convertSelectedColumnsToDate();
break;
case 3: // concatenate
if(excelFile.getSelectedColumns().size() < 2) {
error(localize("excel_view.error.atLeastTwoColumns"));
return;
}
excelFile.concatenateSelectedColumns();
break;
case 4: // extract summary into new column
if(!excelFile.isColumnSelected()) {
error(localize("excel_view.error.noColumnSelected"));
return;
}
excelFile.extractSummaryFromSelectedColumn();
break;
case 5: // duplicate column
if(!excelFile.isColumnSelected()) {
error(localize("excel_view.error.noColumnSelected"));
return;
}
excelFile.duplicateSelectedColumn();
break;
case 6: // map column
if(space == null) {
error(localize("excel_view.error.noSpaceSelected"));
return;
}
if(!excelFile.isColumnSelected()) {
error(localize("excel_view.error.noColumnSelected"));
return;
}
int colIndex = excelFile.getSelectedColumns().get(0);
setResponsePage(new ExcelImportColumnPage(ExcelImportPage.this, colIndex));
break;
case 7: // edit row
if (!excelFile.isRowSelected()) {
error(localize("excel_view.error.noRowSelected"));
return;
}
int rowIndex = excelFile.getSelectedRows().get(0);
setResponsePage(new ExcelImportRowPage(ExcelImportPage.this, rowIndex));
break;
case 8: // import !
if(space == null) {
error(localize("excel_view.error.noSpaceSelected"));
return;
}
Map<Name, String> labelsMap = BasePage.getLocalizedLabels(ExcelImportPage.this);
ColumnHeading duplicate = excelFile.getDuplicatedColumnHeadings();
if(duplicate != null) {
error(localize("excel_view.error.duplicateMapping", labelsMap.get(duplicate.getName())));
return;
}
List<ColumnHeading> unMapped = excelFile.getUnMappedColumnHeadings();
if(unMapped.size() > 0) {
for(ColumnHeading ch : unMapped) {
error(localize("excel_view.error.notMapped", labelsMap.get(ch.getName())));
}
return;
}
List<info.jtrac.domain.Item> items = excelFile.getAsItems(space);
getJtrac().storeItems(items);
info(localize("excel_view.importSuccess"));
setResponsePage(new ExcelImportPage());
}
action = 0;
excelFile.clearSelected();
}
@Override
public boolean isVisible() {
return excelFile != null;
}
};
add(form);
form.add(new Label("selectedSpace", new AbstractReadOnlyModel() {
public Object getObject() {
if(space == null) {
return localize("excel_view.noSpaceSelected");
}
return space.getName() + " [" + space.getPrefixCode() + "]";
}
}));
form.add(new Link("selectSpace") {
public void onClick() {
setResponsePage(new ExcelImportSpacePage(ExcelImportPage.this));
}
});
final Map<Integer, String> map = new LinkedHashMap<Integer, String>();
map.put(0, "excel_view.selectActionToPerform");
map.put(1, "excel_view.deleteSelected");
map.put(2, "excel_view.convertToDate");
map.put(3, "excel_view.concatenateFields");
map.put(4, "excel_view.extractFirstEighty");
map.put(5, "excel_view.duplicateColumn");
map.put(6, "excel_view.mapToField");
map.put(7, "excel_view.editRow");
map.put(8, "excel_view.import");
DropDownChoice actionChoice = new DropDownChoice("action", new ArrayList(map.keySet()));
actionChoice.setModel(new PropertyModel(this, "action"));
actionChoice.setChoiceRenderer(new IChoiceRenderer() {
public Object getDisplayValue(Object o) {
int i = (Integer) o;
return localize(map.get(i));
}
public String getIdValue(Object o, int i) {
return i + "";
}
});
form.add(actionChoice);
CheckGroup colsCheckGroup = new CheckGroup("colsCheckGroup", new PropertyModel(this, "excelFile.selectedColumns"));
form.add(colsCheckGroup);
colsCheckGroup.add(new ColumnCheckboxes("checks"));
form.add(new ColumnHeadings("headings"));
CheckGroup rowsCheckGroup = new CheckGroup("rowsCheckGroup", new PropertyModel(this, "excelFile.selectedRows"));
form.add(rowsCheckGroup);
rowsCheckGroup.add(new RowsListView("rows"));
}
private class ColumnCheckboxes extends ReadOnlyRefreshingView {
public ColumnCheckboxes(String id) {
super(id);
}
public List getObjectList() {
return excelFile.getColumns();
}
protected void populateItem(Item item) {
item.add(new Check("check", new PropertyModel(item, "index")));
}
}
private static final SimpleAttributeModifier CLASS_SELECTED = new SimpleAttributeModifier("class", "selected");
private class ColumnHeadings extends ReadOnlyRefreshingView {
public ColumnHeadings(String id) {
super(id);
}
public List getObjectList() {
return excelFile.getColumns();
}
protected void populateItem(Item item) {
final Column column = (Column) item.getModelObject();
if(column.getColumnHeading() != null) {
item.add(CLASS_SELECTED);
}
Label label = new Label("cell", new PropertyModel(column, "label"));
label.setRenderBodyOnly(true);
item.add(label);
}
}
private class RowsListView extends ReadOnlyRefreshingView {
public RowsListView(String id) {
super(id);
}
public List getObjectList() {
return excelFile.getRows();
}
protected void populateItem(Item rowItem) {
if(rowItem.getIndex() % 2 == 1) {
rowItem.add(CLASS_ALT);
}
rowItem.add(new Check("check", new PropertyModel(rowItem, "index")));
rowItem.add(new Label("index", rowItem.getIndex() + 1 + ""));
List<Cell> rowCells = (List<Cell>) rowItem.getModelObject();
rowItem.add(new ListView("cols", rowCells) {
protected void populateItem(ListItem colItem) {
Cell cell = (Cell) colItem.getModelObject();
Label label = new Label("cell", new PropertyModel(cell, "valueAsString"));
label.setRenderBodyOnly(true);
label.setEscapeModelStrings(false);
colItem.add(label);
}
});
}
}
}