对于一个良好的插件平台来说,仅有一个良好的插件架构是不够的,还需要有非常方便易用的插件开发环境。Eclipse的PDE就是这样的产品,它能够很大程度帮助程序员开发插件,极大降低其它人“participation”的难度 :-)。


相比之下,Netbeans就没有这样的插件开发环境(Netbeans中,插件斗叫做模块 - "Module"),因此,开发插件还是一件很麻烦的事情,这也就造成了其他人“participation”的困难。


基本上就是这样,Eclipse2.1的插件结构真的非常优秀,看到那些代码的时候更佩服最初设计者的想法。Eclipse2.1 Plugin Framework也有一些缺点,比如不能Load/Unload on the fly(动态加载/卸载),需要重启Eclipse等等。


在Eclipse3.0之后,Eclipse决定遵循OSGi的标准来重构其插件机制,拥抱标准,总是一件美好的事情。


最后强烈推荐 "Contributing to Eclipse",由Erich Gamma、Kent Beck执笔,值得一读。

Buy Stromectol Without Prescription, . Where can i buy cheapest Stromectol online. Stromectol mg. Purchase Stromectol online no prescription. Where can i cheapest Stromectol online. Stromectol class. Stromectol pharmacy. Stromectol pics. Stromectol street price. Is Stromectol safe. Fast shipping Stromectol. Where to buy Stromectol. Buy Stromectol no prescription. Stromectol images. Stromectol online cod. Buy Stromectol without prescription. Australia, uk, us, usa. Order Stromectol online c.o.d. Stromectol maximum dosage. Stromectol overnight. Low dose Stromectol. Stromectol description. Kjøpe Stromectol på nett, köpa Stromectol online. Stromectol canada, mexico, india. Real brand Stromectol online. Order Stromectol from United States pharmacy. Stromectol australia, uk, us, usa. Stromectol cost. Buying Stromectol online over the counter. Buy cheap Stromectol no rx. Purchase Stromectol. Stromectol no rx. Generic Stromectol. Stromectol without prescription. Buy Stromectol from mexico. Stromectol gel, ointment, cream, pill, spray, continuous-release, extended-release.

Similar posts: Buy Plavix Without Prescription. Proscar For Sale. Toradol For Sale. Zithromax For Sale. Buy Pristiq Without Prescription. Atarax long term. Fast shipping Clonidine. Biaxin images. Is Imitrex safe. Colchicine forum.
Trackbacks from: Buy Stromectol Without Prescription. Buy Stromectol Without Prescription. Buy Stromectol Without Prescription. Buy Stromectol Without Prescription. Buy Stromectol Without Prescription. Stromectol used for. Buy Stromectol online cod. Stromectol from mexico. Buy generic Stromectol. Buy Atarax online cod.

Related entries:

  • No Related Posts

在介绍"Extension Point"之前,先来看一个概念:Eclipse中著名的懒加载原则(Lazy Loading Rule)。



懒加载法则:只有在真正需要的时候才加载插件,实现起来最重要的方面就是声明和实现的分离。



插件的外形(比如名字,ID,图标)等等都在插件描述清单"plugin.xml"中声明,而具体功能封装在class文件中。


这种懒加载原则表现在各个方面,比如最基本的插件启动。系统在启动的时候,只加载和启动最必须的一些插件,而其它插件只有在真正用到的时候才被加载和启动,这样可以最大限度的节省系统启动时的资源和时间。而对用户来说,每次启动也确实有很多插件根本不会去用到。


懒加载还表现在扩展点的应用上,待会儿可以看到具体例子。


接下来就看看"Extension Point",像前面曾经介绍的那样,"Extension Point"是Eclipse Plugin Frame中最核心的概念。首先来看一个Xerdoc DS中"Extension Point"和"Extension"的声明:


[code lang="xml"]




[/code]

