﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-yegucheng-随笔分类-Eclipse插件开发</title><link>http://www.blogjava.net/yegucheng/category/16684.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 27 Oct 2007 02:42:30 GMT</lastBuildDate><pubDate>Sat, 27 Oct 2007 02:42:30 GMT</pubDate><ttl>60</ttl><item><title>使用Java API操作文件的字符集</title><link>http://www.blogjava.net/yegucheng/archive/2007/10/26/156032.html</link><dc:creator>yegucheng</dc:creator><author>yegucheng</author><pubDate>Fri, 26 Oct 2007 02:01:00 GMT</pubDate><guid>http://www.blogjava.net/yegucheng/archive/2007/10/26/156032.html</guid><wfw:comment>http://www.blogjava.net/yegucheng/comments/156032.html</wfw:comment><comments>http://www.blogjava.net/yegucheng/archive/2007/10/26/156032.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/yegucheng/comments/commentRss/156032.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yegucheng/services/trackbacks/156032.html</trackback:ping><description><![CDATA[<p>笔者的场景是这样的，笔者使用code smith作为代码生成工具，并在Eclipse中做插件开发，code smith天生<br />
对GB的支持比较弱，只能生成UTF-8编码，这在Eclipse开发的过程中不会存在问题，但是在使用Eclipse的导出<br />
功能时，Eclipse底层使用ANT的执行方式，ANT的默认字符集默认使用当前系统的字符集，这时在编译导出的时候，<br />
会出现字符无法识别的问题，导致导出或者打包失败。<br />
&nbsp;一种方式可以改变Eclipse工程的默认字符集，以及自动生成的ant配置文件中字符集的配置，这对于单个工程是有<br />
效的，但处理工程间依赖时，被依赖的工程同样会出现字符集问题，即使被依赖工程设定ant的字符集。<br />
&nbsp;另一种方式，是手工转换，讲UTF-8的字符集转换为GBK的，微软的网站提供了一个批量转换工具，但是在转换之后，<br />
文档的最前面还会有可能存在多于字符，并导致ant打包失败<br />
&nbsp;最后，没办法自己写了一个字符集转换工具，因为是自己用，所以够用就行，下面是转换部分的代码，实现UTF8到<br />
GBK的转换，其他转换可以对代码稍作修改。</p>
<p>&nbsp;<br />
import org.apache.commons.lang.ArrayUtils;</p>
<p>public class EncodeRepairTool {<br />
&nbsp;public static final byte[] bPre = "EFBBBF".getBytes();<br />
&nbsp;private int i = 0;</p>
<p>&nbsp;/**<br />
&nbsp; * @param args<br />
&nbsp; */<br />
&nbsp;public static void main(String[] args) {&nbsp;&nbsp;<br />
&nbsp;&nbsp;String path = "D:\\eclipse-dev-3.3\\workspace";<br />
&nbsp;&nbsp;File file = new File(path);<br />
&nbsp;&nbsp;EncodeRepairTool scanner = new EncodeRepairTool();<br />
&nbsp;&nbsp;scanner.scanFolder(file);</p>
<p>&nbsp;}</p>
<p>&nbsp;</p>
<p>&nbsp;public void scanFolder(File file) {<br />
&nbsp;&nbsp;if (file.isDirectory()) {<br />
&nbsp;&nbsp;&nbsp;File[] files = file.listFiles();<br />
&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; files.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;scanFolder(files[i]);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;} else if (file.getName().endsWith(".java")) {<br />
&nbsp;&nbsp;&nbsp;removePreCode(file);<br />
&nbsp;&nbsp;}<br />
&nbsp;}</p>
<p>&nbsp;private void removePreCode(File file) {<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;FileInputStream fis = new FileInputStream(file);<br />
&nbsp;&nbsp;&nbsp;int size = fis.available();<br />
&nbsp;&nbsp;&nbsp;if (size &lt; 24) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;i ++ ;<br />
&nbsp;&nbsp;&nbsp;byte[] bs = new byte[size];<br />
&nbsp;&nbsp;&nbsp;fis.read(bs);<br />
&nbsp;&nbsp;&nbsp;byte[] tbs = ArrayUtils.subarray(bs, 0, 3);<br />
&nbsp;&nbsp;&nbsp;byte[] tbs1 = new byte[] { new Integer(0xEF).byteValue(),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new Integer(0xBB).byteValue(),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new Integer(0xBF).byteValue() };<br />
&nbsp;&nbsp;&nbsp;boolean bol = false;<br />
&nbsp;&nbsp;&nbsp;if (tbs[0] == tbs1[0] &amp;&amp; tbs[1] == tbs1[1] &amp;&amp; tbs[2] == tbs1[2]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;bol = true;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;fis.close();<br />
&nbsp;&nbsp;&nbsp;if (!bol) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("&nbsp; " + i + " : " + file.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;tbs = bs;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("**" + i + " : " + file.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;tbs = ArrayUtils.subarray(bs, 3, size);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;InputStreamReader reader = new InputStreamReader(new ByteArrayInputStream(tbs), "UTF-8");<br />
&nbsp;&nbsp;&nbsp;BufferedReader br = new BufferedReader(reader);<br />
&nbsp;&nbsp;&nbsp;StringBuffer buffer = new StringBuffer();<br />
&nbsp;&nbsp;&nbsp;String s = br.readLine();<br />
&nbsp;&nbsp;&nbsp;while (s != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;buffer.append(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;buffer.append("\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;s =&nbsp; br.readLine();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;reader.close();<br />
&nbsp;&nbsp;&nbsp;byte[] nbs = buffer.toString().getBytes("GBK");&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;FileOutputStream fos = new FileOutputStream(file);<br />
&nbsp;&nbsp;&nbsp;fos.write(nbs);<br />
&nbsp;&nbsp;&nbsp;fos.flush();<br />
&nbsp;&nbsp;&nbsp;fos.close();<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;} catch (FileNotFoundException e) {<br />
&nbsp;&nbsp;&nbsp;// TODO 自动生成 catch 块<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;} catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;// TODO 自动生成 catch 块<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;}</p>
<p>}<br />
</p>
<img src ="http://www.blogjava.net/yegucheng/aggbug/156032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yegucheng/" target="_blank">yegucheng</a> 2007-10-26 10:01 <a href="http://www.blogjava.net/yegucheng/archive/2007/10/26/156032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在使用TAB型的属性页时，设定Section标题的方法</title><link>http://www.blogjava.net/yegucheng/archive/2007/04/02/107992.html</link><dc:creator>yegucheng</dc:creator><author>yegucheng</author><pubDate>Mon, 02 Apr 2007 07:36:00 GMT</pubDate><guid>http://www.blogjava.net/yegucheng/archive/2007/04/02/107992.html</guid><wfw:comment>http://www.blogjava.net/yegucheng/comments/107992.html</wfw:comment><comments>http://www.blogjava.net/yegucheng/archive/2007/04/02/107992.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yegucheng/comments/commentRss/107992.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yegucheng/services/trackbacks/107992.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在使用TAB型的属性页时，设定Section标题的方法&nbsp;&nbsp;<a href='http://www.blogjava.net/yegucheng/archive/2007/04/02/107992.html'>阅读全文</a><img src ="http://www.blogjava.net/yegucheng/aggbug/107992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yegucheng/" target="_blank">yegucheng</a> 2007-04-02 15:36 <a href="http://www.blogjava.net/yegucheng/archive/2007/04/02/107992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EMF模型解析的策略分析</title><link>http://www.blogjava.net/yegucheng/archive/2007/03/07/102372.html</link><dc:creator>yegucheng</dc:creator><author>yegucheng</author><pubDate>Wed, 07 Mar 2007 05:08:00 GMT</pubDate><guid>http://www.blogjava.net/yegucheng/archive/2007/03/07/102372.html</guid><wfw:comment>http://www.blogjava.net/yegucheng/comments/102372.html</wfw:comment><comments>http://www.blogjava.net/yegucheng/archive/2007/03/07/102372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yegucheng/comments/commentRss/102372.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yegucheng/services/trackbacks/102372.html</trackback:ping><description><![CDATA[
		<p>今天看到两种使用EMF解析.xml为EMF模型的策略：<br />一种是通过如下代码：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">IFileEditorInput modelFile </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> (IFileEditorInput)getEditorInput();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />URI resourceURI </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> URI.createPlatformResourceURI(modelFile.getFile().getFullPath().toString());;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span id="Codehighlighter1_227_363_Open_Text">
						<span style="COLOR: #000000">resource </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> editingDomain.getResourceSet().getResource(resourceURI, </span>
						<span style="COLOR: #0000ff">true</span>
						<span style="COLOR: #000000">);</span>
				</span>
		</div>上面这种方式会引用一个AdapterFactoryEditingDomain类，但我们基于模型做编辑器时，有时并不需要用这个类，例如GEF，它具有自身的EditorDomain。<br /><br />另外一种方式是使用EMF模型自动生成的Process,该类一般在模型的Util包下面，引用代码如下：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">IFileEditorInput modelFile </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (IFileEditorInput)getEditorInput();        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />XMLProcessor processor </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> DesignXMLProcessor();            <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> resource </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> processor.load(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> InputSource(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> InputStreamReader(modelFile.getFile().getContents(), </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">GBK</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)), </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span></div><br />其实，对于EMF而言，上面两种解释方式，归根到底都需要EMF获得 业务模型相关的解析器，对于第一种方式，EMF是如何获取到业务模型的解析器呢？主要是通过扩展的方式，扩展定义在模型的plugin.xml中，代码片断如下图所示：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">  </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">extension point</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.eclipse.emf.ecore.extension_parser</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">parser <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />       type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">design</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />       </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">com.neusoft.report.design.util.DesignResourceFactoryImpl</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">extension</span><span style="COLOR: #000000">&gt;</span></div><br />这样，解析.xml文件时，EMF从ResourceFactory注册中，根据相应的type，获取解析器（DesignResourceFactoryImpl），完成解析。<img src ="http://www.blogjava.net/yegucheng/aggbug/102372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yegucheng/" target="_blank">yegucheng</a> 2007-03-07 13:08 <a href="http://www.blogjava.net/yegucheng/archive/2007/03/07/102372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>