ClipMenu for MacOX (Updated 12/06/18 with new link)
Ditto for Windows
Error","ajp-nio-8015-exec-9","03/09/17","07:22:12",,"Application could not be found. The specific sequence of files included or processed is: '''' "
javax.servlet.ServletException: Application could not be found.
at coldfusion.rest.servlet.CFRestServlet.invoke(CFRestServlet.java:512)
at coldfusion.rest.servlet.RestFilter.invoke(RestFilter.java:60)
at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:94)
...
A quick Google search did not reveal much. However, the fact that it was calling the CFResetServlet gave me an idea. What if the /api directory now had special meaning? So I renamed the /api directory to /API-TEST and sure enough my code was working again.
<servlet-mapping id="coldfusion_mapping_16">
<servlet-name>CFRestServlet</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
This mapping is forcing everything in the /api directory to be processed by the ColdFusion REST service. To fix this, I simply commented out this section of the configuration and restarted the ColdFusion service.
<--
<servlet-mapping id="coldfusion_mapping_16">
<servlet-name>CFRestServlet</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
-->
<cffunction name="indentJSON" hint="Indents JSON to make it more readable">
<cfargument name="JSONString" default="" hint="JSON string to be formatted">
<cfargument name="indentCharacters" default="#Chr(9)#" hint="Character(s) to use for indention">
<cfset local.inQuotes = false>
<cfset local.indent = 0>
<cfset local.returnString = "">
<cfset local.stringLength = Len(arguments.JSONString)>
<cfloop index="i" from="1" to="#local.stringLength#">
<cfset local.currChar = Mid(arguments.JSONString, i, 1)>
<cfif i lt local.stringLength - 1>
<cfset local.nextChar = Mid(arguments.JSONString, i + 1, 1)>
<cfelse>
<cfset local.nextChar = "">
</cfif>
<cfif local.currChar eq '"'>
<cfset local.inQuotes = !local.inQuotes>
</cfif>
<cfif local.inQuotes>
<cfset local.returnString = local.returnString & local.currChar>
<cfelse>
<cfswitch expression="#local.currChar#">
<cfcase value="{">
<cfset local.indent = local.indent + 1>
<cfset local.returnString = local.returnString & "{" & Chr(10) & RepeatString(arguments.indentCharacters, local.indent)>
</cfcase>
<cfcase value="}">
<cfset local.indent = local.indent - 1>
<cfset local.returnString = local.returnString & Chr(10) & RepeatString(arguments.indentCharacters, local.indent) & "}">
<cfif local.nextChar neq ",">
<cfset local.returnString = local.returnString & Chr(10)>
</cfif>
</cfcase>
<cfcase value="," delimiters="Chr(0)">
<cfset local.returnString = local.returnString & "," & Chr(10) & RepeatString(arguments.indentCharacters, local.indent)>
</cfcase>
<cfcase value=":">
<cfif local.nextChar neq " ">
<cfset local.returnString = local.returnString & ": ">
</cfif>
</cfcase>
<cfdefaultcase>
<cfset local.returnString = local.returnString & local.currChar>
</cfdefaultcase>
</cfswitch>
</cfif>
</cfloop>
<cfreturn trim(local.returnString)>
</cffunction>
And here's an example:
<cfset variables.testObject = {}>
<cfset variables.testObject.name.first = "Chad">
<cfset variables.testObject.name.last = "Armond">
<cfset variables.testObject.title = "Software Developer">
<cfset variables.testString = SerializeJSON(variables.testObject)>
<cfoutput>
<h1>With Tabs (Default)</h1>
<cfset variables.json1 = indentJSON(variables.testString)>
<pre>#variables.json1#</pre>
<h1>With Spaces</h1>
<cfset variables.json2 = indentJSON(variables.testString, " ")>
<pre>#variables.json2#</pre>
</cfoutput>
And the results:
{
"NAME": {
"LAST": "Armond",
"FIRST": "Chad"
},
"TITLE": "Software Developer"
}
{
"NAME": {
"LAST": "Armond",
"FIRST": "Chad"
},
"TITLE": "Software Developer"
}
if (ref(@_[0]) eq "HASH") {
my %args = %{@_[0]};
foreach my $arg (keys %args) {
eval("\$$arg = \$args{\$arg}");
}
}
What this code snippet does is look at the first argument in the list to determine its type. If it's a HASH, then we know the arguments are being passed as named arguments. So we convert them using the eval function to look just like the old positional arguments.
sub test {
my ($arg1, $arg2, $arg3) = @_;
print "\$arg1 = $arg1\n";
print "\$arg2 = $arg2\n";
print "\$arg3 = $arg3\n";
}
To convert it, we just add the new code snippet in. Here's a test script to see it in action.
#!/usr/bin/perl
use strict;
&test("abc", "123", "xyz");
&test({
arg1 => 'abc',
arg2 => '123',
arg3 => 'xyz'
});
sub test {
my ($arg1, $arg2, $arg3) = @_;
if (ref(@_[0]) eq "HASH") {
my %args = %{@_[0]};
foreach my $arg (keys %args) {
eval("\$$arg = \$args{\$arg}");
}
}
print "\$arg1 = $arg1\n";
print "\$arg2 = $arg2\n";
print "\$arg3 = $arg3\n";
}
print &getHTMLHeader();
sub getHTMLHeader() {
return `wget -O - http://mysite/myheader.cfm`;
}
sub getHTMLHeader() {
open OUT, ">cookies.txt":
print OUT $ENV{'HTTP_COOKIE'};
close OUT;
return `wget --load-cookies=cookies.txt -O - http://mysite/myheader.cfm`;
}
sub getHTMLHeader() {
my $html = `wget -O - http://mysite/myheader.cfm`;
$html .= <<" END";
<script>
\$.ajax({
url: '/path/to/menu/menu.cfm',
async: false,
dataType: 'html',
success: function (data, textStatus, jqXHR) {
\$(".main-menu-content").html(data);
}
});
</script>
END
return $html;
}
Copyright © 2009 Chad's Tech Blog Powered by Blogger.
Blogger Templates designed by Deluxe Templates