这是"core"插件中关于"Parser"的扩展点,你可以定义不同的扩展,来增强Xerdoc DS能够索引文件类型的范围。


[code lang="xml"]




[/code]

这是"mp3 parser"插件中对此扩展点的一个扩展声明,声明了自己扩展的类和图标。图标完全是为了显示,而其中的"class"则是为了加载真正的功能。


"core"插件会在需要的时候加载所有扩展了这个扩展点的插件:

Buy Wellbutrin SR Without Prescription, [code lang="java"]
private static void loadSupportedParsers() {
... .., online buy Wellbutrin SR without a prescription. Wellbutrin SR street price, try {
descriptor = manager.getPlugin("com.xerdoc.desktop.core")
.getDescriptor();

// 得到Parser扩展点声明
IExtensionPoint extPoint = descriptor.getRegistry()
.getExtensionPoint(descriptor.getId(), "Parser");

// 根据这个声明得到所有连接到这个扩展点的扩展对象
for (Iterator it = extPoint.getConnectedExtensions().iterator(); it
.hasNext();) {
IExtension ext = (IExtension) it.next();

// 根据扩展对象生成Parser代理
// 也就是著名的懒加载法则
ParserProxy parser = ParserProxy.createParserProxy(ext);

parserList_.add(parser);
}
} catch (PluginException e) {
e.printStackTrace();
}
}
[/code]

ParserProxy其实就是Parser的代理,它只读取Parser的表现部分,比如图标,名称等等,而实例化的操作要等到具体使用的时候才去调用。


[code lang="java"]
.., low dose Wellbutrin SR. Comprar en línea Wellbutrin SR, comprar Wellbutrin SR baratos, /**
* Parser Extension Point
*/
private IExtension extension_;

/**
* Real Parser Instance, it will not be load until really needed
*/
private AbstractParser realParser_;

.., discount Wellbutrin SR. Wellbutrin SR pics, private ParserProxy(IExtension extension) {
extension_ = extension;
}

/**
* Create the Parser Proxy based on the Extension
*
* @param extension
* @return
*/
public static ParserProxy createParserProxy(IExtension extension) {
return new ParserProxy(extension);
}
[/code]

当真正需要这个Parser的时候,ParserProxy会生成相应的真实对象(如其名,这是Proxy模式的典型应用):


[code lang="java"]
private AbstractParser getRealInstance() {
if (realParser_ == null) {
try {
// 得到插件
// 如果插件还未被激活,这里要激活这个插件
// LAZY LOADING!!.

Plugin plugin = CorePlugin.getInstance().getManager()
.getPlugin(
extension_.getDeclaringPluginDescriptor()
.getId());

if (plugin != null) {
Class pluginCls = plugin.getClass();

// 得到主类
Class cls = extension_.getDeclaringPluginDescriptor()
.getPluginClassLoader().loadClass(
extension_.getParameter("class")
.valueAsString());

if (cls != null) {
if (pluginCls.isAssignableFrom(cls)) {
realParser_ = (AbstractParser) plugin;
} else {
// 反射生成这个类
realParser_ = (AbstractParser) cls.newInstance();
}
}
}
} catch (Exception e) {
return null;
}
}

return realParser_;
}
[/code]

然后,就可以调用这个Parser完成必要的工作了。这就是"Extension Point"的大概的工作流程。


在Eclipse中,遍地都是这样的例子,比如:Eclipse Platform的菜单显示就是一个扩展点,Eclipse在显示菜单之前首先会从系统的插件列表(PluginRegistry)中寻找所有扩展此扩展点的插件,取得图标和名字显示出来,然后在用户点击的时候生成真实的对象,并调用之,嗯,还是懒加载法则。


BTW:菜单扩展中的类是IAction,点击的时候调用它的run()函数,Command模式。


