Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
jenkins
提交
00150769
J
jenkins
项目概览
xxadev
/
jenkins
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
jenkins
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
00150769
编写于
11月 26, 2010
作者:
K
Kohsuke Kawaguchi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
experimenting
上级
39d90576
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
240 addition
and
1 deletion
+240
-1
core/pom.xml
core/pom.xml
+11
-0
core/src/main/java/hudson/ExtensionFinder.java
core/src/main/java/hudson/ExtensionFinder.java
+128
-1
core/src/main/java/hudson/PluginManager.java
core/src/main/java/hudson/PluginManager.java
+3
-0
core/src/main/java/hudson/model/Hudson.java
core/src/main/java/hudson/model/Hudson.java
+5
-0
core/src/test/java/foo/Animal.java
core/src/test/java/foo/Animal.java
+7
-0
core/src/test/java/foo/Banana.java
core/src/test/java/foo/Banana.java
+7
-0
core/src/test/java/foo/Cat.java
core/src/test/java/foo/Cat.java
+9
-0
core/src/test/java/foo/Cute.java
core/src/test/java/foo/Cute.java
+7
-0
core/src/test/java/foo/Dog.java
core/src/test/java/foo/Dog.java
+7
-0
core/src/test/java/foo/Driver.java
core/src/test/java/foo/Driver.java
+56
-0
未找到文件。
core/pom.xml
浏览文件 @
00150769
...
...
@@ -364,6 +364,17 @@ THE SOFTWARE.
</exclusions>
</dependency>
<dependency>
<groupId>
com.google.inject
</groupId>
<artifactId>
guice
</artifactId>
<version>
2.0
</version>
</dependency>
<dependency>
<groupId>
com.google.inject.extensions
</groupId>
<artifactId>
guice-multibindings
</artifactId>
<version>
2.0
</version>
</dependency>
<dependency>
<groupId>
org.jruby.ext.posix
</groupId>
<artifactId>
jna-posix
</artifactId>
...
...
core/src/main/java/hudson/ExtensionFinder.java
浏览文件 @
00150769
...
...
@@ -23,6 +23,13 @@
*/
package
hudson
;
import
com.google.inject.AbstractModule
;
import
com.google.inject.Guice
;
import
com.google.inject.Injector
;
import
com.google.inject.Module
;
import
com.google.inject.Provider
;
import
com.google.inject.Singleton
;
import
com.google.inject.name.Names
;
import
net.java.sezpoz.Index
;
import
net.java.sezpoz.IndexItem
;
import
hudson.model.Hudson
;
...
...
@@ -202,6 +209,126 @@ public abstract class ExtensionFinder implements ExtensionPoint {
}
}
}
@Extension
public
static
final
class
GuiceFinder
extends
ExtensionFinder
{
private
Injector
container
;
public
GuiceFinder
()
{
Module
m
=
new
AbstractModule
()
{
@Override
protected
void
configure
()
{
ClassLoader
cl
=
Hudson
.
getInstance
().
getPluginManager
().
uberClassLoader
;
int
id
=
0
;
for
(
final
IndexItem
<
Extension
,
Object
>
item
:
Index
.
load
(
Extension
.
class
,
Object
.
class
,
cl
))
{
id
++;
try
{
AnnotatedElement
e
=
item
.
element
();
Class
extType
;
if
(
e
instanceof
Class
)
{
extType
=
(
Class
)
e
;
bind
((
Class
<?>)
e
);
continue
;
}
else
if
(
e
instanceof
Field
)
{
extType
=
((
Field
)
e
).
getType
();
bind
(
extType
).
annotatedWith
(
Names
.
named
(
String
.
valueOf
(
id
)))
.
toInstance
(
item
.
instance
());
}
else
if
(
e
instanceof
Method
)
{
extType
=
((
Method
)
e
).
getReturnType
();
}
else
throw
new
AssertionError
();
if
(
type
.
isAssignableFrom
(
extType
))
{
Object
instance
=
item
.
instance
();
if
(
instance
!=
null
)
result
.
add
(
new
ExtensionComponent
<
T
>(
type
.
cast
(
instance
),
item
.
annotation
()));
}
}
catch
(
LinkageError
e
)
{
// sometimes the instantiation fails in an indirect classloading failure,
// which results in a LinkageError
LOGGER
.
log
(
item
.
annotation
().
optional
()
?
Level
.
FINE
:
Level
.
WARNING
,
"Failed to load "
+
item
.
className
(),
e
);
}
catch
(
InstantiationException
e
)
{
LOGGER
.
log
(
item
.
annotation
().
optional
()
?
Level
.
FINE
:
Level
.
WARNING
,
"Failed to load "
+
item
.
className
(),
e
);
}
}
}
};
container
=
Guice
.
createInjector
(
m
);
}
public
<
T
>
Collection
<
ExtensionComponent
<
T
>>
find
(
Class
<
T
>
type
,
Hudson
hudson
)
{
List
<
ExtensionComponent
<
T
>>
result
=
new
ArrayList
<
ExtensionComponent
<
T
>>();
ClassLoader
cl
=
hudson
.
getPluginManager
().
uberClassLoader
;
for
(
IndexItem
<
Extension
,
Object
>
item
:
Index
.
load
(
Extension
.
class
,
Object
.
class
,
cl
))
{
try
{
AnnotatedElement
e
=
item
.
element
();
Class
<?>
extType
;
if
(
e
instanceof
Class
)
{
extType
=
(
Class
)
e
;
}
else
if
(
e
instanceof
Field
)
{
extType
=
((
Field
)
e
).
getType
();
}
else
if
(
e
instanceof
Method
)
{
extType
=
((
Method
)
e
).
getReturnType
();
}
else
throw
new
AssertionError
();
if
(
type
.
isAssignableFrom
(
extType
))
{
Object
instance
=
item
.
instance
();
if
(
instance
!=
null
)
result
.
add
(
new
ExtensionComponent
<
T
>(
type
.
cast
(
instance
),
item
.
annotation
()));
}
}
catch
(
LinkageError
e
)
{
// sometimes the instantiation fails in an indirect classloading failure,
// which results in a LinkageError
LOGGER
.
log
(
item
.
annotation
().
optional
()
?
Level
.
FINE
:
Level
.
WARNING
,
"Failed to load "
+
item
.
className
(),
e
);
}
catch
(
InstantiationException
e
)
{
LOGGER
.
log
(
item
.
annotation
().
optional
()
?
Level
.
FINE
:
Level
.
WARNING
,
"Failed to load "
+
item
.
className
(),
e
);
}
}
return
result
;
}
@Override
public
void
scout
(
Class
extensionType
,
Hudson
hudson
)
{
ClassLoader
cl
=
hudson
.
getPluginManager
().
uberClassLoader
;
for
(
IndexItem
<
Extension
,
Object
>
item
:
Index
.
load
(
Extension
.
class
,
Object
.
class
,
cl
))
{
try
{
AnnotatedElement
e
=
item
.
element
();
Class
<?>
extType
;
if
(
e
instanceof
Class
)
{
extType
=
(
Class
)
e
;
}
else
if
(
e
instanceof
Field
)
{
extType
=
((
Field
)
e
).
getType
();
}
else
if
(
e
instanceof
Method
)
{
extType
=
((
Method
)
e
).
getReturnType
();
}
else
throw
new
AssertionError
();
// accroding to http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6459208
// this appears to be the only way to force a class initialization
Class
.
forName
(
extType
.
getName
(),
true
,
extType
.
getClassLoader
());
}
catch
(
InstantiationException
e
)
{
LOGGER
.
log
(
item
.
annotation
().
optional
()
?
Level
.
FINE
:
Level
.
WARNING
,
"Failed to scout "
+
item
.
className
(),
e
);
}
catch
(
ClassNotFoundException
e
)
{
LOGGER
.
log
(
Level
.
WARNING
,
"Failed to scout "
+
item
.
className
(),
e
);
}
catch
(
LinkageError
e
)
{
LOGGER
.
log
(
Level
.
WARNING
,
"Failed to scout "
+
item
.
className
(),
e
);
}
}
}
}
private
static
final
Logger
LOGGER
=
Logger
.
getLogger
(
ExtensionFinder
.
class
.
getName
());
}
core/src/main/java/hudson/PluginManager.java
浏览文件 @
00150769
...
...
@@ -27,6 +27,7 @@ import static hudson.init.InitMilestone.PLUGINS_PREPARED;
import
static
hudson
.
init
.
InitMilestone
.
PLUGINS_STARTED
;
import
static
hudson
.
init
.
InitMilestone
.
PLUGINS_LISTED
;
import
com.google.inject.Guice
;
import
hudson.PluginWrapper.Dependency
;
import
hudson.init.InitStrategy
;
import
hudson.init.InitializerFinder
;
...
...
@@ -266,6 +267,8 @@ public abstract class PluginManager extends AbstractModelObject {
Hudson
.
getInstance
().
lookup
.
set
(
PluginInstanceStore
.
class
,
new
PluginInstanceStore
());
TaskGraphBuilder
g
=
new
TaskGraphBuilder
();
Hudson
.
getInstance
().
container
=
Guice
.
createInjector
();
// schedule execution of loading plugins
for
(
final
PluginWrapper
p
:
activePlugins
.
toArray
(
new
PluginWrapper
[
activePlugins
.
size
()]))
{
g
.
followedBy
().
notFatal
().
attains
(
PLUGINS_PREPARED
).
add
(
"Loading plugin "
+
p
.
getShortName
(),
new
Executable
()
{
...
...
core/src/main/java/hudson/model/Hudson.java
浏览文件 @
00150769
...
...
@@ -26,6 +26,8 @@
package
hudson.model
;
import
antlr.ANTLRException
;
import
com.google.inject.Guice
;
import
com.google.inject.Injector
;
import
com.thoughtworks.xstream.XStream
;
import
hudson.BulkChange
;
import
hudson.DNSMultiCast
;
...
...
@@ -243,6 +245,9 @@ public final class Hudson extends Node implements ItemGroup<TopLevelItem>, Stapl
*/
public
transient
final
Lookup
lookup
=
new
Lookup
();
// TODO: fix scope
public
transient
Injector
container
;
/**
* {@link Computer}s in this Hudson system. Read-only.
*/
...
...
core/src/test/java/foo/Animal.java
0 → 100644
浏览文件 @
00150769
package
foo
;
/**
* @author Kohsuke Kawaguchi
*/
public
interface
Animal
{
}
core/src/test/java/foo/Banana.java
0 → 100644
浏览文件 @
00150769
package
foo
;
/**
* @author Kohsuke Kawaguchi
*/
public
class
Banana
implements
Cute
{
}
core/src/test/java/foo/Cat.java
0 → 100644
浏览文件 @
00150769
package
foo
;
import
com.google.inject.Singleton
;
/**
* @author Kohsuke Kawaguchi
*/
public
class
Cat
implements
Animal
,
Cute
{
}
core/src/test/java/foo/Cute.java
0 → 100644
浏览文件 @
00150769
package
foo
;
/**
* @author Kohsuke Kawaguchi
*/
public
interface
Cute
{
}
core/src/test/java/foo/Dog.java
0 → 100644
浏览文件 @
00150769
package
foo
;
/**
* @author Kohsuke Kawaguchi
*/
public
class
Dog
implements
Animal
{
}
core/src/test/java/foo/Driver.java
0 → 100644
浏览文件 @
00150769
package
foo
;
import
com.google.inject.AbstractModule
;
import
com.google.inject.Guice
;
import
com.google.inject.Inject
;
import
com.google.inject.Injector
;
import
com.google.inject.Key
;
import
com.google.inject.Scope
;
import
com.google.inject.Singleton
;
import
com.google.inject.TypeLiteral
;
import
com.google.inject.multibindings.Multibinder
;
import
java.util.Set
;
/**
* @author Kohsuke Kawaguchi
*/
public
class
Driver
{
@Inject
public
Set
<
Animal
>
animals
;
@Inject
public
Set
<
Cute
>
cute
;
/*
If Cat has @Singleton, multiple bindings result in the same instance.
How can I achieve that without changing annotation?
*/
public
static
void
main
(
String
[]
args
)
{
Injector
i
=
Guice
.
createInjector
(
new
AbstractModule
()
{
@Override
protected
void
configure
()
{
bind
(
Cat
.
class
).
in
(
Singleton
.
class
);
Multibinder
<
Animal
>
ab
=
Multibinder
.
newSetBinder
(
binder
(),
Animal
.
class
);
ab
.
addBinding
().
to
(
Dog
.
class
);
ab
.
addBinding
().
to
(
Cat
.
class
);
Multibinder
<
Cute
>
cb
=
Multibinder
.
newSetBinder
(
binder
(),
Cute
.
class
);
cb
.
addBinding
().
to
(
Cat
.
class
);
cb
.
addBinding
().
to
(
Banana
.
class
);
}
});
i
.
getInstance
(
Driver
.
class
).
run
();
// Dog isn't singleton scoped, so you get a different instance, but Cat is singleton,
// so you get the same value
System
.
out
.
println
(
i
.
getInstance
(
Key
.
get
(
new
TypeLiteral
<
Set
<
Animal
>>(){})));
}
public
void
run
()
{
System
.
out
.
println
(
animals
);
System
.
out
.
println
(
cute
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录