??xml version="1.0" encoding="utf-8" standalone="yes"?>
Ҏ2Q修改启动参敎ͼeclipse.exe -vmargs -Dosgi.splashLocation=囄路径Q如 C:\picture_path\splash.bmpQ?br />
或在eclipse.ini中加入:-Dosgi.splashLocation=囄路径
2. d扩展点:org.eclipse.core.resources.naturesQ设|class属性ؓ我们的nature
3. 在新建工E的向导中添加我们的natureQ添加方法ؓQ?/p>
2. EMF生成的方法都带有“@generated”标签?/span>EMF重新生成代码时不会覆盖用h加的ҎQ不带有@generatedQ?/span>
3. 关于URIQ?/span>Uniform Resource IdentifierQ?/span>
?/span>EMF 中是通过URI来标?/span>package的,q且通过URI来唯一的确?/span>resources?/span>URI包括三个部分Q?/span>a scheme, a scheme-specific part?/span>an optional fragment?/span>scheme主要军_了访?/span>
资源的协议;比如Q?/span>Platform:/resource/……中的platform?/span>scheme-specific part包含一?/span>authority, device和一?/span>segmentsQ如file:/c:/dir1/dir2/myfile.xmlQ?/span>file是协议,没有authorityQ?/span>c:?/span>device,剩下?/span>3个是segments?/span>URI fragment 标识?/span>resource内部的某个具体的内容。如Q?/span>file:/c:/dir1/dir2/myfile.xml#loc中的#loc?/span> EMF通过带有fragment?/span>URI来访问资源中?/span>EObjects?/span>
4. 关于URIConverter
URIConverter的作用是normalize一个输?/span>URIQ之成Z个实际的针对某个resource?/span>URI。它可以?/span>namespace URIsQ比如:http:///com/example/epo2.ecoreQ映到物理文g?/span>URIs, 或者重定向旧的Q或别名Q的URI参考到一个具体的实际?/span>location。一?/span>URIConverterl护一?/span>URI?/span>URI的映集合。比如,把一个命名空?/span>URI映射到物理文Ӟ
URIConverter converter = new URIConverterImpl();
URI uri1 = URI.createURI("http:///somemodel.ecore");
URI uri2 =URI.createURI("platform:/resource/project/somemodel.ecore");
converter.getURIMap().put(uri1, uri2);
在如下面代码Q?/span>
URI normalized = converter.normalize(uri1);
System.out.println(normalized);
打印的结果是Q?/span>platform:/resource/project/somemodel.ecore
URIConverter.normalize()Ҏ只是单的通过映射?/span>map?/span>key替换成了相应?/span>value?/span>
URIConverter的最原始是应用在resource setsQ用来定?/span>resources.
5. 关于Resource?/span>ResourceSet
Resource 表示一个持久化?/span>EOjbects的容器;ResourceSet表示一l?/span>Resource的集合,集合中的Resource同时创徏或加载?/span>Resource中比较重要的是save?/span>loadҎQ还有通过URI fragments讉K资源中的Object的机Ӟ如:
Resource resource =…
Item item = (Item)resource.getEObject("http://@orders.0/@items.2");
Item item =…
String fragment = resource.getURIFragment(item);
上面代码中的两个ҎQ?/span>getEObject通过带有fregment?/span>URI获得一?/span>EObjectQ与之相反的ҎgetURIFragment()通过EObject获得相应?/span>fragment path?/span>
ResourceSet中有些重要的ҎQ?/span>
createResource()创徏一个空?/span>ResourceQ?/span>
getResource()通过resource?/span>URI来创?/span>ResourceQ?/span>
getEObject()Q通过URI中的fregment来获得具体的EObject对象?/span>
6. 关于Resource.Factory
用来创徏ResourceQ?/span>resource factory 要注册到Registry实例中。一?/span>factory 可以通过多种方式?/span>URIs来注册,包括URI scheme或?/span>URI?/span>extension。在插g方式的应用中Q通过扩展点的方式在插件加载的时候注?/span>descriptor。下面是Resource的源代码
public interface Resource extends Notifier
{
interface Factory
{
Resource createResource(URI uri);
interface Descriptor
{
Factory createFactory();
}
interface Registry
{
Factory getFactory(URI uri);
Map getProtocolToFactoryMap();
String DEFAULT_EXTENSION = "*";
Map getExtensionToFactoryMap();
Registry INSTANCE = new ResourceFactoryRegistryImpl
();
}
}
}
下面?/span>Registry中的getFactory()Ҏ的算法(引用原文Q:
1. Check for a factory in the protocolToFactoryMap, using
the scheme of the URI.
2. If nothing was found, check the extensionToFactoryMap
using the file extension of the URI.
3. If still nothing was found, check the
extensionToFactoryMap using the DEFAULT_EXTENSION
(that is, the wildcard character "*").
4. If no extension match was found, call the
delegatedGetFactory() method. This allows you to supply
your own factory registry, with its own lookup
criteria.
5. If a descriptor was found, instead of an actual
factory, call the createFactory() method on the
descriptor to create the factory.
6. Finally, return the factory if one was found, or null.
tipQ?/span>emf~省的序列化方式?/span>XMI。因此,如果没有扑ֈ相应注册?/span>factory~省的就会返回以*注册的缺省的factoryQ这?/span>factory是针?/span>XMI?/span>factoryQ即XMIResourceFactoryImpl。如Q对?/span>XMIResourceFactoryImpl的扩展点声明:
<extension point = "org.eclipse.emf.ecore.extension_parser">
<parser type="*" class="org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl"/>
</extension>
当非插g应用的时候,可以通过手工的方式来注册factoryQ如Q?/span>
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put
("*", new XMIResourceFactoryImpl());
7. Resource通过两种方式实现XML?/span>XMI?/span>
1) XML
实现Resource存储的重要方法是save, 只有在方?/span>eIsSet()q回trueӞ相关的属性和引用才会被序列化?/span>xml中。对于存储的xml文g的格式可以通过讄OPTION_XML_MAP属性来完成Q如下面原文Q?/span>
There are several reasons why you might want to use OPTION_XML_MAP when saving a resource:
1. You want to save your data so that it conforms to a particular XML Schema.
2. You have changed your model, and you want the resource to produce XML documents that will work with the old version of the model.
3. You want to design your own XML format without changing your model.
2) XMI
XMI?/span>XML基本相同Q?/span>XMIResourceImpl是
XMLResourceImpl的简单承,只是在引?/span>objects时?/span>XMI IDs
Provides中判断添?/span>Decorator的条件。最后就要注册我们的Provider了。添加扩展点Q?/span>
org.eclipse.gmf.runtime.diagram.ui.decorator.providersQ将decoration provider设成我们?/span>ProviderQ至此大功造成Q?/span>JScript | VBScript | 匚w |
---|---|---|
/^\[ \t]*$/ | "^\[ \t]*$" | 匚w一个空白行?/td> |
/\d{2}-\d{5}/ | "\d{2}-\d{5}" | 验证一个ID L是否׃?位数字,一个连字符以及一?位数字组成?/td> |
/<(.*)>.*<\/\1>/ | "<(.*)>.*<\/\1>" | 匚w一?HTML 标记?/td> |
字符 | 描述 |
---|---|
\ | 下一个字W标Cؓ一个特D字W、或一个原义字W、或一?向后引用、或一个八q制转义W。例如,'n' 匚w字符 "n"?\n' 匚w一个换行符。序?'\\' 匚w "\" ?"\(" 则匹?"("?/td> |
^ | 匚w输入字符串的开始位|。如果设|了 RegExp 对象?Multiline 属性,^ 也匹?'\n' ?'\r' 之后的位|?/td> |
$ | 匚w输入字符串的l束位置。如果设|了RegExp 对象?Multiline 属性,$ 也匹?'\n' ?'\r' 之前的位|?/td> |
* | 匚w前面的子表达式零ơ或多次。例如,zo* 能匹?"z" 以及 "zoo"? {h于{0,}?/td> |
+ | 匚w前面的子表达式一ơ或多次。例如,'zo+' 能匹?"zo" 以及 "zoo"Q但不能匚w "z"? {h?{1,}?/td> |
? | 匚w前面的子表达式零ơ或一ơ。例如,"do(es)?" 可以匚w "do" ?"does" 中的"do" ? {h?{0,1}?/td> |
{n} | n 是一个非负整数。匹配确定的 n ơ。例如,'o{2}' 不能匚w "Bob" 中的 'o'Q但是能匚w "food" 中的两个 o?/td> |
{n,} | n 是一个非负整数。至匹?em>n ơ。例如,'o{2,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h?'o+'?o{0,}' 则等价于 'o*'?/td> |
{n,m} | m ?n 均ؓ非负整数Q其?em>n <= m。最匹?n ơ且最多匹?m ơ。例如,"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h?'o?'。请注意在逗号和两个数之间不能有空根{?/td> |
? | 当该字符紧跟在Q何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面Ӟ匚w模式是非贪婪的。非贪婪模式可能少的匹配所搜烦的字W串Q而默认的贪婪模式则尽可能多的匚w所搜烦的字W串。例如,对于字符?"oooo"Q?o+?' 匹配单?"o"Q?'o+' 匹配所?'o'?/td> |
. | 匚w?"\n" 之外的Q何单个字W。要匚w包括 '\n' 在内的Q何字W,请用象 '[.\n]' 的模式?/td> |
(pattern) | 匚w pattern q获取这一匚w。所获取的匹配可以从产生?Matches 集合得到Q在VBScript 中?SubMatches 集合Q在JScript 中则使用 $0…$9 属性。要匚w圆括号字W,请?'\(' ?'\)'?/td> |
(?:pattern) | 匚w pattern 但不获取匚wl果Q也是说这是一个非获取匚wQ不q行存储供以后用。这在?"? 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 是一个比 'industry|industries' 更简略的表达式?/td> |
(?=pattern) | 正向预查Q在M匚w pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹?"Windows 2000" 中的 "Windows" Q但不能匚w "Windows 3.1" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开始?/td> |
(?!pattern) | 负向预查Q在M不匹?pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_该匹配不需要获取供以后使用。例?Windows (?!95|98|NT|2000)' 能匹?"Windows 3.1" 中的 "Windows"Q但不能匚w "Windows 2000" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开? |
x|y | 匚w x ?y。例如,'z|food' 能匹?"z" ?"food"?(z|f)ood' 则匹?"zood" ?"food"?/td> |
[xyz] | 字符集合。匹配所包含的Q意一个字W。例如, '[abc]' 可以匚w "plain" 中的 'a'?/td> |
[^xyz] | 负值字W集合。匹配未包含的Q意字W。例如, '[^abc]' 可以匚w "plain" 中的'p'?/td> |
[a-z] | 字符范围。匹配指定范围内的Q意字W。例如,'[a-z]' 可以匚w 'a' ?'z' 范围内的L写字母字符?/td> |
[^a-z] | 负值字W范围。匹配Q何不在指定范围内的Q意字W。例如,'[^a-z]' 可以匚wM不在 'a' ?'z' 范围内的L字符?/td> |
\b | 匚w一个单词边界,也就是指单词和空格间的位|。例如, 'er\b' 可以匚w"never" 中的 'er'Q但不能匚w "verb" 中的 'er'?/td> |
\B | 匚w非单词边界?er\B' 能匹?"verb" 中的 'er'Q但不能匚w "never" 中的 'er'?/td> |
\cx | 匚w?x 指明的控制字W。例如, \cM 匚w一?Control-M 或回车符?em>x 的值必Mؓ A-Z ?a-z 之一。否则,?c 视ؓ一个原义的 'c' 字符?/td> |
\d | 匚w一个数字字W。等价于 [0-9]?/td> |
\D | 匚w一个非数字字符。等价于 [^0-9]?/td> |
\f | 匚w一个换늬。等价于 \x0c ?\cL?/td> |
\n | 匚w一个换行符。等价于 \x0a ?\cJ?/td> |
\r | 匚w一个回车符。等价于 \x0d ?\cM?/td> |
\s | 匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ \f\n\r\t\v]?/td> |
\S | 匚wM非空白字W。等价于 [^ \f\n\r\t\v]?/td> |
\t | 匚w一个制表符。等价于 \x09 ?\cI?/td> |
\v | 匚w一个垂直制表符。等价于 \x0b ?\cK?/td> |
\w | 匚w包括下划U的M单词字符。等价于'[A-Za-z0-9_]'?/td> |
\W | 匚wM非单词字W。等价于 '[^A-Za-z0-9_]'?/td> |
\xn | 匚w nQ其?n 为十六进制{义倹{十六进制{义值必Mؓ定的两个数字长。例如,'\x41' 匚w "A"?\x041' 则等价于 '\x04' & "1"。正则表辑ּ中可以?ASCII ~码? |
\num | 匚w numQ其?num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匚w两个q箋的相同字W?/td> |
\n | 标识一个八q制转义值或一个向后引用。如?\n 之前臛_ n 个获取的子表辑ּQ则 n 为向后引用。否则,如果 n 为八q制数字 (0-7)Q则 n Z个八q制转义倹{?/td> |
\nm | 标识一个八q制转义值或一个向后引用。如?\nm 之前臛_?nm 个获得子表达式,?nm 为向后引用。如?\nm 之前臛_?n 个获取,?n Z个后跟文?m 的向后引用。如果前面的条g都不满Q若 n ?m 均ؓ八进制数?(0-7)Q则 \nm 匹配八q制转义?nm?/td> |
\nml | 如果 n 为八q制数字 (0-3)Q且 m ?l 均ؓ八进制数?(0-7)Q则匚w八进制{义?nml?/em> |
\un | 匚w nQ其?n 是一个用四个十六q制数字表示?Unicode 字符。例如, \u00A9 匚w版权W号 (©)?/td> |
下面看几个例子:
"^The"Q表C所有以"The"开始的字符Ԍ"There"Q?The cat"{)Q?
"of despair$"Q表C所以以"of despair"l尾的字W串Q?
"^abc$"Q表C开始和l尾都是"abc"的字W串——呵呵,只有"abc"自己了;
"notice"Q表CZQ何包?notice"的字W串?
'*'Q?+'??'q三个符P表示一个或一序列字符重复出现的次数。它们分别表C?#8220;没有?
更多”Q?#8220;一ơ或更多”q有“没有或一?#8221;。下面是几个例子Q?
"ab*"Q表CZ个字W串有一个a后面跟着零个或若q个b。("a", "ab", "abbb",……Q;
"ab+"Q表CZ个字W串有一个a后面跟着臛_一个b或者更多;
"ab?"Q表CZ个字W串有一个a后面跟着零个或者一个bQ?
"a?b+$"Q表C在字符串的末尾有零个或一个a跟着一个或几个b?
也可以用范_用大括号括vQ用以表C重复次数的范围?
"ab{2}"Q表CZ个字W串有一个a跟着2个bQ?abb"Q;
"ab{2,}"Q表CZ个字W串有一个a跟着臛_2个bQ?
"ab{3,5}"Q表CZ个字W串有一个a跟着3?个b?
h意,你必L定范围的下限Q如Q?{0,2}"而不?{,2}"Q。还有,你可能注意到了,'*'Q?+'?
'?'相当?{0,}"Q?{1,}"?{0,1}"?
q有一?¦'Q表C?#8220;?#8221;操作Q?
"hi¦hello"Q表CZ个字W串里有"hi"或?hello"Q?
"(b¦cd)ef"Q表C?bef"?cdef"Q?
"(a¦b)*c"Q表CZ?a""b"混合的字W串后面跟一?c"Q?
'.'可以替代M字符Q?
"a.[0-9]"Q表CZ个字W串有一?a"后面跟着一个Q意字W和一个数字;
"^.{3}$"Q表C有L三个字符的字W串Q长度ؓ3个字W)Q?
Ҏ可C某些字W允许在一个字W串中的某一特定位置出现Q?
"[ab]"Q表CZ个字W串有一?a"?b"Q相当于"a¦b"Q;
"[a-d]"Q表CZ个字W串包含写?a'?d'中的一个(相当?a¦b¦c¦d"或?[abcd]"Q;
"^[a-zA-Z]"Q表CZ个以字母开头的字符Ԍ
"[0-9]%"Q表CZ个百分号前有一位的数字Q?
",[a-zA-Z0-9]$"Q表CZ个字W串以一个逗号后面跟着一个字母或数字l束?
你也可以在方括号里用'^'表示不希望出现的字符Q?^'应在Ҏ号里的第一位。(如:"%[^a-zA-Z]%"?
CZ个百分号中不应该出现字母Q?
Z逐字表达Q必d"^.$()¦*+?{\"q些字符前加上{UdW?\'?
h意在Ҏ号中Q不需要{义字W?/p>