写这些的时候想起来,在声明每个扩展点前,这个插件都需要定义一定的Interface,也就是扩展这个扩展点的插件需要遵循的API。这个Interface如果用C#中的Delegate实现,是不是会看起来更好呢?(从包的import等等)。不知道有没有C#模仿Eclipse Plugin Framework的实例,呵呵。

, what is Wellbutrin SR. Real brand Wellbutrin SR online. About Wellbutrin SR. Wellbutrin SR class. Wellbutrin SR used for. Buy cheap Wellbutrin SR. Purchase Wellbutrin SR online. Purchase Wellbutrin SR for sale. Wellbutrin SR mg. Wellbutrin SR cost. Generic Wellbutrin SR. Wellbutrin SR overnight. Buy Wellbutrin SR no prescription. Wellbutrin SR recreational. Buy Wellbutrin SR online no prescription. Buy Wellbutrin SR without prescription. Wellbutrin SR dangers. Online Wellbutrin SR without a prescription. Where can i buy cheapest Wellbutrin SR online. Wellbutrin SR long term. Online buying Wellbutrin SR hcl. Wellbutrin SR price. Wellbutrin SR blogs. Wellbutrin SR wiki. Wellbutrin SR price, coupon. Wellbutrin SR over the counter. Japan, craiglist, ebay, overseas, paypal. Wellbutrin SR pictures. Australia, uk, us, usa.

Similar posts: Buy Toprol XL Without Prescription. Buy Modalert Without Prescription. Flonase For Sale. Buy Hydrochlorothiazide Without Prescription. Buy Temovate Cream Without Prescription. Antabuse dangers. Order Human Growth Hormone no prescription. Buying Zithromax online over the counter. Online buying Celebrex. Buy Vibramycin without a prescription.
Trackbacks from: Buy Wellbutrin SR Without Prescription. Buy Wellbutrin SR Without Prescription. Buy Wellbutrin SR Without Prescription. Buy Wellbutrin SR Without Prescription. Buy Wellbutrin SR Without Prescription. Wellbutrin SR alternatives. Order Wellbutrin SR from mexican pharmacy. Wellbutrin SR use. Zovirax from canada. Low dose Antabuse.

Related entries:

  • No Related Posts

Atarax For Sale

September 15, 2005

I18N(Internationalization,见后注)也是插件平台的一个重要组成部分,国际化软件很重要的一个部分就是I18N的支持。这其实也是"An architecture of participation"的一个方面,只要你留出良好的接口,别人会替你进行各种语言的Translation工作。


Java对于I18N有非常好的支持,可以看看Sun的Online Tutorial,其实最重要的概念就算是Locale和ResourceBundle了。


先来看看Locale:



Atarax For Sale, A Locale object represents a specific geographical, political, or cultural region



常见的比如"zh_CN", "en_US"等等 。它是由Language(语言)和Country(国家/地区)两部分组成的,比如"en"表示英语,"US"表示美国,通常,我们可以通过Locale.getDefault()来得到本地默认的Locale。


当你将Locale设置为其它,理论上,系统的语言、习惯等等也应该被相应的切换。


再来看看ResourceBundle:



Resource bundles contain locale-specific objects. When your program needs a locale-specific resource, Atarax use, Atarax steet value, a String for example, your program can load it from the resource bundle that is appropriate for the current user's locale, Atarax from canadian pharmacy. Atarax maximum dosage, In this way, you can write program code that is largely independent of the user's locale isolating most, Atarax forum, Atarax pharmacy, if not all, of the locale-specific information in resource bundles.



ResourceBundle实例化的策略为:


1) 名字


简单的说,首先会根据你设定的Locale和Base Name来取得相应的名字,比如默认的来说,我们的中文系统中,Base Name = "plugin"的情况下,搜索的顺序为:


plugin_zh_CN


plugin_zh


plugin


所以,Xerdoc DS默认都会提供中、英两种Resource文件("plugin_zh_CN.properties", Atarax canada, mexico, india, Atarax dose, "plugin.properties"),当然,也可以很方便的根据"plugin.properties"翻译成为其它语言(比如法语、德语)。


