提交 cd2a3495 编写于 作者: T tijsrademakers

Added import to Modeler component

上级 8f1b1f88
......@@ -58,6 +58,7 @@ public class DeleteModelPopupWindow extends PopupWindow implements ModelDataJson
windowLayout.setSpacing(true);
addStyleName(Reindeer.WINDOW_LIGHT);
setModal(true);
setWidth("300px");
center();
setCaption(i18nManager.getMessage(Messages.PROCESS_DELETE_POPUP_CAPTION, modelData.getName()));
......
......@@ -12,8 +12,17 @@
*/
package org.activiti.editor.ui;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.activiti.bpmn.converter.BpmnXMLConverter;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.editor.language.json.converter.BpmnJsonConverter;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.Model;
import org.activiti.explorer.ExplorerApp;
import org.activiti.explorer.I18nManager;
......@@ -22,19 +31,26 @@ import org.activiti.explorer.ui.Images;
import org.activiti.explorer.ui.custom.DetailPanel;
import org.activiti.explorer.ui.form.FormPropertiesForm;
import org.activiti.explorer.ui.mainlayout.ExplorerLayout;
import org.activiti.explorer.ui.process.listener.CopyModelClickListener;
import org.activiti.explorer.ui.process.listener.DeleteModelClickListener;
import org.activiti.explorer.ui.process.listener.DeployProcessDefinitionClickListener;
import org.activiti.explorer.ui.process.listener.EditModelClickListener;
import org.activiti.explorer.ui.process.listener.ExportModelClickListener;
import org.activiti.explorer.ui.process.listener.ImportModelClickListener;
import org.activiti.explorer.ui.process.listener.NewModelClickListener;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.node.ObjectNode;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.terminal.DownloadStream;
import com.vaadin.terminal.FileResource;
import com.vaadin.ui.AbstractSelect.Filtering;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.ComponentContainer;
import com.vaadin.ui.Embedded;
import com.vaadin.ui.GridLayout;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Select;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.themes.Reindeer;
......@@ -47,6 +63,7 @@ import com.vaadin.ui.themes.Reindeer;
public class EditorProcessDefinitionDetailPanel extends DetailPanel {
private static final long serialVersionUID = 1L;
protected static final Logger LOGGER = Logger.getLogger(EditorProcessDefinitionDetailPanel.class.getName());
// Members
protected Model modelData;
......@@ -61,11 +78,10 @@ public class EditorProcessDefinitionDetailPanel extends DetailPanel {
protected HorizontalLayout actionsContainer;
protected Label nameLabel;
protected Button newModelButton;
protected Button deployProcessDefinitionButton;
protected Button exportModelButton;
protected Button importModelButton;
protected Button editModelButton;
protected Button copyModelButton;
protected Button deleteModelButton;
protected Label actionLabel;
protected Select actionSelect;
protected FormPropertiesForm processDefinitionStartForm;
protected EditorProcessDefinitionInfoComponent definitionInfoComponent;
......@@ -106,29 +122,51 @@ public class EditorProcessDefinitionDetailPanel extends DetailPanel {
newModelButton = new Button(i18nManager.getMessage(Messages.PROCESS_NEW));
newModelButton.addListener(new NewModelClickListener());
deployProcessDefinitionButton = new Button(i18nManager.getMessage(Messages.PROCESS_DEPLOY));
deployProcessDefinitionButton.addListener(new DeployProcessDefinitionClickListener(modelData));
exportModelButton = new Button(i18nManager.getMessage(Messages.PROCESS_EXPORT));
exportModelButton.addListener(new ExportModelClickListener(modelData));
importModelButton = new Button(i18nManager.getMessage(Messages.PROCESS_IMPORT));
importModelButton.addListener(new ImportModelClickListener());
editModelButton = new Button(i18nManager.getMessage(Messages.PROCESS_EDIT));
editModelButton.addListener(new EditModelClickListener(modelData.getId()));
copyModelButton = new Button(i18nManager.getMessage(Messages.PROCESS_COPY));
copyModelButton.addListener(new CopyModelClickListener(modelData));
actionLabel = new Label(i18nManager.getMessage(Messages.MODEL_ACTION));
actionLabel.setSizeUndefined();
actionSelect = new Select();
actionSelect.addItem(i18nManager.getMessage(Messages.PROCESS_COPY));
actionSelect.addItem(i18nManager.getMessage(Messages.PROCESS_DELETE));
actionSelect.addItem(i18nManager.getMessage(Messages.PROCESS_DEPLOY));
actionSelect.addItem(i18nManager.getMessage(Messages.PROCESS_EXPORT));
deleteModelButton = new Button(i18nManager.getMessage(Messages.PROCESS_DELETE));
deleteModelButton.addListener(new DeleteModelClickListener(modelData));
actionSelect.setWidth("100px");
actionSelect.setFilteringMode(Filtering.FILTERINGMODE_OFF);
actionSelect.setImmediate(true);
actionSelect.addListener(new ValueChangeListener() {
private static final long serialVersionUID = 1L;
@Override
public void valueChange(ValueChangeEvent event) {
if (i18nManager.getMessage(Messages.PROCESS_COPY).equals(event.getProperty().getValue())) {
ExplorerApp.get().getViewManager().showPopupWindow(new CopyModelPopupWindow(modelData));
} else if (i18nManager.getMessage(Messages.PROCESS_DELETE).equals(event.getProperty().getValue())) {
ExplorerApp.get().getViewManager().showPopupWindow(new DeleteModelPopupWindow(modelData));
} else if (i18nManager.getMessage(Messages.PROCESS_DEPLOY).equals(event.getProperty().getValue())) {
deployModel();
} else if (i18nManager.getMessage(Messages.PROCESS_EXPORT).equals(event.getProperty().getValue())) {
exportModel();
}
}
});
// Clear toolbar and add 'start' button
processDefinitionPage.getToolBar().removeAllButtons();
processDefinitionPage.getToolBar().removeAllAdditionalComponents();
processDefinitionPage.getToolBar().addButton(newModelButton);
processDefinitionPage.getToolBar().addButton(deployProcessDefinitionButton);
processDefinitionPage.getToolBar().addButton(exportModelButton);
processDefinitionPage.getToolBar().addButton(importModelButton);
processDefinitionPage.getToolBar().addButton(editModelButton);
processDefinitionPage.getToolBar().addButton(copyModelButton);
processDefinitionPage.getToolBar().addButton(deleteModelButton);
processDefinitionPage.getToolBar().addAdditionalComponent(actionLabel);
processDefinitionPage.getToolBar().setComponentAlignment(actionLabel, Alignment.MIDDLE_LEFT);
processDefinitionPage.getToolBar().addAdditionalComponent(actionSelect);
processDefinitionPage.getToolBar().setComponentAlignment(actionSelect, Alignment.MIDDLE_RIGHT);
}
......@@ -137,10 +175,6 @@ public class EditorProcessDefinitionDetailPanel extends DetailPanel {
definitionInfoComponent = new EditorProcessDefinitionInfoComponent(modelData);
}
if (deployProcessDefinitionButton != null) {
deployProcessDefinitionButton.setEnabled(true);
}
detailContainer.removeAllComponents();
detailContainer.addComponent(definitionInfoComponent);
}
......@@ -180,4 +214,52 @@ public class EditorProcessDefinitionDetailPanel extends DetailPanel {
emptySpace.setSizeUndefined();
container.addComponent(emptySpace);
}
protected void exportModel() {
final FileResource stream = new FileResource(new File(""), ExplorerApp.get()) {
private static final long serialVersionUID = 1L;
@Override
public DownloadStream getStream() {
DownloadStream ds = null;
try {
BpmnJsonConverter jsonConverter = new BpmnJsonConverter();
JsonNode editorNode = new ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId()));
BpmnModel bpmnModel = jsonConverter.convertToBpmnModel(editorNode);
BpmnXMLConverter xmlConverter = new BpmnXMLConverter();
byte[] bpmnBytes = xmlConverter.convertToXML(bpmnModel);
ByteArrayInputStream in = new ByteArrayInputStream(bpmnBytes);
String filename = bpmnModel.getMainProcess().getId() + ".bpmn20.xml";
ds = new DownloadStream(in, "application/xml", filename);
// Need a file download POPUP
ds.setParameter("Content-Disposition", "attachment; filename=" + filename);
} catch(Exception e) {
LOGGER.log(Level.SEVERE, "failed to export model to BPMN XML", e);
ExplorerApp.get().getNotificationManager().showErrorNotification(Messages.PROCESS_TOXML_FAILED, e);
}
return ds;
}
};
stream.setCacheTime(0);
ExplorerApp.get().getMainWindow().open(stream);
}
protected void deployModel() {
try {
ObjectNode modelNode = (ObjectNode) new ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId()));
BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);
byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);
Deployment deployment = repositoryService.createDeployment().name(modelData.getName())
.addString(modelData.getName() + ".bpmn20.xml", new String(bpmnBytes)).deploy();
ExplorerApp.get().getViewManager().showDeploymentPage(deployment.getId());
} catch(Exception e) {
ExplorerApp.get().getNotificationManager().showErrorNotification(Messages.PROCESS_TOXML_FAILED, e);
}
}
}
......@@ -19,6 +19,7 @@ import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Model;
import org.activiti.explorer.ExplorerApp;
import org.activiti.explorer.Messages;
import org.activiti.explorer.navigation.ProcessModelNavigator;
import org.activiti.explorer.navigation.UriFragment;
import org.activiti.explorer.ui.AbstractTablePage;
......@@ -26,11 +27,14 @@ import org.activiti.explorer.ui.Images;
import org.activiti.explorer.ui.custom.ToolBar;
import org.activiti.explorer.ui.mainlayout.ExplorerLayout;
import org.activiti.explorer.ui.process.ProcessMenuBar;
import org.activiti.explorer.ui.process.listener.ImportModelClickListener;
import org.activiti.explorer.ui.process.listener.NewModelClickListener;
import org.activiti.explorer.ui.util.ThemeImageColumnGenerator;
import com.vaadin.data.Item;
import com.vaadin.data.Property;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.ui.Button;
import com.vaadin.ui.Table;
......@@ -73,7 +77,14 @@ public class EditorProcessDefinitionPage extends AbstractTablePage {
@Override
protected ToolBar createMenuBar() {
return new ProcessMenuBar();
ProcessMenuBar menuBar = new ProcessMenuBar();
Button newModelButton = new Button(ExplorerApp.get().getI18nManager().getMessage(Messages.PROCESS_NEW));
newModelButton.addListener(new NewModelClickListener());
menuBar.addButton(newModelButton);
Button importModelButton = new Button(ExplorerApp.get().getI18nManager().getMessage(Messages.PROCESS_IMPORT));
importModelButton.addListener(new ImportModelClickListener());
menuBar.addButton(importModelButton);
return menuBar;
}
@Override
......
/* 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 org.activiti.editor.ui;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import org.activiti.bpmn.converter.BpmnXMLConverter;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.editor.constants.ModelDataJsonConstants;
import org.activiti.editor.language.json.converter.BpmnJsonConverter;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Model;
import org.activiti.explorer.ExplorerApp;
import org.activiti.explorer.I18nManager;
import org.activiti.explorer.Messages;
import org.activiti.explorer.NotificationManager;
import org.activiti.explorer.ViewManager;
import org.apache.commons.lang.StringUtils;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.node.ObjectNode;
import com.vaadin.ui.Upload.FinishedEvent;
import com.vaadin.ui.Upload.FinishedListener;
import com.vaadin.ui.Upload.Receiver;
/**
* @author Tijs Rademakers
*/
public class ImportUploadReceiver implements Receiver, FinishedListener, ModelDataJsonConstants {
private static final long serialVersionUID = 1L;
protected RepositoryService repositoryService;
protected I18nManager i18nManager;
protected NotificationManager notificationManager;
protected ViewManager viewManager;
// Will be assigned during upload
protected ByteArrayOutputStream outputStream;
protected String fileName;
// Will be assigned after deployment
protected boolean validFile = false;
protected Model modelData;
public ImportUploadReceiver() {
this.repositoryService = ProcessEngines.getDefaultProcessEngine().getRepositoryService();
this.i18nManager = ExplorerApp.get().getI18nManager();
this.notificationManager = ExplorerApp.get().getNotificationManager();
this.viewManager = ExplorerApp.get().getViewManager();
}
public OutputStream receiveUpload(String filename, String mimeType) {
this.fileName = filename;
this.outputStream = new ByteArrayOutputStream();
return outputStream;
}
public void uploadFinished(FinishedEvent event) {
deployUploadedFile();
if (validFile) {
showUploadedDeployment();
}
}
protected void deployUploadedFile() {
try {
try {
if (fileName.endsWith(".bpmn20.xml") || fileName.endsWith(".bpmn")) {
validFile = true;
BpmnXMLConverter xmlConverter = new BpmnXMLConverter();
XMLInputFactory xif = XMLInputFactory.newInstance();
InputStreamReader in = new InputStreamReader(new ByteArrayInputStream(outputStream.toByteArray()), "UTF-8");
XMLStreamReader xtr = xif.createXMLStreamReader(in);
BpmnModel bpmnModel = new BpmnXMLConverter().convertToBpmnModel(xtr);
xmlConverter.convertToBpmnModel(xtr);
if (bpmnModel.getMainProcess() == null || bpmnModel.getMainProcess().getId() == null) {
notificationManager.showErrorNotification(Messages.MODEL_IMPORT_FAILED,
i18nManager.getMessage(Messages.MODEL_IMPORT_INVALID_BPMN_EXPLANATION));
} else {
if (bpmnModel.getLocationMap().size() == 0) {
notificationManager.showErrorNotification(Messages.MODEL_IMPORT_INVALID_BPMNDI,
i18nManager.getMessage(Messages.MODEL_IMPORT_INVALID_BPMNDI_EXPLANATION));
} else {
String processName = null;
if (StringUtils.isNotEmpty(bpmnModel.getMainProcess().getName())) {
processName = bpmnModel.getMainProcess().getName();
} else {
processName = bpmnModel.getMainProcess().getId();
}
modelData = repositoryService.newModel();
ObjectNode modelObjectNode = new ObjectMapper().createObjectNode();
modelObjectNode.put(MODEL_NAME, processName);
modelObjectNode.put(MODEL_REVISION, 1);
modelData.setMetaInfo(modelObjectNode.toString());
modelData.setName(processName);
repositoryService.saveModel(modelData);
BpmnJsonConverter jsonConverter = new BpmnJsonConverter();
ObjectNode editorNode = jsonConverter.convertToJson(bpmnModel);
repositoryService.addModelEditorSource(modelData.getId(), editorNode.toString().getBytes("utf-8"));
}
}
} else {
notificationManager.showErrorNotification(Messages.MODEL_IMPORT_INVALID_FILE,
i18nManager.getMessage(Messages.MODEL_IMPORT_INVALID_FILE_EXPLANATION));
}
} catch (Exception e) {
String errorMsg = e.getMessage().replace(System.getProperty("line.separator"), "<br/>");
notificationManager.showErrorNotification(Messages.MODEL_IMPORT_FAILED, errorMsg);
}
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
notificationManager.showErrorNotification("Server-side error", e.getMessage());
}
}
}
}
protected void showUploadedDeployment() {
viewManager.showEditorProcessDefinitionPage(modelData.getId());
}
}
......@@ -148,6 +148,7 @@ public class NewModelPopupWindow extends PopupWindow implements ModelDataJsonCon
}
modelObjectNode.put(MODEL_DESCRIPTION, description);
modelData.setMetaInfo(modelObjectNode.toString());
modelData.setName((String) nameTextField.getValue());
repositoryService.saveModel(modelData);
......
......@@ -201,6 +201,7 @@ public interface Messages {
static final String PROCESS_EDIT = "process.edit";
static final String PROCESS_COPY = "process.copy";
static final String PROCESS_NEW = "process.new";
static final String PROCESS_IMPORT = "process.import";
static final String PROCESS_DELETE = "process.delete";
static final String PROCESS_DEPLOY = "process.deploy";
static final String PROCESS_ACTIVATE = "process.activate";
......@@ -293,6 +294,18 @@ public interface Messages {
static final String DEPLOYMENT_DELETE_POPUP_WARNING = "deployment.delete.popup.warning";
static final String DEPLOYMENT_DELETE_POPUP_DELETE_BUTTON = "deployment.delete.popup.delete.button";
// Import to model workspace
static final String MODEL_IMPORT = "model.import";
static final String MODEL_IMPORT_DESCRIPTION = "model.import.description";
static final String MODEL_IMPORT_FAILED = "model.import.failed";
static final String MODEL_IMPORT_INVALID_FILE = "model.import.invalid.file";
static final String MODEL_IMPORT_INVALID_FILE_EXPLANATION = "model.import.invalid.file.explanation";
static final String MODEL_IMPORT_INVALID_BPMNDI = "model.import.invalid.bpmndi";
static final String MODEL_IMPORT_INVALID_BPMNDI_EXPLANATION = "model.import.invalid.bpmndi.explanation";
static final String MODEL_IMPORT_INVALID_BPMN_EXPLANATION = "model.import.invalid.bpmn.explanation";
static final String MODEL_ACTION = "model.action";
// Database page
static final String DATABASE_NO_ROWS = "database.no.rows";
......
/* 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 org.activiti.explorer.ui.custom;
import java.util.ArrayList;
import java.util.List;
import org.activiti.explorer.ExplorerApp;
import org.activiti.explorer.I18nManager;
import org.activiti.explorer.Messages;
import org.activiti.explorer.NotificationManager;
import org.activiti.explorer.ui.mainlayout.ExplorerLayout;
import com.vaadin.event.dd.acceptcriteria.AcceptAll;
import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Label;
import com.vaadin.ui.ProgressIndicator;
import com.vaadin.ui.Upload;
import com.vaadin.ui.Upload.FailedEvent;
import com.vaadin.ui.Upload.FailedListener;
import com.vaadin.ui.Upload.FinishedEvent;
import com.vaadin.ui.Upload.FinishedListener;
import com.vaadin.ui.Upload.ProgressListener;
import com.vaadin.ui.Upload.Receiver;
import com.vaadin.ui.Upload.StartedEvent;
import com.vaadin.ui.Upload.StartedListener;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.themes.Reindeer;
/**
* Component that can be used to upload files using file-select
*
* @author Joram Barrez
* @author Frederik Heremans
*/
public class ImportComponent extends VerticalLayout implements StartedListener, FinishedListener,
FailedListener, ProgressListener {
private static final long serialVersionUID = 1L;
// Services
protected I18nManager i18nManager;
protected NotificationManager notificationManager;
// Ui components
protected ProgressIndicator progressIndicator;
protected Upload upload;
protected Receiver receiver;
// Additional listeners can be attached to the upload components
protected List<FinishedListener> finishedListeners = new ArrayList<FinishedListener>();
protected List<StartedListener> startedListeners = new ArrayList<StartedListener>();
protected boolean showGenericFailureMessage = true;
protected List<FailedListener> failedListeners = new ArrayList<FailedListener>();
protected List<ProgressListener> progressListeners = new ArrayList<ProgressListener>();
public ImportComponent(String description, Receiver receiver) {
this.receiver = receiver;
this.i18nManager = ExplorerApp.get().getI18nManager();
this.notificationManager = ExplorerApp.get().getNotificationManager();
init(description);
}
// UI initialisation ----------------------------------------------------------------------------
protected void init(String description) {
setSpacing(true);
setSizeFull();
addDescription(description);
addUpload();
}
protected void addDescription(String description) {
if(description != null) {
Label descriptionLabel = new Label(description);
descriptionLabel.addStyleName(Reindeer.LABEL_SMALL);
descriptionLabel.addStyleName(ExplorerLayout.STYLE_DEPLOYMENT_UPLOAD_DESCRIPTION);
addComponent(descriptionLabel);
}
}
protected void addUpload() {
this.upload = new Upload(null, receiver);
upload.setButtonCaption(i18nManager.getMessage(Messages.UPLOAD_SELECT));
upload.setImmediate(true);
addComponent(upload);
setComponentAlignment(upload, Alignment.MIDDLE_CENTER);
// register ourselves as listener for upload events
upload.addListener((StartedListener) this);
upload.addListener((FailedListener) this);
upload.addListener((FinishedListener) this);
upload.addListener((ProgressListener) this);
}
// File upload event handling -------------------------------------------------------------------
public void uploadStarted(StartedEvent event) {
removeAllComponents(); // Visible components are replaced by a progress bar
this.progressIndicator = new ProgressIndicator();
progressIndicator.setPollingInterval(500);
addComponent(progressIndicator);
setComponentAlignment(progressIndicator, Alignment.MIDDLE_CENTER);
for (StartedListener startedListener : startedListeners) {
startedListener.uploadStarted(event);
}
}
public void updateProgress(long readBytes, long contentLength) {
progressIndicator.setValue(new Float(readBytes / (float) contentLength));
for (ProgressListener progressListener : progressListeners) {
progressListener.updateProgress(readBytes, contentLength);
}
}
public void uploadFinished(FinishedEvent event) {
// Hide progress indicator
progressIndicator.setVisible(false);
for (FinishedListener finishedListener : finishedListeners) {
finishedListener.uploadFinished(event);
}
}
public void uploadFailed(FailedEvent event) {
for (FailedListener failedListener : failedListeners) {
failedListener.uploadFailed(event);
}
}
public AcceptCriterion getAcceptCriterion() {
return AcceptAll.get();
}
// Upload Listeners ----------------------------------------------------------------------------
public void addFinishedListener(FinishedListener finishedListener) {
finishedListeners.add(finishedListener);
}
public void addStartedListener(StartedListener startedListener) {
startedListeners.add(startedListener);
}
public void addFailedListener(FailedListener failedListener) {
failedListeners.add(failedListener);
}
public void addProgressListener(ProgressListener progressListener) {
progressListeners.add(progressListener);
}
}
/* 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 org.activiti.explorer.ui.custom;
import org.activiti.explorer.ExplorerApp;
import org.activiti.explorer.I18nManager;
import com.vaadin.ui.Upload.FailedListener;
import com.vaadin.ui.Upload.FinishedEvent;
import com.vaadin.ui.Upload.FinishedListener;
import com.vaadin.ui.Upload.ProgressListener;
import com.vaadin.ui.Upload.Receiver;
import com.vaadin.ui.Upload.StartedListener;
import com.vaadin.ui.themes.Reindeer;
/**
* @author Tijs Rademakers
*/
public class ImportPopupWindow extends PopupWindow {
private static final long serialVersionUID = 1L;
// Services
protected I18nManager i18nManager;
protected ImportComponent importComponent;
public ImportPopupWindow(String caption, String description, Receiver receiver) {
this.i18nManager = ExplorerApp.get().getI18nManager();
init(caption, description, receiver);
importComponent.addFinishedListener(new FinishedListener() {
private static final long serialVersionUID = 1L;
public void uploadFinished(FinishedEvent event) {
close();
}
});
}
// UI initialisation ----------------------------------------------------------------------------
protected void init(String caption, String description, Receiver receiver) {
importComponent = new ImportComponent(description, receiver);
importComponent.setSizeFull();
initWindow(caption);
}
protected void initWindow(String caption) {
// Fixed width/height since otherwise the layout can be screwed by the drag and drop
setWidth("300px");
setHeight("200px");
addStyleName(Reindeer.WINDOW_LIGHT);
setModal(true);
center();
setCaption(caption);
setContent(importComponent);
}
// Upload Listeners ----------------------------------------------------------------------------
public void addFinishedListener(FinishedListener finishedListener) {
importComponent.addFinishedListener(finishedListener);
}
public void addStartedListener(StartedListener startedListener) {
importComponent.addStartedListener(startedListener);
}
public void addFailedListener(FailedListener failedListener) {
importComponent.addFailedListener(failedListener);
}
public void addProgressListener(ProgressListener progressListener) {
importComponent.addProgressListener(progressListener);
}
}
......@@ -23,6 +23,7 @@ import org.activiti.explorer.ui.mainlayout.ExplorerLayout;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
......@@ -39,10 +40,12 @@ public class ToolBar extends HorizontalLayout {
protected Map<String, ToolbarEntry> entryMap;
protected ToolbarEntry currentEntry;
protected List<Button> actionButtons;
protected List<Component> additionalComponents;
public ToolBar() {
entryMap = new HashMap<String, ToolbarEntry>();
actionButtons = new ArrayList<Button>();
additionalComponents = new ArrayList<Component>();
setWidth("100%");
setHeight(36, UNITS_PIXELS);
......@@ -110,6 +113,17 @@ public class ToolBar extends HorizontalLayout {
}
}
public void addAdditionalComponent(Component component) {
additionalComponents.add(component);
addComponent(component);
}
public void removeAllAdditionalComponents() {
for(Component c : additionalComponents) {
removeComponent(c);
}
}
public long getCount(String key) {
ToolbarEntry toolbarEntry = entryMap.get(key);
if(toolbarEntry == null) {
......
package org.activiti.explorer.ui.process.listener;
import org.activiti.editor.ui.CopyModelPopupWindow;
import org.activiti.engine.repository.Model;
import org.activiti.explorer.ExplorerApp;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
/**
* @author Tijs Rademakers
*/
public class CopyModelClickListener implements ClickListener {
private static final long serialVersionUID = 1L;
private Model modelData;
public CopyModelClickListener(Model model) {
this.modelData = model;
}
public void buttonClick(ClickEvent event) {
ExplorerApp.get().getViewManager().showPopupWindow(new CopyModelPopupWindow(modelData));
}
}
/* 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 org.activiti.explorer.ui.process.listener;
import org.activiti.bpmn.converter.BpmnXMLConverter;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.editor.language.json.converter.BpmnJsonConverter;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.Model;
import org.activiti.explorer.ExplorerApp;
import org.activiti.explorer.Messages;
import org.activiti.explorer.NotificationManager;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.node.ObjectNode;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
/**
* @author Tijs Rademakers
*/
public class DeployProcessDefinitionClickListener implements ClickListener {
private static final long serialVersionUID = 1L;
protected RepositoryService repositoryService;
protected NotificationManager notificationManager;
protected Model modelData;
public DeployProcessDefinitionClickListener(Model model) {
this.repositoryService = ProcessEngines.getDefaultProcessEngine().getRepositoryService();
this.notificationManager = ExplorerApp.get().getNotificationManager();
this.modelData = model;
}
public void buttonClick(ClickEvent event) {
try {
ObjectNode modelNode = (ObjectNode) new ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId()));
BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);
byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);
Deployment deployment = repositoryService.createDeployment().name(modelData.getName())
.addString(modelData.getName() + ".bpmn20.xml", new String(bpmnBytes)).deploy();
ExplorerApp.get().getViewManager().showDeploymentPage(deployment.getId());
} catch(Exception e) {
notificationManager.showErrorNotification(Messages.PROCESS_TOXML_FAILED, e);
}
}
}
/* 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 org.activiti.explorer.ui.process.listener;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.activiti.bpmn.converter.BpmnXMLConverter;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.editor.language.json.converter.BpmnJsonConverter;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Model;
import org.activiti.explorer.ExplorerApp;
import org.activiti.explorer.Messages;
import org.activiti.explorer.NotificationManager;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import com.vaadin.terminal.DownloadStream;
import com.vaadin.terminal.FileResource;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
/**
* @author Tijs Rademakers
*/
public class ExportModelClickListener implements ClickListener {
private static final long serialVersionUID = 1L;
protected static final Logger LOGGER = Logger.getLogger(ExportModelClickListener.class.getName());
protected RepositoryService repositoryService;
protected NotificationManager notificationManager;
protected Model modelData;
public ExportModelClickListener(Model model) {
this.repositoryService = ProcessEngines.getDefaultProcessEngine().getRepositoryService();
this.notificationManager = ExplorerApp.get().getNotificationManager();
this.modelData = model;
}
public void buttonClick(ClickEvent event) {
final FileResource stream = new FileResource(new File(""), ExplorerApp.get()) {
private static final long serialVersionUID = 1L;
@Override
public DownloadStream getStream() {
DownloadStream ds = null;
try {
BpmnJsonConverter jsonConverter = new BpmnJsonConverter();
JsonNode editorNode = new ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId()));
BpmnModel bpmnModel = jsonConverter.convertToBpmnModel(editorNode);
BpmnXMLConverter xmlConverter = new BpmnXMLConverter();
byte[] bpmnBytes = xmlConverter.convertToXML(bpmnModel);
ByteArrayInputStream in = new ByteArrayInputStream(bpmnBytes);
String filename = bpmnModel.getMainProcess().getId() + ".bpmn20.xml";
ds = new DownloadStream(in, "application/xml", filename);
// Need a file download POPUP
ds.setParameter("Content-Disposition", "attachment; filename=" + filename);
} catch(Exception e) {
LOGGER.log(Level.SEVERE, "failed to export model to BPMN XML", e);
notificationManager.showErrorNotification(Messages.PROCESS_TOXML_FAILED, e);
}
return ds;
}
};
stream.setCacheTime(0);
ExplorerApp.get().getMainWindow().open(stream);
}
}
package org.activiti.explorer.ui.process.listener;
import org.activiti.editor.ui.DeleteModelPopupWindow;
import org.activiti.engine.repository.Model;
import org.activiti.editor.ui.ImportUploadReceiver;
import org.activiti.explorer.ExplorerApp;
import org.activiti.explorer.Messages;
import org.activiti.explorer.ui.custom.ImportPopupWindow;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
......@@ -11,17 +12,17 @@ import com.vaadin.ui.Button.ClickListener;
/**
* @author Tijs Rademakers
*/
public class DeleteModelClickListener implements ClickListener {
public class ImportModelClickListener implements ClickListener {
private static final long serialVersionUID = 1L;
protected Model modelData;
public DeleteModelClickListener(Model model) {
this.modelData = model;
}
public void buttonClick(ClickEvent event) {
ExplorerApp.get().getViewManager().showPopupWindow(new DeleteModelPopupWindow(modelData));
ImportUploadReceiver receiver = new ImportUploadReceiver();
ImportPopupWindow importPopupWindow = new ImportPopupWindow(
ExplorerApp.get().getI18nManager().getMessage(Messages.MODEL_IMPORT),
ExplorerApp.get().getI18nManager().getMessage(Messages.MODEL_IMPORT_DESCRIPTION), receiver);
importPopupWindow.addFinishedListener(receiver);
ExplorerApp.get().getViewManager().showPopupWindow(importPopupWindow);
}
}
......@@ -180,10 +180,11 @@ process.header.suspension.state = Suspension state changes
process.scheduled.suspend = This process definition is scheduled to be <b>suspended on {0}</b>
process.scheduled.activate = This process definition is scheduled to be <b>activated on {0}</b>
process.start = Start process
process.edit = Edit model
process.edit = Edit
process.copy = Copy model
process.delete = Delete model
process.new = New model
process.import = Import
process.deploy = Deploy
process.activate = Activate
process.activate.popup = Activate process definition
......@@ -196,7 +197,7 @@ process.suspend.popup.time.now = now
process.suspend.popup.time.date = on
process.suspend.popup.process.instances.description = Also suspend all process instances for this process definition
process.convert = Convert to editable model
process.export = Export to BPMN 2.0
process.export = Export model
process.toxml.failed = Create of BPMN XML failed
process.instance.delete = Delete
process.instance.delete.popup.title = Delete process instance {0}?
......@@ -263,10 +264,10 @@ deployment.create.time = Deployed
deployment.header.definitions = Process Definitions
deployment.header.resources = Resources
deployment.upload = Upload new deployment
deployment.upload.description = Select a file (.bar, .zip or .bpmn20.xml) or drop a file in the rectangle below.
deployment.upload.description = Select a file (.bar, .zip, .bpmn or .bpmn20.xml) or drop a file in the rectangle below.
deployment.upload.failed = Deployment failed
deployment.upload.invalid.file = Could not upload file
deployment.upload.invalid.file.explanation = Only .bar, .zip and .bpmn20.xml files are supported
deployment.upload.invalid.file.explanation = Only .bar, .zip, .bpmn and .bpmn20.xml files are supported
deployment.upload.server.error = Server-side error ...
deployment.deploy.time=Deployed {0}
deployment.no.name=(Nameless deployment)
......@@ -275,6 +276,18 @@ deployment.delete.popup.caption = Delete deployment {0}?
deployment.delete.popup.warning = Found <b>{0} running process instances</b> for this deployment.<br/>Are you sure you want to go ahead?
deployment.delete.popup.delete.button = Delete deployment
# Import to model workspace
model.import = Import a model
model.import.description = Select a file (.bpmn20.xml or .bpmn) with BPMN DI information.
model.import.failed = Import failed
model.import.invalid.file = Could not import file
model.import.invalid.file.explanation = Only .bpmn or .bpmn20.xml files are supported
model.import.invalid.bpmndi = Could not find BPMN DI
model.import.invalid.bpmndi.explanation = Make sure that the file contains BPMN DI information
model.import.invalid.bpmn.explanation = Make sure that the file contains valid BPMN
model.action = Model action:
# Database page
database.no.rows = Table contains no rows.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册