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