You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devicemap.apache.org by wk...@apache.org on 2016/08/18 18:57:31 UTC

svn commit: r1756838 - in /devicemap/whiteboard/devicemap-remote-jar: ./ .settings/ src/ src/com/ src/com/foo/ src/org/ src/org/apache/ src/org/apache/devicemap/ src/org/apache/devicemap/example/

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 {
+
+}