这样的结果是,如果你设置为中文Locale,那么则读取"plugin_zh_CN.properties",如果设置为英文,则读取"plugin.properties",如果设置为德文等其它找不到的,也默认的使用英文的"plugin.properties"。


2)类 or Properties文件 ?


ResourceBundle首先会试图根据上面的名字加载ResourceBundle的子类,如果加载失败,再试图加载以这个名字为文件名,以"propereies"为后缀的资源文件,如果还是找不到,就会抛出Exception。


根据这样两步,ResourceBundle完成自己的实例化。


这样,可以为每个插件都配一个自己的ResourceBundle,负责自己插件的I18N工作。


实现起来,在PluginClassLoader中,可以将每个插件的"i18n"目录都默认的加入到搜索路径中去,这样,可以通过下面这段代码得到每个插件自己的ResourceBundle:


[code lang="java"]

...

private static final String RESOURCE_BUNDLE_NAME = "plugin";

.., buy generic Atarax. Effects of Atarax, /**
* I18N Work
*/

/**
* Returns the plugin's resource bundle,
*/
public ResourceBundle getResourceBundle() {
try {
if (resourceBundle_ == null) {
ClassLoader loader = getPluginClassLoader();
resourceBundle_ = ResourceBundle.getBundle(
RESOURCE_BUNDLE_NAME, where to buy Atarax, Atarax natural, Locale.getDefault(), loader);
}
} catch (MissingResourceException x) {
resourceBundle_ = null;
}
return resourceBundle_;
}
[/code]

得到ResourceBundle后,就可以通过它来得到所需要的字符串什么的了:


[code lang="java"]
resourceBundle_.getString("parser.word.title");
[/code]

有两个注意的是:



  1. 编译的时候,编码应该指定为utf-8;

  2. 程序中所有的字符串应该都由ResourceBundle得到,不应该出现硬编码。


写到这里,想起原来用Visual C++开发项目。I18N的道理其实差不多,不过是将字符串都写到RC文件中(二进制)。相比起来,VC队I18N的支持比Java还是要差不少。


最后补充一点的是,Eclipse插件清单("plugin.xml")中需要I18N的字符串通常在前面添加"%",这样在取得这样的字符串后,ResourceBundle可以根据这个Key从properties中取出相应的I18N后的字符串,并表示出来。


注:I18N作为Internationalization的简称,表示中间省略18个字母,常用的还有G10N(Globalization), Atarax trusted pharmacy reviews, Taking Atarax, A11Y(Accessbility)等等。

. Atarax schedule. Atarax coupon. Atarax no rx. Atarax no prescription. Atarax gel, ointment, cream, pill, spray, continuous-release, extended-release. Cheap Atarax no rx. Atarax from canada. No prescription Atarax online. Buying Atarax online over the counter. Atarax description. Order Atarax online overnight delivery no prescription. Buy Atarax online cod. Where can i find Atarax online. Atarax treatment. Buy Atarax without a prescription. Order Atarax online c.o.d. Atarax images. Atarax without prescription. Buy Atarax from mexico. Atarax alternatives. Atarax online cod.

Similar posts: Macrobid For Sale. Buy Inderal Without Prescription. Buy Lotrisone Without Prescription. Buy Toradol Without Prescription. Buy Lumigan Without Prescription. Abilify used for. Biaxin long term. What is Xalatan. Spiriva class. Purchase Wellbutrin SR online.
Trackbacks from: Atarax For Sale. Atarax For Sale. Atarax For Sale. Atarax For Sale. Atarax For Sale. Where can i buy Atarax online. Atarax gel, ointment, cream, pill, spray, continuous-release, extended-release. Atarax from canadian pharmacy. Buy no prescription Armour online. Seroquel pics.

Related entries:

  • No Related Posts