ColdFusion
September 10, 2011
Unzip files with ColdFusion MX 7 using native Java classes
This week I had to unzip some files using ColdFusion 7 (I know it’s ancient technology) and I realised that CF7 doesn’t natively support zipping/unzipping of files! Fortunately, ColdFusion can utilise the underlying power of Java to achieve this. I found this neat Java article – Unzipping Files with java.util.zip.ZipFile and simply translated it into ColdFusion 7.
Here is the ColdFusion version that works well on CFMX7:
<cfparam name="dest" default="/path_to_extract/"> <cffunction name="getByteArray" access="private" returnType="binary" output="no"> <cfargument name="size" type="numeric" required="true"/> <cfset var emptyByteArray = createObject("java", "java.io.ByteArrayOutputStream").init().toByteArray()/> <cfset var byteClass = emptyByteArray.getClass().getComponentType()/> <cfset var byteArray = createObject("java","java.lang.reflect.Array").newInstance(byteClass, arguments.size)/> <cfreturn byteArray /> </cffunction> <cfscript> if(structKeyExists(form,"myFile") and len(form.myFile)) { content = ArrayNew(1); FileOutputStream = createObject('java',"java.io.FileOutputStream"); BufferedOutputStream = createObject('java',"java.io.BufferedOutputStream"); ZipFile = createObject('java',"java.util.zip.ZipFile"); ioFile = createObject('java',"java.io.File"); Byte = createObject('java',"java.lang.Byte"); buffer = getByteArray(1024); length = 0; zipFileName = form.myFile; zFile = ZipFile.init(zipFileName); entries = zFile.entries(); while(entries.hasMoreElements()) { entry = entries.nextElement(); if(entry.isDirectory()) { // Assume directories are stored parents first then children. ioFile.init(dest & entry.getName()).mkdir(); continue; } in = zipFile.getInputStream(entry); out = BufferedOutputStream.init(FileOutputStream.init(dest & entry.getName())); length = in.read(buffer); while(length gte 0) { out.write(buffer, 0, length); length = in.read(buffer); } in.close(); out.close(); } zFile.close(); //loop tghrough content array and decrypt } </cfscript> <form name="myForm" method="POST" action="zip.cfm" enctype="multipart/form-data"> <input type="file" name="myfile" /> <input type="submit" name="submit" value="Upload" /> </form>
Cheers
Top
MarkoSeptember 30, 2010
Monitor Railo on Tomcat using JConsole
At Learnosity, I’ve been trying to get to the bottom of a “Java Heap Space” error on my local Railo installation and decided to use JConsole to monitor Tomcat server. JConsole is a very useful Java application monitoring tool, which is bundled into every JRE. You can run it by simply executing jconsole binary:
$JAVA_HOME/bin/jconsole
Where $JAVA_HOME is the path to your Java installation.
By default, JConsole picks up all local Java processes, which you can monitor individually. Unfortunately, Tomcat doesn’t seem to be listed under local processes and I had to use remote connection instead. The way to connect to Tomcat with JConsole is a little tricky and this is what you need to do:
You need to tell Tomcat to accept clients on TCP port 8999, on the host “localhost”, without authentication.
DO NOT disable remote authentication in production environment. It should only be done for testing purposes in development/staging environments. closeTo translate this into code, set CATALINA_HOME environment variable to this:
$CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=localhost"; $ export CATALINA_OPTS;
(Re)start Tomcat and you should now be able to monitor it on localhost:8999
Top
Here are some JConsole screen shots:


References:
Monitoring Tomcat with JMX
Using JConsole to Monitor Applications