/*
* Copyright (C) 2012 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.presenter;
import com.google.gwt.place.shared.PlaceController;
import com.smartgwt.client.data.DSCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.rpc.RPCResponse;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Canvas;
import cz.cas.lib.proarc.common.object.model.DatastreamEditorType;
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;
import cz.cas.lib.proarc.webapp.client.ds.MetaModelDataSource.MetaModelRecord;
import cz.cas.lib.proarc.webapp.client.presenter.DigitalObjectEditing.DigitalObjectEditorPlace;
import cz.cas.lib.proarc.webapp.client.widget.NewDigObject;
import cz.cas.lib.proarc.webapp.client.widget.StatusView;
import cz.cas.lib.proarc.webapp.client.widget.Wizard;
import cz.cas.lib.proarc.webapp.client.widget.Wizard.StepKind;
import cz.cas.lib.proarc.webapp.client.widget.Wizard.WizardStep;
import java.util.Map;
import java.util.logging.Logger;
/**
* Creates new digital object.
*
* @author Jan Pokorsky
*/
public final class DigitalObjectCreator {
private static final Logger LOG = Logger.getLogger(DigitalObjectCreator.class.getName());
private final NewDigObjectStep newDigObjectStep;
private final Wizard wizard;
private WizardContext wc;
private final ClientMessages i18n;
private String modelId;
private String parentPid;
private final PlaceController places;
public DigitalObjectCreator(ClientMessages i18n, PlaceController places) {
this.i18n = i18n;
this.places = places;
newDigObjectStep = new NewDigObjectStep();
wizard = new Wizard(i18n, newDigObjectStep, Wizard.emptyStep());
}
public void newObject() {
newObject(null, null);
}
public void newObject(String modelId, String parentPid) {
// bind object editor ui
this.modelId = modelId;
this.parentPid = parentPid;
wizard.setShowButtons(false);
wizard.moveAt(newDigObjectStep);
}
public Canvas getUI() {
return wizard;
}
private void initContext() {
this.wc = new WizardContext();
wc.setParentPid(parentPid);
}
private WizardContext getContext() {
return wc;
}
private static final class WizardContext {
private String pid;
private MetaModelRecord model;
private String parentPid;
private boolean modsInitialized;
private boolean dcInitialized;
public boolean isDcInitialized() {
return dcInitialized;
}
public void setDcInitialized(boolean dcInitialized) {
this.dcInitialized = dcInitialized;
}
public MetaModelRecord getModel() {
return model;
}
public void setModel(MetaModelRecord model) {
this.model = model;
}
public boolean isModsInitialized() {
return modsInitialized;
}
public void setModsInitialized(boolean modsInitialized) {
this.modsInitialized = modsInitialized;
}
public String getParentPid() {
return parentPid;
}
public void setParentPid(String parentPid) {
this.parentPid = parentPid;
}
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
}
private final class NewDigObjectStep implements WizardStep, NewDigObject.Handler {
private NewDigObject newDigObject;
private Wizard wizard;
@Override
public void onShow(Wizard wizard) {
this.wizard = wizard;
initContext();
wizard.setWizardLabel(i18n.DigitalObjectCreator_DescriptionPrefix_Title(),
i18n.DigitalObjectCreator_NewDigObjectStep_Description_Title());
newDigObject.setHandler(this);
newDigObject.bind(modelId, null);
}
@Override
public void onHide(Wizard wizard) {
newDigObject.setHandler(null);
this.wizard = null;
}
@Override
public boolean onStepAction(Wizard wizard, StepKind step) {
if (step == StepKind.FORWARD) {
if (!newDigObject.validate()) {
return false;
}
WizardContext wc = getContext();
MetaModelRecord model = newDigObject.getModel();
wc.setModel(model);
String mods = newDigObject.getMods();
String newPid = newDigObject.getNewPid();
ClientUtils.fine(LOG, "NewDigObjectStep.onStepAction.FORWARD: model: %s pid: %s",
model.getId(), newPid);
saveNewDigitalObject(model.getId(), newPid, mods);
return false;
}
return true;
}
@Override
public void onCreateObject() {
onStepAction(wizard, StepKind.FORWARD);
}
private void saveNewDigitalObject(String modelId, String pid, String mods) {
Record r = new Record();
DigitalObjectDataSource ds = DigitalObjectDataSource.getInstance();
r.setAttribute(DigitalObjectDataSource.FIELD_MODEL, modelId);
if (mods != null) {
r.setAttribute(DigitalObjectDataSource.FIELD_MODS, mods);
}
if (pid != null && !pid.isEmpty()) {
r.setAttribute(DigitalObjectDataSource.FIELD_PID, pid);
}
DSRequest dsRequest = new DSRequest();
dsRequest.setWillHandleError(true);
ds.addData(r, new DSCallback() {
@Override
public void execute(DSResponse response, Object rawData, DSRequest request) {
if (response.getStatus() == RPCResponse.STATUS_VALIDATION_ERROR) {
Map errors = response.getErrors();
newDigObject.setValidationErrors(errors);
request.setWillHandleError(true);
return ;
}
if (response.getHttpResponseCode() >= 400) {
// failure
SC.warn("Failed to create digital object!");
} else {
Record[] data = response.getData();
if (data != null && data.length > 0) {
String pid = data[0].getAttribute(DigitalObjectDataSource.FIELD_PID);
// here should be updated DigitalObject data stream
// caches to prevent server round-trip delays
StatusView.getInstance().show(i18n.DigitalObjectCreator_FinishedStep_Done_Msg());
places.goTo(new DigitalObjectEditorPlace(DatastreamEditorType.MODS, pid));
} else {
SC.warn("Failed to create digital object!");
}
}
}
}, dsRequest);
}
@Override
public Canvas asWidget() {
if (newDigObject == null) {
newDigObject = new NewDigObject(i18n);
}
return newDigObject;
}
}
}