Author: wkeil Date: Thu Aug 18 18:57:31 2016 New Revision: 1756838 URL: http://svn.apache.org/viewvc?rev=1756838&view=rev Log: DMAP-195: Remote JAR
Task-Url: https://issues.apache.org/jira/browse/DMAP-195 Added: devicemap/whiteboard/devicemap-remote-jar/ (with props) devicemap/whiteboard/devicemap-remote-jar/.classpath devicemap/whiteboard/devicemap-remote-jar/.project devicemap/whiteboard/devicemap-remote-jar/.settings/ devicemap/whiteboard/devicemap-remote-jar/.settings/org.eclipse.jdt.core.prefs devicemap/whiteboard/devicemap-remote-jar/src/ devicemap/whiteboard/devicemap-remote-jar/src/com/ devicemap/whiteboard/devicemap-remote-jar/src/com/foo/ devicemap/whiteboard/devicemap-remote-jar/src/com/foo/ClasspathReader.java devicemap/whiteboard/devicemap-remote-jar/src/org/ devicemap/whiteboard/devicemap-remote-jar/src/org/apache/ devicemap/whiteboard/devicemap-remote-jar/src/org/apache/devicemap/ devicemap/whiteboard/devicemap-remote-jar/src/org/apache/devicemap/example/ devicemap/whiteboard/devicemap-remote-jar/src/org/apache/devicemap/example/RemoteJar.java Propchange: devicemap/whiteboard/devicemap-remote-jar/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Thu Aug 18 18:57:31 2016 @@ -0,0 +1 @@ +bin Added: devicemap/whiteboard/devicemap-remote-jar/.classpath URL: http://svn.apache.org/viewvc/devicemap/whiteboard/devicemap-remote-jar/.classpath?rev=1756838&view=auto ============================================================================== --- devicemap/whiteboard/devicemap-remote-jar/.classpath (added) +++ devicemap/whiteboard/devicemap-remote-jar/.classpath Thu Aug 18 18:57:31 2016 @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="src" path="src"/> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/> + <classpathentry kind="output" path="bin"/> +</classpath> Added: devicemap/whiteboard/devicemap-remote-jar/.project URL: http://svn.apache.org/viewvc/devicemap/whiteboard/devicemap-remote-jar/.project?rev=1756838&view=auto ============================================================================== --- devicemap/whiteboard/devicemap-remote-jar/.project (added) +++ devicemap/whiteboard/devicemap-remote-jar/.project Thu Aug 18 18:57:31 2016 @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>devicemap-remote-jar</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> Added: devicemap/whiteboard/devicemap-remote-jar/.settings/org.eclipse.jdt.core.prefs URL: http://svn.apache.org/viewvc/devicemap/whiteboard/devicemap-remote-jar/.settings/org.eclipse.jdt.core.prefs?rev=1756838&view=auto ============================================================================== --- devicemap/whiteboard/devicemap-remote-jar/.settings/org.eclipse.jdt.core.prefs (added) +++ devicemap/whiteboard/devicemap-remote-jar/.settings/org.eclipse.jdt.core.prefs Thu Aug 18 18:57:31 2016 @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 Added: devicemap/whiteboard/devicemap-remote-jar/src/com/foo/ClasspathReader.java URL: http://svn.apache.org/viewvc/devicemap/whiteboard/devicemap-remote-jar/src/com/foo/ClasspathReader.java?rev=1756838&view=auto ============================================================================== --- devicemap/whiteboard/devicemap-remote-jar/src/com/foo/ClasspathReader.java (added) +++ devicemap/whiteboard/devicemap-remote-jar/src/com/foo/ClasspathReader.java Thu Aug 18 18:57:31 2016 @@ -0,0 +1,249 @@ +package com.foo; + +import java.io.File; +import java.io.FileReader; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.URI; +import java.net.URL; +import java.util.Enumeration; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +/** +* Prototype resource reader. +* This prototype is devoid of error checking. +* +* +* I have two prototype jar files that I have setup. +* <pre> +* <dependency> +* <groupId>invoke</groupId> +* <artifactId>invoke</artifactId> +* <version>1.0-SNAPSHOT</version> +* </dependency> +* +* <dependency> +* <groupId>node</groupId> +* <artifactId>node</artifactId> +* <version>1.0-SNAPSHOT</version> +* </dependency> +* </pre> +* The jar files each have a file under /org/node/ called resource.txt. +* <br /> +* This is just a prototype of what a handler would look like with classpath:// +* I also have a resource.foo.txt in my local resources for this project. +* <br /> +*/ +public class ClasspathReader { + + public static void main(String[] args) throws Exception { + + /* This project includes two jar files that each have a resource located + in /org/node/ called resource.txt. + */ + + + /* + Name space is just a device I am using to see if a file in a dir + starts with a name space. Think of namespace like a file extension + but it is the start of the file not the end. + */ + String namespace = "resource"; + + //someResource is classpath. + String someResource = args.length > 0 ? args[0] : + //"classpath:///org/node/resource.txt"; It works with files + "classpath:///org/node/"; //It also works with directories + + URI someResourceURI = URI.create(someResource); + + System.out.println("URI of resource = " + someResourceURI); + + someResource = someResourceURI.getPath(); + + System.out.println("PATH of resource =" + someResource); + + boolean isDir = !someResource.endsWith(".txt"); + + + /** Classpath resource can never really start with a starting slash. + * Logically they do, but in reality you have to strip it. + * This is a known behavior of classpath resources. + * It works with a slash unless the resource is in a jar file. + * Bottom line, by stripping it, it always works. + */ + if (someResource.startsWith("/")) { + someResource = someResource.substring(1); + } + + /* Use the ClassLoader to lookup all resources that have this name. + Look for all resources that match the location we are looking for. */ + Enumeration resources = null; + + /* Check the context classloader first. Always use this if available. */ + try { + resources = + Thread.currentThread().getContextClassLoader().getResources(someResource); + } catch (Exception ex) { + ex.printStackTrace(); + } + + if (resources == null || !resources.hasMoreElements()) { + resources = ClasspathReader.class.getClassLoader().getResources(someResource); + } + + //Now iterate over the URLs of the resources from the classpath + while (resources.hasMoreElements()) { + URL resource = (URL) resources.nextElement(); + + + /* if the resource is a file, it just means that we can use normal mechanism + to scan the directory. + */ + if (resource.getProtocol().equals("file")) { + //if it is a file then we can handle it the normal way. + handleFile(resource, namespace); + continue; + } + + System.out.println("Resource " + resource); + + /* + + Split up the string that looks like this: + jar:file:/Users/rick/.m2/repository/invoke/invoke/1.0-SNAPSHOT/invoke-1.0-SNAPSHOT.jar!/org/node/ + into + this /Users/rick/.m2/repository/invoke/invoke/1.0-SNAPSHOT/invoke-1.0-SNAPSHOT.jar + and this + /org/node/ + */ + String[] split = resource.toString().split(":"); + String[] split2 = split[2].split("!"); + String zipFileName = split2[0]; + String sresource = split2[1]; + + System.out.printf("After split zip file name = %s," + + " \nresource in zip %s \n", zipFileName, sresource); + + + /* Open up the zip file. */ + ZipFile zipFile = new ZipFile(zipFileName); + + + /* Iterate through the entries. */ + Enumeration<? extends ZipEntry> entries = zipFile.entries(); + + while (entries.hasMoreElements()) { + ZipEntry entry = entries.nextElement(); + /* If it is a directory, then skip it. */ + if (entry.isDirectory()) { + continue; + } + + String entryName = entry.getName(); + System.out.printf("zip entry name %s \n", entryName); + + /* If it does not start with our someResource String + then it is not our resource so continue. + */ + if (!entryName.startsWith(someResource)) { + continue; + } + + + /* the fileName part from the entry name. + * where /foo/bar/foo/bee/bar.txt, bar.txt is the file + */ + String fileName = entryName.substring(entryName.lastIndexOf("/") + 1); + System.out.printf("fileName %s \n", fileName); + + /* See if the file starts with our namespace and ends with our extension. + */ + if (fileName.startsWith(namespace) && fileName.endsWith(".txt")) { + + + /* If you found the file, print out + the contents fo the file to System.out.*/ + try (Reader reader = new InputStreamReader(zipFile.getInputStream(entry))) { + StringBuilder builder = new StringBuilder(); + int ch = 0; + while ((ch = reader.read()) != -1) { + builder.append((char) ch); + + } + System.out.printf("zip fileName = %s\n\n####\n contents of file %s\n###\n", entryName, builder); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + //use the entry to see if it's the file '1.txt' + //Read from the byte using file.getInputStream(entry) + } + + } + + + } + + /** + * The file was on the file system not a zip file, + * this is here for completeness for this example. + * otherwise. + * + * @param resource + * @param namespace + * @throws Exception + */ + private static void handleFile(URL resource, String namespace) throws Exception { + System.out.println("Handle this resource as a file " + resource); + URI uri = resource.toURI(); + File file = new File(uri.getPath()); + + + if (file.isDirectory()) { + for (File childFile : file.listFiles()) { + if (childFile.isDirectory()) { + continue; + } + String fileName = childFile.getName(); + if (fileName.startsWith(namespace) && fileName.endsWith("txt")) { + + try (FileReader reader = new FileReader(childFile)) { + StringBuilder builder = new StringBuilder(); + int ch = 0; + while ((ch = reader.read()) != -1) { + builder.append((char) ch); + + } + System.out.printf("fileName = %s\n\n####\n contents of file %s\n###\n", childFile, builder); + } catch (Exception ex) { + ex.printStackTrace(); + } + + } + + } + } else { + String fileName = file.getName(); + if (fileName.startsWith(namespace) && fileName.endsWith("txt")) { + + try (FileReader reader = new FileReader(file)) { + StringBuilder builder = new StringBuilder(); + int ch = 0; + while ((ch = reader.read()) != -1) { + builder.append((char) ch); + + } + System.out.printf("fileName = %s\n\n####\n contents of file %s\n###\n", fileName, builder); + } catch (Exception ex) { + ex.printStackTrace(); + } + + } + + } + } + +} \ No newline at end of file Added: devicemap/whiteboard/devicemap-remote-jar/src/org/apache/devicemap/example/RemoteJar.java URL: http://svn.apache.org/viewvc/devicemap/whiteboard/devicemap-remote-jar/src/org/apache/devicemap/example/RemoteJar.java?rev=1756838&view=auto ============================================================================== --- devicemap/whiteboard/devicemap-remote-jar/src/org/apache/devicemap/example/RemoteJar.java (added) +++ devicemap/whiteboard/devicemap-remote-jar/src/org/apache/devicemap/example/RemoteJar.java Thu Aug 18 18:57:31 2016 @@ -0,0 +1,5 @@ +package org.apache.devicemap.example; + +public class RemoteJar { + +}
