package org.orienteer.bpm.component;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.event.Broadcast;
import org.apache.wicket.event.IEvent;
import org.apache.wicket.event.IEventSink;
import org.apache.wicket.markup.html.link.AbstractLink;
import org.apache.wicket.markup.html.link.ResourceLink;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.request.component.IRequestablePage;
import org.apache.wicket.request.resource.AbstractResource;
import org.apache.wicket.request.resource.AbstractResource.ResourceResponse;
import org.apache.wicket.request.resource.IResource.Attributes;
import org.apache.wicket.util.string.Strings;
import org.orienteer.bpm.camunda.handler.ResourceEntityHandler;
import org.orienteer.core.component.AbstractCommandsEnabledPanel;
import org.orienteer.core.component.BootstrapType;
import org.orienteer.core.component.FAIconType;
import org.orienteer.core.component.command.Command;
import org.orienteer.core.component.command.EditCommand;
import org.orienteer.core.component.command.EditODocumentCommand;
import org.orienteer.core.component.command.SaveODocumentCommand;
import org.orienteer.core.component.property.DisplayMode;
import org.orienteer.core.event.ActionPerformedEvent;
import org.orienteer.wicketbpmnio.component.BpmnModeler;
import org.orienteer.wicketbpmnio.component.BpmnViewer;
import com.orientechnologies.orient.core.record.impl.ODocument;
/**
* Panel to view/edit BPMN
*/
public class BpmnPanel extends AbstractCommandsEnabledPanel<ODocument> {
private IModel<ODocument> pdModel;
private IModel<DisplayMode> modeModel;
private IModel<String> xmlModel = new LoadableDetachableModel<String>() {
@Override
protected String load() {
ODocument resource = BpmnPanel.this.getModelObject();
byte[] xmlBytes = resource!=null?(byte[])resource.field("bytes"):null;
return xmlBytes!=null?new String(xmlBytes):null;
}
@Override
public void setObject(String object) {
super.setObject(object);
ODocument resource = BpmnPanel.this.getModelObject();
if(resource!=null) resource.field("bytes", object.getBytes());
};
};
private Component panel;
public BpmnPanel(String id, IModel<ODocument> resourceModel, IModel<ODocument> pdModel, IModel<DisplayMode> modeModel) {
super(id, resourceModel);
setOutputMarkupId(true);
this.pdModel = pdModel;
this.modeModel = modeModel;
addCommand(new EditODocumentCommand(newCommandId(), resourceModel, modeModel));
addCommand(new SaveODocumentCommand(this, modeModel, resourceModel) {
@Override
public void onClick(AjaxRequestTarget target) {
ODocument resource = getModelObject();
if(resource.getIdentity().isNew()) {
ODocument pd = BpmnPanel.this.pdModel.getObject();
String resourceName = pd.field("resourceName");
if(Strings.isEmpty(resourceName)) {
resourceName = pd.field("name")+".bpmn";
pd.field("resourceName", resourceName);
pd.save();
}
resource.field("name", resourceName);
resource.field("deployment", pd.field("deployment"));
}
super.onClick(target);
}
});
addCommand(new Command<ODocument>(newCommandId(), new ResourceModel("command.download")) {
@Override
protected AbstractLink newLink(String id) {
return new ResourceLink<>(id, new AbstractResource() {
@Override
protected ResourceResponse newResourceResponse(Attributes attributes) {
ResourceResponse resourceResponse = new ResourceResponse();
resourceResponse.setContentType("text/xml");
resourceResponse.setFileName((String)BpmnPanel.this.getModelObject().field("name"));
resourceResponse.setWriteCallback(new WriteCallback() {
@Override
public void writeData(Attributes attributes) throws IOException {
OutputStream out = attributes.getResponse().getOutputStream();
out.write((byte[])BpmnPanel.this.getModelObject().field("bytes"));
}
});
return resourceResponse;
}
});
}
@Override
public void onClick() {
//NOP
}
protected void onConfigure() {
setVisible(!BpmnPanel.this.modeModel.getObject().canModify());
setEnabled(BpmnPanel.this.getModelObject()!=null);
};
}.setBootstrapType(BootstrapType.PRIMARY).setIcon(FAIconType.download));
}
@Override
protected void onConfigure() {
DisplayMode mode = modeModel.getObject();
Component panel = get("panel");
if(panel==null
|| ((panel instanceof BpmnViewer) && !DisplayMode.VIEW.equals(mode))
|| ((panel instanceof BpmnModeler) && !DisplayMode.EDIT.equals(mode))) {
panel = DisplayMode.EDIT.equals(mode)
? new BpmnModeler("panel", xmlModel)
: new BpmnViewer("panel", xmlModel);
form.addOrReplace(panel);
}
super.onConfigure();
}
@Override
public void onEvent(IEvent<?> event) {
if(event.getPayload() instanceof ActionPerformedEvent && event.getType().equals(Broadcast.BUBBLE)) {
ActionPerformedEvent<?> apEvent = (ActionPerformedEvent<?>)event.getPayload();
if(apEvent.getCommand()!=null && apEvent.getCommand().isChangingDisplayMode() && apEvent.isAjax()) {
apEvent.getTarget().add(this);
}
}
}
@Override
public void detachModels() {
super.detachModels();
modeModel.detach();
}
}