Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
JavaLoader 1.1
JavaLoader 1.2
==============

JavaLoader is a library that has been built to ease the use, development and integration of Java within ColdFusion applications.
Expand Down
88 changes: 63 additions & 25 deletions javaloader/JavaLoader.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ Purpose: Utlitity class for loading Java Classes
instance.static.uuid = "A0608BEC-0AEB-B46A-0E1E1EC5F3CE7C9C";
</cfscript>

<cfimport taglib="tags" prefix="jl">

<!------------------------------------------- PUBLIC ------------------------------------------->

Expand Down Expand Up @@ -104,9 +103,9 @@ Purpose: Utlitity class for loading Java Classes

<cffunction name="switchThreadContextClassLoader" hint="Sometimes you will need to switch out the ThreadContextClassLoader with the classloader used by JavaLoader.<br/>
It has :
switchThreadContextClassLoader(function object, [classLoader=getURLClassLoader()])
switchThreadContextClassLoader(function name, [classLoader=getURLClassLoader()])
switchThreadContextClassLoader(object, function name, [classLoader=getURLClassLoader()])
switchThreadContextClassLoader(function object, [struct function arguments], [classLoader=getURLClassLoader()])
switchThreadContextClassLoader(function name, [struct function arguments], [classLoader=getURLClassLoader()])
switchThreadContextClassLoader(object, function name, [struct function arguments], [classLoader=getURLClassLoader()])
This method can be used in 3 different ways:
<ol>
<li>Pass it the UDF itself</li>
Expand All @@ -116,21 +115,61 @@ Purpose: Utlitity class for loading Java Classes
access="public" returntype="any" output="false">
<cfscript>
var local = {};
var func = 0; //need this as cf8 doesn't like the structure with functions.
var System = createObject("java", "java.lang.System");
var Thread = createObject("java", "java.lang.Thread");
var currentClassloader = Thread.currentThread().getContextClassLoader();

