参考:
http://am-wj.iteye.com/blog/432188,基本解决问题,比在eclipse.ini里加-Dfile.encoding=UTF-8效果好,基本没有副作用(console不会变乱码了)
修改org.jboss.tools.flow.jpdl4.source_4.3.0.v201007071649.jar里的JpdlSerializer.java文件
修改org.jboss.tools.jbpm.common.source_4.3.0.v201007071649.jar里的JbpmLocationsPage.java文件
/*
* JBoss, Home of Professional Open Source
* Copyright 2005, JBoss Inc., and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.tools.jbpm.preferences;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.jboss.tools.jbpm.Activator;
import org.jboss.tools.jbpm.Constants;
import org.jboss.tools.jbpm.util.AutoResizeTableLayout;
public class JbpmLocationsPage extends PreferencePage implements IWorkbenchPreferencePage {
private TableViewer tableViewer;
private Button addButton, editButton, removeButton;
private Text encode; // 编码问题
public JbpmLocationsPage() {
super();
setPreferenceStore(Activator.getDefault().getPreferenceStore());
}
protected AddJbpmInstallationDialog createAddJbpmInstallationDialog(Shell shell) {
return new AddJbpmInstallationDialog(shell, Activator.getDefault());
}
protected Control createContents(Composite parent) {
Composite clientArea = createClientArea(parent);
createLabels(clientArea);
createJbpmHomeListTable(clientArea);
createButtons(clientArea);
createEncodeContent(parent); // 编码问题
return null;
}
private void createButtons(Composite parent) {
GridData gridData = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false);
gridData.widthHint = 80;
addButton = new Button(parent, SWT.PUSH);
addButton.setText("新增...");
// addButton.setText("Add...");
addButton.setLayoutData(gridData);
addButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
addNewLocation();
}
});
editButton = new Button(parent, SWT.PUSH);
editButton.setText("编辑...");
// editButton.setText("Edit...");
editButton.setLayoutData(gridData);
editButton.setEnabled(false);
editButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
editLocation();
}
});
removeButton = new Button(parent, SWT.PUSH);
removeButton.setText("删除");
// removeButton.setText("Remove");
removeButton.setLayoutData(gridData);
removeButton.setEnabled(false);
removeButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
removeLocation();
}
});
}
private void removeLocation() {
TableItem item = tableViewer.getTable().getSelection()[0];
String name = item.getText(0);
PreferencesManager inputManager = (PreferencesManager) tableViewer.getInput();
JbpmInstallation installation = inputManager.getJbpmInstallation(name);
inputManager.getJbpmInstallationMap().remove(name);
tableViewer.remove(installation);
updateButtons();
updateStatus();
}
private void editLocation() {
TableItem item = tableViewer.getTable().getSelection()[0];
String name = item.getText(0);
PreferencesManager inputManager = (PreferencesManager) tableViewer.getInput();
JbpmInstallation jbpmInstallation = inputManager.getJbpmInstallation(name);
AddJbpmInstallationDialog dialog = createAddJbpmInstallationDialog(getShell());
dialog.initialize("编辑", jbpmInstallation.name, jbpmInstallation.location);
// dialog.initialize("Edit Location", jbpmInstallation.name, jbpmInstallation.location);
if (dialog.open() == IDialogConstants.OK_ID) {
jbpmInstallation.name = dialog.getName();
jbpmInstallation.version = dialog.getVersion();
jbpmInstallation.location = dialog.getLocation();
tableViewer.update(jbpmInstallation, null);
if (name != dialog.getName()) {
inputManager.getJbpmInstallationMap().remove(name);
inputManager.getJbpmInstallationMap().put(dialog.getName(), jbpmInstallation);
}
}
updateButtons();
}
private void addNewLocation() {
AddJbpmInstallationDialog dialog = createAddJbpmInstallationDialog(getShell());
dialog.initialize("新增", "", "");
// dialog.initialize("Add Location", "", "");
if (dialog.open() == IDialogConstants.OK_ID) {
PreferencesManager inputManager = (PreferencesManager) tableViewer.getInput();
JbpmInstallation jbpmInstallation = getJbpmInstallation(dialog);
inputManager.getJbpmInstallationMap().put(jbpmInstallation.name, jbpmInstallation);
tableViewer.add(jbpmInstallation);
}
updateButtons();
}
private JbpmInstallation getJbpmInstallation(AddJbpmInstallationDialog dialog) {
JbpmInstallation jbpmInstallation = new JbpmInstallation();
jbpmInstallation.name = dialog.getName();
jbpmInstallation.location = dialog.getLocation();
jbpmInstallation.version = dialog.getVersion();
return jbpmInstallation;
}
private Composite createClientArea(Composite parent) {
Composite clientArea = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
clientArea.setLayout(layout);
GridData gridData = new GridData(GridData.FILL_BOTH);
clientArea.setLayoutData(gridData);
return clientArea;
}
public void init(IWorkbench workbench) {
}
private void createJbpmHomeListTable(Composite parent) {
tableViewer = new TableViewer(parent, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION | SWT.CHECK);
tableViewer.setContentProvider(new JbpmInstallationTableContentProvider());
tableViewer.setLabelProvider(new JbpmInstallationLabelProvider());
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.verticalSpan = 3;
gridData.heightHint = 200;
tableViewer.getControl().setLayoutData(gridData);
initializeTable(tableViewer);
createTableColumns(tableViewer);
initializeInput(tableViewer);
}
private void initializeInput(TableViewer viewer) {
viewer.setInput(PreferencesManager.getInstance());
checkItemToCheck(viewer);
}
private void checkItemToCheck(TableViewer viewer) {
String name = Activator.getDefault().getPreferenceStore().getString(Constants.JBPM_NAME);
if (name != null) {
TableItem tableItem = getItemToCheck(viewer, name);
if (tableItem != null) {
tableItem.setChecked(true);
}
}
}
private TableItem getItemToCheck(TableViewer viewer, String name) {
TableItem[] items = viewer.getTable().getItems();
for (int i = 0; i < items.length; i++) {
if (name.equals(items[i].getText(0)))
return items[i];
}
return null;
}
private void createTableColumns(TableViewer viewer) {
Table table = viewer.getTable();
TableColumn nameColumn = new TableColumn(table, SWT.LEFT);
nameColumn.setText("名称");
// nameColumn.setText("Name");
ColumnWeightData nameColumnData = new ColumnWeightData(30);
AutoResizeTableLayout layout = (AutoResizeTableLayout) table.getLayout();
layout.addColumnData(nameColumnData);
TableColumn locationColumn = new TableColumn(table, SWT.LEFT);
locationColumn.setText("位置");
// locationColumn.setText("Location");
ColumnWeightData locationColumnData = new ColumnWeightData(70);
layout.addColumnData(locationColumnData);
}
private void initializeTable(TableViewer viewer) {
Table table = viewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
table.setLayout(new AutoResizeTableLayout(table));
table.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
updateSelection(e);
}
});
}
private void updateSelection(SelectionEvent e) {
if (e.detail == SWT.CHECK) {
updateChecks(e);
} else {
updateButtons();
}
updateStatus();
}
private void updateChecks(SelectionEvent e) {
Table table = tableViewer.getTable();
TableItem[] items = table.getItems();
for (int i = 0; i < items.length; i++) {
if (e.item != items[i]) {
items[i].setChecked(false);
}
}
}
private void updateStatus() {
TableItem item = getCheckedItem();
if (item != null) {
setErrorMessage(null);
setValid(true);
} else {
setErrorMessage("选择一个缺省的jBPM安装 ");
// setErrorMessage("Select a default jBPM installation.");
setValid(false);
}
}
private TableItem getCheckedItem() {
TableItem[] items = tableViewer.getTable().getItems();
for (int i = 0; i < items.length; i++) {
if (items[i].getChecked()) {
return items[i];
}
}
return null;
}
private void updateButtons() {
Table table = tableViewer.getTable();
TableItem[] selection = table.getSelection();
editButton.setEnabled(selection.length == 1);
removeButton.setEnabled(selection.length == 1 && table.getItemCount() > 1);
}
private void createLabels(Composite parent) {
GridData infoLabelGridData = new GridData(GridData.FILL_HORIZONTAL);
infoLabelGridData.horizontalSpan = 2;
Label infoLabel = new Label(parent, SWT.NONE);
infoLabel.setText("新增,删除或者编辑JBoss jBPM安装位置.\n选中的安装位置将在jBPM向导中使用.");
// infoLabel.setText("Add, remove or edit JBoss jBPM installation locations.\n"
// + "The checked location will be used by the jBPM creation wizards.");
infoLabel.setLayoutData(infoLabelGridData);
GridData tableLabelGridData = new GridData(SWT.BEGINNING, SWT.END, false, false);
tableLabelGridData.horizontalSpan = 2;
Label tableLabel = new Label(parent, SWT.NONE);
tableLabel.setText("jBPM安装位置:");
// tableLabel.setText("jBPM Installation Locations:");
tableLabel.setLayoutData(tableLabelGridData);
}
public boolean performOk() {
String name = "";
PreferencesManager inputManager = (PreferencesManager) tableViewer.getInput();
inputManager.saveInstallations();
TableItem item = getCheckedItem(tableViewer);
if (item != null) {
name = item.getText(0);
}
Activator.getDefault().getPreferenceStore().setValue(Constants.JBPM_NAME, name);
Activator.getDefault().getPreferenceStore().setValue("encode", encode.getText()); // 编码问题
return true;
}
private TableItem getCheckedItem(TableViewer viewer) {
TableItem[] items = viewer.getTable().getItems();
for (int i = 0; i < items.length; i++) {
if (items[i].getChecked())
return items[i];
}
return null;
}
public void performDefaults() {
Activator.getDefault().getPreferenceStore().setToDefault(Constants.JBPM_NAME);
PreferencesManager inputManager = (PreferencesManager) tableViewer.getInput();
inputManager.getJbpmInstallationMap().clear();
tableViewer.setInput(inputManager);
checkItemToCheck(tableViewer);
setMessage("");
updateButtons();
setValid(true);
initEncode(); // 编码问题
}
// 编码问题
private void createEncodeContent(Composite parent) {
Composite clientArea = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
clientArea.setLayout(layout);
Label encodeLabel = new Label(clientArea, SWT.NONE);
encodeLabel.setText("字符集 : ");
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
encode = new Text(clientArea, SWT.SINGLE | SWT.BORDER);
encode.setLayoutData(gridData);
initEncode();
}
// 编码问题
private void initEncode() {
String encodeValue = Activator.getDefault().getPreferenceStore().getString("encode");
if (encodeValue == null || encodeValue == "")
encodeValue = "UTF-8";
encode.setText(encodeValue);
}
}
修改org.jboss.tools.flow.jpdl4.source_4.3.0.v201007071649.jar里的JpdlSerializer.java文件
package org.jboss.tools.flow.jpdl4.io;
import java.io.IOException;
import java.io.OutputStream;
import org.jboss.tools.flow.common.wrapper.Wrapper;
public class JpdlSerializer {
public static void serialize(Wrapper wrapper, OutputStream os) throws IOException {
// StringBuffer buffer = new StringBuffer();
// serialize(wrapper, buffer, 0);
// Writer writer = new OutputStreamWriter(os, "UTF-8");
// writer.write(buffer.toString());
// writer.close();
// 编码问题
StringBuffer buffer = new StringBuffer();
serialize(wrapper, buffer, 0);
String s = new String(buffer.toString().getBytes(), "GBK");
os.write(s.getBytes());
}
public static void serialize(Wrapper wrapper, StringBuffer buffer, int level) {
ElementSerializer elementSerializer = Registry.getElementSerializer(wrapper.getElement());
if (elementSerializer != null) {
elementSerializer.appendToBuffer(buffer, wrapper, level);
}
}
}
修改ProcessSerializer.java文件
/**
*
*/
package org.jboss.tools.flow.jpdl4.io;
import java.util.ArrayList;
import java.util.List;
import org.jboss.tools.flow.common.model.Element;
import org.jboss.tools.flow.common.wrapper.ContainerWrapper;
import org.jboss.tools.flow.common.wrapper.FlowWrapper;
import org.jboss.tools.flow.common.wrapper.NodeWrapper;
import org.jboss.tools.flow.common.wrapper.Wrapper;
import org.jboss.tools.flow.jpdl4.model.Process;
import org.jboss.tools.jbpm.Activator;
class ProcessSerializer extends AbstractElementSerializer {
public void appendOpening(StringBuffer buffer, Wrapper wrapper, int level) {
// buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n");
// buffer.append("<" + Registry.getXmlNodeName(wrapper.getElement()));
// appendAttributes(buffer, wrapper, level);
// 编码问题
String encodeValue = Activator.getDefault().getPreferenceStore().getString("encode");
if (encodeValue == null || encodeValue == "")
encodeValue = "UTF-8";
buffer.append("<?xml version=\"1.0\" encoding=\"").append(encodeValue).append("\"?>\n\n");
buffer.append("<" + Registry.getXmlNodeName(wrapper.getElement()));
appendAttributes(buffer, wrapper, level);
}
... ...
关键就是JpdlSerializer.java,只是有点奇怪,不能指定UTF-8转码,而用GBK就正确
StringBuffer buffer = new StringBuffer();
serialize(wrapper, buffer, 0);
String s = new String(buffer.toString().getBytes(), "GBK");
os.write(s.getBytes());
编译好的class文件打回jar(非source)文件,重新加入eclipse的dropins就ok了。
运行中大部分时间是正常的,有个BUG,修改中文标签时,有可能xml会变成乱码,只需要拖动哈节点图形,xml就恢复正常了,搞不懂,等以后有时间再深入研究!