/*
* Copyright (C) 2014 Jan Pokorsky
*
* 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 3 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 cz.cas.lib.proarc.webapp.client.action;
import com.google.gwt.core.client.GWT;
import com.smartgwt.client.data.DSCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
import com.smartgwt.client.data.DataSource;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.PromptStyle;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.types.TextAreaWrap;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.FormItemValueFormatter;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.TextAreaItem;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.events.SelectionUpdatedEvent;
import com.smartgwt.client.widgets.grid.events.SelectionUpdatedHandler;
import com.smartgwt.client.widgets.layout.VLayout;
import cz.cas.lib.proarc.webapp.client.ClientMessages;
import cz.cas.lib.proarc.webapp.client.ClientUtils;
import cz.cas.lib.proarc.webapp.client.ds.DigitalObjectDataSource.DigitalObject;
import cz.cas.lib.proarc.webapp.client.ds.MetaModelDataSource;
import cz.cas.lib.proarc.webapp.client.ds.RestConfig;
import cz.cas.lib.proarc.webapp.client.ds.UrnNbnDataSource;
import cz.cas.lib.proarc.webapp.shared.rest.DigitalObjectResourceApi;
import java.util.HashMap;
import java.util.LinkedHashMap;
/**
* Registers NDK digital object(s) in the URN:NBN resolver.
*
* @author Jan Pokorsky
*/
public class UrnNbnAction extends AbstractAction {
private final ClientMessages i18n;
public UrnNbnAction(ClientMessages i18n) {
this(i18n, i18n.UrnNbnAction_Title(),
"[SKIN]/actions/add.png",
i18n.UrnNbnAction_Hint());
}
public UrnNbnAction(ClientMessages i18n, String title, String icon, String tooltip) {
super(title, icon, tooltip);
this.i18n = i18n;
}
@Override
public boolean accept(ActionEvent event) {
Object[] selection = Actions.getSelection(event);
boolean accept = false;
if (selection != null && selection instanceof Record[]) {
Record[] records = (Record[]) selection;
accept = acceptNdk(records);
}
return accept;
}
@Override
public void performAction(ActionEvent event) {
Record[] records = Actions.getSelection(event);
String[] pids = ClientUtils.toFieldValues(records, DigitalObjectResourceApi.DIGITALOBJECT_PID);
// show registrators?
askForRegisterOptions(pids);
}
private boolean acceptNdk(Record[] records) {
boolean accept = false;
for (Record record : records) {
DigitalObject dobj = DigitalObject.createOrNull(record);
if (dobj != null) {
// MetaModelRecord model = dobj.getModel();
// String metadataFormat = model.getMetadataFormat();
String modelId = dobj.getModelId();
// XXX hack; it needs support to query model/object for action availability
if (modelId != null && modelId.startsWith("model:ndk")) {
accept = true;
continue;
}
}
accept = false;
break;
}
return accept;
}
private void askForRegisterOptions(String[] pids) {
if (pids == null || pids.length == 0) {
return ;
}
final Record register = new Record();
register.setAttribute(DigitalObjectResourceApi.DIGITALOBJECT_PID, pids);
SC.ask(i18n.UrnNbnAction_Window_Title(), i18n.UrnNbnAction_Window_Msg(),
new BooleanCallback() {
@Override
public void execute(Boolean value) {
if (value == Boolean.TRUE) {
register(register);
}
}
});
}
private void register(final Record register) {
DSRequest dsRequest = new DSRequest();
dsRequest.setPromptStyle(PromptStyle.DIALOG);
dsRequest.setPrompt(i18n.UrnNbnAction_Wait_Msg());
DataSource ds = UrnNbnDataSource.getInstance();
ds.addData(register, new DSCallback() {
@Override
public void execute(DSResponse response, Object rawData, DSRequest request) {
if (RestConfig.isStatusOk(response)) {
Record[] data = response.getData();
ExportResultWidget.showErrors(data);
}
}
}, dsRequest);
}
static final class ExportResultWidget {
private final ClientMessages i18n;
private static ExportResultWidget INSTANCE;
private final ListGrid grid;
private final Canvas widget;
private final DynamicForm logForm;
private Window window;
/**
* Shows errors in the shared window instance.
* @param result array of errors
*/
public static void showErrors(Record[] result) {
if (INSTANCE == null) {
INSTANCE = new ExportResultWidget();
}
INSTANCE.showWindow(result);
}
public ExportResultWidget() {
i18n = GWT.create(ClientMessages.class);
VLayout vLayout = new VLayout();
vLayout.setWidth100();
vLayout.setHeight100();
grid = new ListGrid();
grid.setSelectionType(SelectionStyle.SINGLE);
grid.setFixedRecordHeights(false);
grid.setWrapCells(true);
grid.setShowClippedValuesOnHover(true);
ListGridField pidField = new ListGridField(DigitalObjectResourceApi.DIGITALOBJECT_PID,
i18n.ExportResultWidget_PID_Title());
// ListGridField errorField = new ListGridField(DigitalObjectResourceApi.URNNBN_ITEM_MESSAGE,
// i18n.ExportResultWidget_Message_Title());
ListGridField urnNbnField = new ListGridField(DigitalObjectResourceApi.URNNBN_ITEM_URNNBN,
i18n.UrnNbnAction_Result_UrnNbn_Title());
ListGridField labelField = new ListGridField(DigitalObjectResourceApi.MEMBERS_ITEM_LABEL,
i18n.UrnNbnAction_Result_Label_Title());
ListGridField modelField = new ListGridField(DigitalObjectResourceApi.DIGITALOBJECT_MODEL,
i18n.UrnNbnAction_Result_Model_Title());
ListGridField statusField = new ListGridField(DigitalObjectResourceApi.URNNBN_ITEM_STATUSTYPE,
i18n.UrnNbnAction_Result_Error_Title());
ListGridField warningField = new ListGridField(DigitalObjectResourceApi.URNNBN_ITEM_WARNING,
i18n.UrnNbnAction_Result_Status_Title(), 50);
warningField.setCellAlign(Alignment.CENTER);
warningField.setEmptyCellValue(":-)");
HashMap<String, String> statusValues = new HashMap<String, String>();
statusValues.put("true", ":-|");
statusValues.put("false", ":-(");
warningField.setValueMap(statusValues);
grid.setFields(labelField, modelField, statusField, urnNbnField, warningField, pidField);
grid.addSelectionUpdatedHandler(new SelectionUpdatedHandler() {
@Override
public void onSelectionUpdated(SelectionUpdatedEvent event) {
logForm.editSelectedData(grid);
}
});
logForm = createLogForm();
vLayout.setMembers(grid, logForm);
this.widget = vLayout;
}
public ListGrid getGrid() {
return grid;
}
public Canvas getWidget() {
return widget;
}
private void showWindow(Record[] result) {
if (window == null) {
window = new Window();
window.setWidth(600);
window.setHeight(400);
window.setAutoCenter(true);
window.setIsModal(true);
window.addItem(widget);
window.setTitle(i18n.UrnNbnAction_Window_Title());
window.setShowMinimizeButton(false);
window.setShowMaximizeButton(true);
window.setKeepInParentRect(true);
window.setShowModalMask(true);
window.setCanDragResize(true);
}
window.show();
logForm.clearValues();
grid.setData(result);
grid.deselectAllRecords();
if (result != null && result.length > 0) {
INSTANCE.getGrid().selectSingleRecord(result[0]);
}
LinkedHashMap<?, ?> valueMap = ClientUtils.getValueMap(
MetaModelDataSource.getModels(),
MetaModelDataSource.FIELD_PID,
MetaModelDataSource.FIELD_DISPLAY_NAME);
grid.getField(DigitalObjectResourceApi.DIGITALOBJECT_MODEL)
.setValueMap(valueMap);
grid.focus();
}
private DynamicForm createLogForm() {
DynamicForm form = new DynamicForm();
form.setBrowserSpellCheck(false);
form.setCanEdit(false);
form.setWidth100();
form.setHeight("40%");
TextAreaItem textAreaItem = new TextAreaItem(DigitalObjectResourceApi.URNNBN_ITEM_MESSAGE);
textAreaItem.setColSpan("*");
textAreaItem.setHeight("*");
textAreaItem.setWrap(TextAreaWrap.OFF);
textAreaItem.setShowTitle(false);
textAreaItem.setWidth("*");
textAreaItem.setCanEdit(false);
textAreaItem.setEditorValueFormatter(new FormItemValueFormatter() {
@Override
public String formatValue(Object value, Record record, DynamicForm form, FormItem item) {
if (value == null) {
String urnnbn = record.getAttribute(DigitalObjectResourceApi.URNNBN_ITEM_URNNBN);
return urnnbn;
}
return String.valueOf(value);
}
});
form.setItems(textAreaItem);
return form;
}
}
}