if(structCount(arguments) == 2 && !isSimpleValue(arguments[2]))
{
classLoader = arguments[2];
var classLoader = "";

if (structCount(arguments) == 4)
{
// the last 2 arguments are the function arguments and class loader
classLoader = arguments[4];
local.funcArgs = arguments[3];
}
else if (structCount(arguments) == 3)
{
// 2nd argument could be classloader or function arguments
if (isInstanceOf(arguments[2],"java.lang.ClassLoader"))
{
classLoader = arguments[2];
}
else if (isStruct(arguments[2]))
{
local.funcArgs = arguments[2];
}

// 3rd argument could be classloader or function arguments
if (isInstanceOf(arguments[3],"java.lang.ClassLoader"))
{
classLoader = arguments[3];
}
else if (isStruct(arguments[3]))
{
local.funcArgs = arguments[3];
}
}
else if (structCount(arguments) == 2)
{
// the 2nd argument could be a class loader or function arguments
if (isInstanceOf(arguments[2],"java.lang.ClassLoader"))
{
classLoader = arguments[2];
}
else if (isStruct(arguments[2]))
{
local.funcArgs = arguments[2];
}
}
else if(structCount(arguments) == 3)

if (!structKeyExists(local,"funcArgs"))
{
classLoader = arguments[3];
local.funcArgs = {};
}
else //assume we are still in JL

if (isSimpleValue(classLoader))
{
classLoader = getURLClassLoader();
classLoader = getURLClassLoader();
}
</cfscript>

Expand All @@ -140,14 +179,14 @@ Purpose: Utlitity class for loading Java Classes
</cfscript>

<cfif isSimpleValue(arguments[1])>
<cfinvoke method="#arguments[1]#" returnvariable="local.return" />
<cfinvoke method="#arguments[1]#" returnvariable="local.return" argumentCollection="#local.funcArgs#" />
<cfelseif isCustomFunction(arguments[1])>
<cfscript>
local.func = arguments[1];
local.return = local.func();
func = arguments[1];
local.return = func(argumentCollection = local.funcArgs);
</cfscript>
<cfelseif isObject(arguments[1]) AND isSimpleValue(arguments[2])>
<cfinvoke component="#arguments[1]#" method="#arguments[2]#" returnvariable="local.return" />
<cfinvoke component="#arguments[1]#" method="#arguments[2]#" returnvariable="local.return" argumentCollection="#local.funcArgs#" />
<cfelse>
<cfthrow type="javaloader.InvalidInvocationException" message="Unable to determine what method to invoke" detail="Please check the documentation for switchThreadContextClassLoader."/>
</cfif>
Expand All @@ -172,7 +211,7 @@ Purpose: Utlitity class for loading Java Classes
</cffunction>

<cffunction name="getVersion" hint="Retrieves the version of the loader you are using" access="public" returntype="string" output="false">
<cfreturn "1.1">
<cfreturn "1.2">
</cffunction>

<!------------------------------------------- PACKAGE ------------------------------------------->
Expand Down Expand Up @@ -275,7 +314,7 @@ Purpose: Utlitity class for loading Java Classes
for(; counter lte len; counter = counter + 1)
{
dir = directories[counter];
directoryCopy(dir, path);
$directoryCopy(dir, path);
}

//then we compile it, and grab that jar
Expand Down Expand Up @@ -330,10 +369,9 @@ Purpose: Utlitity class for loading Java Classes
var counter = 0;
</cfscript>

<!--- cf7 syntax. Yuck. --->
<cfloop from="1" to="#len#" index="counter">
<cfset dir = directories[counter]>
<jl:directory action="list" directory="#dir#" recurse="true"
<cfdirectory action="list" directory="#dir#" recurse="true"
type="file"
sort="dateLastModified desc"
name="qLastModified">
Expand Down Expand Up @@ -438,11 +476,11 @@ Purpose: Utlitity class for loading Java Classes
<cfdirectory action="list" name="qJars" directory="#path#" filter="*.jar" sort="name desc"/>
<cfloop query="qJars">
<cfscript>
libName = ListGetAt(name, 1, "-");
libName = ListGetAt(qJars.name, 1, "-");
//let's not use the lib's that have the same name, but a lower datestamp
if(NOT ListFind(jarList, libName))
{
ArrayAppend(aJars, path & "/" & name);
ArrayAppend(aJars, path & "/" & qJars.name);
jarList = ListAppend(jarList, libName);
}
</cfscript>
Expand Down Expand Up @@ -544,7 +582,7 @@ Copies a directory.
@author Joe Rinehart ([email protected])
@version 1, July 27, 2005
--->
<cffunction name="directoryCopy" access="private" output="true">
<cffunction name="$directoryCopy" access="private" output="true">
<cfargument name="source" required="true" type="string">
<cfargument name="destination" required="true" type="string">
<cfargument name="nameconflict" required="true" default="overwrite">
Expand All @@ -562,9 +600,9 @@ Copies a directory.
<cfif contents.type eq "file">
<cffile action="copy" source="#arguments.source#/#name#" destination="#arguments.destination#/#name#" nameconflict="#arguments.nameConflict#">
<cfelseif contents.type eq "dir">
<cfset directoryCopy(arguments.source & dirDelim & name, arguments.destination & dirDelim & name) />
<cfset $directoryCopy(arguments.source & dirDelim & name, arguments.destination & dirDelim & name) />
</cfif>
</cfloop>
</cffunction>

</cfcomponent>
</cfcomponent>
6 changes: 3 additions & 3 deletions javaloader/JavaProxy.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -121,16 +121,16 @@ Mark Mandel 27/08/2007 Created
</cffunction>

<cffunction name="_buildArgumentArray" hint="builds an argument array out of the arguments" access="private" returntype="array" output="false">
<cfargument name="arguments" hint="the arguments passed through" type="struct" required="Yes">
<cfargument name="args" hint="the arguments passed through" type="struct" required="Yes">
<cfscript>
var len = StructCount(arguments);
var len = StructCount(args);
var objArray = _getArray().newInstance(_getObjectClass(), len);
var counter = 1;
var obj = 0;

for(; counter <= len; counter++)
{
obj = arguments[counter];
obj = args[counter];
_getArray().set(objArray, counter - 1, obj);
}

Expand Down
6 changes: 3 additions & 3 deletions javaloader/readme.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
JavaLoader v1.0
JavaLoader v1.2
Author: Mark Mandel
Date: 10 September 2010
Date: 22 March 2017

Documentation can now be found at:
http://www.compoundtheory.com/javaloader/docs/
https://github.com/markmandel/JavaLoader/wiki
25 changes: 0 additions & 25 deletions javaloader/tags/directory.cfm

This file was deleted.

68 changes: 68 additions & 0 deletions unittests/load/SwitchThreadContextTest.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,66 @@
</cfscript>
</cffunction>

<cffunction name="testMixinApproachWithArguments" hint="testing using the mixing" access="public" returntype="void" output="false">
<cfscript>
var mixin = javaloader.switchThreadContextClassLoader;
var args = { arg1 = 1, arg2 = 2};
var result = mixin("returnCurrentClassLoaderAndArguments", args, javaloader.getURLClassLoader());
assertSame(javaloader.getURLClassLoader(), result.classLoader);
assertStructEquals(args, result.args);
</cfscript>
</cffunction>

<cffunction name="testPassUDFInWithArguments" hint="pass in a UDF with arguments" access="public" returntype="void" output="false">
<cfscript>
var args = { arg1 = 1, arg2 = 2};
var result = javaloader.switchThreadContextClassLoader(returnCurrentClassLoaderAndArguments, args);
assertSame(javaloader.getURLClassLoader(), result.classLoader);
assertStructEquals(args, result.args);
</cfscript>
</cffunction>

<cffunction name="testPassUDFInWithArgumentsWithCustomClassLoader" hint="pass in a UDF with arguments" access="public" returntype="void" output="false">
<cfscript>
var urlClassLoader = createObject("java", "java.net.URLClassLoader").init(ArrayNew(1));
var args = { arg1 = 1, arg2 = 2};
var result = javaloader.switchThreadContextClassLoader(returnCurrentClassLoaderAndArguments, args, urlClassLoader);
assertSame(urlClassLoader, result.classLoader);
assertStructEquals(args, result.args);
</cfscript>
</cffunction>

<cffunction name="testPassObjectAndMethodNameWithArguments" hint="pass in the object and method name with arguments" access="public" returntype="void" output="false">
<cfscript>
var local = {};
local.class = getMetadata(this).name;
local.object = createObject("component", local.class);
local.args = { arg1 = 1, arg2 = 2};

makePublic(local.object, "returnCurrentClassLoaderAndArguments");

local.result = javaloader.switchThreadContextClassLoader(local.object, "returnCurrentClassLoaderAndArguments", local.args);
assertSame(javaloader.getURLClassLoader(), local.result.classLoader);
assertStructEquals(local.args, local.result.args);
</cfscript>
</cffunction>

<cffunction name="testPassObjectAndMethodNameWithArgumentsWithCustomClassLoader" hint="pass in the object and method name with arguments, with a custom classloader" access="public" returntype="void" output="false">
<cfscript>
var local = {};
local.class = getMetadata(this).name;
local.object = createObject("component", local.class);
local.urlClassLoader = createObject("java", "java.net.URLClassLoader").init(ArrayNew(1));
local.args = { arg1 = 1, arg2 = 2};

makePublic(local.object, "returnCurrentClassLoaderAndArguments");

local.result = javaloader.switchThreadContextClassLoader(local.object, "returnCurrentClassLoaderAndArguments", local.args, local.urlClassLoader);
assertSame(local.urlClassLoader, local.result.classLoader);
assertStructEquals(local.args, local.result.args);
</cfscript>
</cffunction>

<!------------------------------------------- PACKAGE ------------------------------------------->

<!------------------------------------------- PRIVATE ------------------------------------------->
Expand All @@ -78,4 +138,12 @@
</cfscript>
</cffunction>

<cffunction name="returnCurrentClassLoaderAndArguments" hint="returns the current contexts classloader and any arguments passed in" access="private" returntype="any" output="false">
<cfscript>
var Thread = createObject("java", "java.lang.Thread");
var result = { classLoader = Thread.currentThread().getContextClassLoader(), args = arguments };
return result;
</cfscript>
</cffunction>

</cfcomponent>
2 changes: 1 addition & 1 deletion unittests/src/spring/ut3/default.properties
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
#Default Properties
#Tue Jan 31 18:41:16 EST 2012
#Fri Mar 09 22:38:00 EST 2012
rootPath=/mnt/hgfs/wwwroot/javaloader/