尝试解决jbpm4 jpdl插件乱码的问题

参考: http://am-wj.iteye.com/blog/432188,基本解决问题,比在eclipse.ini里加-Dfile.encoding=UTF-8效果好,基本没有副作用(console不会变乱码了)

修改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就恢复正常了,搞不懂,等以后有时间再深入研究!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值