-
Notifications
You must be signed in to change notification settings - Fork 4
/
JavaLoaderFactoryBean.cfc
167 lines (121 loc) · 4.42 KB
/
JavaLoaderFactoryBean.cfc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/*
Title: JavaLoaderFactoryBean.cfc
Web site: https://github.com/jamiekrug/JavaLoaderFactory
Author: Jamie Krug
http://identi.ca/jamiekrug
http://twitter.com/jamiekrug
http://jamiekrug.com/blog/
Purpose: ColdSpring factory bean to provide facade to server-scoped JavaLoader instance.
Example ColdSpring bean factory configuration:
<bean id="javaLoader" class="JavaLoaderFactory.JavaLoaderFactoryBean">
<property name="loadRelativePaths">
<list>
<value>/../jars/opencsv-2.2.jar</value>
</list>
</property>
<property name="loadPaths">
<list>
<value>/opt/XOM/xom-1.2.6.jar</value>
</list>
</property>
</bean>
Example usage:
javaLoader = getBeanFactory().getBean( 'javaLoader' );
csvReader = javaLoader.create( 'au.com.bytecode.opencsv.CSVReader' );
*/
component extends="coldspring.beans.factory.FactoryBean" accessors="true"
{
property name="loadRelativePaths" type="array"
hint="Relative paths that will be expanded and appended to loadPaths.";
property name="lockTimeout" type="numeric" default="60"
hint="Timeout, in seconds, for named lock used when instantiating JavaLoader instance in server scope.";
property name="objectType" type="string" default="javaloader.JavaLoader"
hint="Component path to JavaLoader, to allow for a non-standard CFC location (default is javaloader.JavaLoader).";
property name="serverKey" type="string"
hint="Server struct key to hold JavaLoader instance; recommend **not** specifying this argument, but it's here if you really want it.";
property name="loadPaths" type="array" hint="See JavaLoader:init()";
property name="loadColdFusionClassPath" type="boolean" hint="See JavaLoader:init()";
property name="parentClassLoader" type="string" hint="See JavaLoader:init()";
property name="sourceDirectories" type="array" hint="See JavaLoader:init()";
property name="compileDirectory" type="string" hint="See JavaLoader:init()";
property name="trustedSource" type="boolean" hint="See JavaLoader:init()";
property name="loadRelativePaths" type="array" hint="See JavaLoader:init()";
/********** CONSTRUCTOR ***************************************************/
function init()
hint="Constructor"
{
return this;
}
/********** PUBLIC ********************************************************/
function getObject()
hint="Create/return server-scoped JavaLoader instance."
{
initLoadPaths();
initServerKey();
if ( !structKeyExists( server, getServerKey() ) )
{
lock name="#getLockName()#" timeout="#getLockTimeout()#"
{
if ( !structKeyExists( server, getServerKey() ) )
server[ getServerKey() ] = createObject( "component", getObjectType() ).init( argumentCollection = getJavaLoaderInitArgs() );
}
}
return server[ getServerKey() ];
}
string function getObjectType()
{
return variables.objectType;
}
boolean function isSingleton()
{
return true;
}
/********** PRIVATE *******************************************************/
private string function createServerKey()
hint="Create a server key unique to JavaLoader instance by hashing init args and objectType."
{
return hash( serializeJSON( { '#getObjectType()#' = getJavaLoaderInitArgs() } ) );
}
private struct function getJavaLoaderInitArgs()
hint="Argument collection for JavaLoader:init()."
{
return {
loadPaths = getLoadPaths(),
loadColdFusionClassPath = getLoadColdFusionClassPath(),
parentClassLoader = getParentClassLoader(),
sourceDirectories = getSourceDirectories(),
compileDirectory = getCompileDirectory(),
trustedSource = getTrustedSource()
};
}
private string function getLockName()
{
return 'server.#getServerKey()#';
}
private void function initLoadPaths()
hint="Initialize JavaLoader load paths by appending any relative paths (loadRelativePaths), expanded, to any absolute paths (loadPaths)."
{
if ( !isNull( getLoadRelativePaths() ) )
{
var loadPaths = [];
if ( !isNull( getLoadPaths() ) )
{
loadPaths = getLoadPaths();
}
for ( var relPath in getLoadRelativePaths() )
{
arrayAppend( loadPaths, expandPath( relPath ) );
}
setLoadPaths( loadPaths );
setLoadRelativePaths( [] );
}
}
private void function initServerKey()
hint="Initialize server key name to hold JavaLoader instance, if not explicitly provided."
{
if ( isNull( getServerKey() ) )
{
setServerKey( createServerKey() );
}
}
}