[jboss-cvs] JBossAS SVN: r86761 - in projects/reloaded/trunk: embedded and 14 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Apr 3 14:42:01 EDT 2009


Author: wolfc
Date: 2009-04-03 14:42:01 -0400 (Fri, 03 Apr 2009)
New Revision: 86761

Added:
   projects/reloaded/trunk/embedded/
   projects/reloaded/trunk/embedded/.classpath
   projects/reloaded/trunk/embedded/.project
   projects/reloaded/trunk/embedded/.settings/
   projects/reloaded/trunk/embedded/.settings/org.eclipse.jdt.core.prefs
   projects/reloaded/trunk/embedded/.settings/org.maven.ide.eclipse.prefs
   projects/reloaded/trunk/embedded/pom.xml
   projects/reloaded/trunk/embedded/src/
   projects/reloaded/trunk/embedded/src/main/
   projects/reloaded/trunk/embedded/src/main/java/
   projects/reloaded/trunk/embedded/src/main/java/org/
   projects/reloaded/trunk/embedded/src/main/java/org/jboss/
   projects/reloaded/trunk/embedded/src/main/java/org/jboss/reloaded/
   projects/reloaded/trunk/embedded/src/main/java/org/jboss/reloaded/embedded/
   projects/reloaded/trunk/embedded/src/main/java/org/jboss/reloaded/embedded/jarboot/
   projects/reloaded/trunk/embedded/src/main/java/org/jboss/reloaded/embedded/jarboot/JarBoot.java
   projects/reloaded/trunk/embedded/src/main/java/org/jboss/reloaded/embedded/lang/
   projects/reloaded/trunk/embedded/src/main/java/org/jboss/reloaded/embedded/lang/vfs/
   projects/reloaded/trunk/embedded/src/main/java/org/jboss/reloaded/embedded/lang/vfs/VFSClassLoader.java
   projects/reloaded/trunk/embedded/src/main/resources/
   projects/reloaded/trunk/embedded/src/main/resources/META-INF/
   projects/reloaded/trunk/embedded/src/main/resources/META-INF/jarboot.properties
   projects/reloaded/trunk/embedded/src/test/
   projects/reloaded/trunk/embedded/src/test/java/
Log:
RELOADED-7: created a Reloaded Embedded


Property changes on: projects/reloaded/trunk/embedded
___________________________________________________________________
Name: svn:ignore
   + target
eclipse-target


Added: projects/reloaded/trunk/embedded/.classpath
===================================================================
--- projects/reloaded/trunk/embedded/.classpath	                        (rev 0)
+++ projects/reloaded/trunk/embedded/.classpath	2009-04-03 18:42:01 UTC (rev 86761)
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src/main/java"/>
+	<classpathentry excluding="**/*.java" kind="src" path="src/main/resources"/>
+	<classpathentry kind="src" output="eclipse-target/test-classes" path="src/test/java"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.5.0_15"/>
+	<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
+	<classpathentry kind="output" path="eclipse-target/classes"/>
+</classpath>

Added: projects/reloaded/trunk/embedded/.project
===================================================================
--- projects/reloaded/trunk/embedded/.project	                        (rev 0)
+++ projects/reloaded/trunk/embedded/.project	2009-04-03 18:42:01 UTC (rev 86761)
@@ -0,0 +1,17 @@
+<projectDescription>
+  <name>jboss-reloaded-embedded</name>
+  <comment>Boot up VDF with just a single jar.</comment>
+  <projects/>
+  <buildSpec>
+    <buildCommand>
+      <name>org.eclipse.jdt.core.javabuilder</name>
+    </buildCommand>
+    <buildCommand>
+      <name>org.maven.ide.eclipse.maven2Builder</name>
+    </buildCommand>
+  </buildSpec>
+  <natures>
+    <nature>org.eclipse.jdt.core.javanature</nature>
+    <nature>org.maven.ide.eclipse.maven2Nature</nature>
+  </natures>
+</projectDescription>
\ No newline at end of file

Added: projects/reloaded/trunk/embedded/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- projects/reloaded/trunk/embedded/.settings/org.eclipse.jdt.core.prefs	                        (rev 0)
+++ projects/reloaded/trunk/embedded/.settings/org.eclipse.jdt.core.prefs	2009-04-03 18:42:01 UTC (rev 86761)
@@ -0,0 +1,5 @@
+#Fri Apr 03 13:14:18 CEST 2009
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5

Added: projects/reloaded/trunk/embedded/.settings/org.maven.ide.eclipse.prefs
===================================================================
--- projects/reloaded/trunk/embedded/.settings/org.maven.ide.eclipse.prefs	                        (rev 0)
+++ projects/reloaded/trunk/embedded/.settings/org.maven.ide.eclipse.prefs	2009-04-03 18:42:01 UTC (rev 86761)
@@ -0,0 +1,8 @@
+#Fri Apr 03 13:37:27 CEST 2009
+activeProfiles=eclipse
+eclipse.preferences.version=1
+fullBuildGoals=process-test-resources
+includeModules=false
+resolveWorkspaceProjects=true
+resourceFilterGoals=process-resources resources\:testResources
+version=1

Added: projects/reloaded/trunk/embedded/pom.xml
===================================================================
--- projects/reloaded/trunk/embedded/pom.xml	                        (rev 0)
+++ projects/reloaded/trunk/embedded/pom.xml	2009-04-03 18:42:01 UTC (rev 86761)
@@ -0,0 +1,79 @@
+<!-- 
+  vi:ts=2:sw=2:expandtab 
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <parent>
+    <groupId>org.jboss.reloaded</groupId>
+    <artifactId>jboss-reloaded-build</artifactId>
+    <version>0.1.0-SNAPSHOT</version>
+    <relativePath>../build/pom.xml</relativePath>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>jboss-reloaded-embedded</artifactId>
+  <version>0.1.0-SNAPSHOT</version>
+  <packaging>jar</packaging>
+  <name>JBoss Reloaded Embedded VDF Bootstrap</name>
+  <url>http://www.jboss.org</url>
+  <description>
+    Boot up VDF with just a single jar.
+  </description>
+  
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>unpack</id>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+            </configuration>
+          </execution>
+          <execution>
+            <id>unpack-dependencies</id>
+            <goals>
+              <goal>unpack-dependencies</goal>
+            </goals>
+            <configuration>
+              <includeScope>runtime</includeScope>
+            </configuration>
+          </execution>
+        </executions>
+        <configuration>
+          <artifactItems>
+            <artifactItem>
+              <groupId>org.jboss.reloaded</groupId>
+              <artifactId>jboss-reloaded-vdf-bootstrap</artifactId>
+              <classifier>dist</classifier>
+              <type>zip</type>
+              <version>0.1.0-SNAPSHOT</version>
+            </artifactItem>
+          </artifactItems>
+          <!-- make sure it works under eclipse profile -->
+          <markersDirectory>${project.build.outputDirectory}/../dependency-maven-plugin-markers</markersDirectory>
+          <stripVersion>true</stripVersion>
+        </configuration>
+      </plugin>
+      <plugin>
+        <artifactId>maven-jar-plugin</artifactId>
+        <configuration>
+          <archive>
+            <manifest>
+              <mainClass>org.jboss.reloaded.embedded.jarboot.JarBoot</mainClass>
+            </manifest>
+          </archive>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  
+  <dependencies>
+    <dependency>
+      <groupId>org.jboss</groupId>
+      <artifactId>jboss-vfs</artifactId>
+      <version>2.2.0-SNAPSHOT</version>
+    </dependency>
+  </dependencies>
+</project>

Added: projects/reloaded/trunk/embedded/src/main/java/org/jboss/reloaded/embedded/jarboot/JarBoot.java
===================================================================
--- projects/reloaded/trunk/embedded/src/main/java/org/jboss/reloaded/embedded/jarboot/JarBoot.java	                        (rev 0)
+++ projects/reloaded/trunk/embedded/src/main/java/org/jboss/reloaded/embedded/jarboot/JarBoot.java	2009-04-03 18:42:01 UTC (rev 86761)
@@ -0,0 +1,182 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.reloaded.embedded.jarboot;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import java.util.StringTokenizer;
+import java.util.jar.Attributes;
+import java.util.jar.JarInputStream;
+import java.util.jar.Manifest;
+
+import org.jboss.reloaded.embedded.lang.vfs.VFSClassLoader;
+import org.jboss.virtual.VFS;
+import org.jboss.virtual.VirtualFile;
+import org.jboss.virtual.spi.cache.VFSCacheFactory;
+
+/**
+ * @author <a href="mailto:cdewolf at redhat.com">Carlo de Wolf</a>
+ * @version $Revision: $
+ */
+public class JarBoot
+{
+   public static final String JARBOOT_PROPERTIES = "jarboot.properties";
+   
+   public static final String BOOT_PROPERTY = "boot";
+   
+   private static boolean debug = false;
+   
+   static
+   {
+      debug = Boolean.getBoolean("jarboot.debug");
+   }
+   
+   private static void debug(String s)
+   {
+      if(debug)
+         System.err.println(s);
+   }
+   
+   private static URL getResource(String name) throws IOException, URISyntaxException
+   {
+      ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+      URL url = classLoader.getResource(name);
+      if(url == null)
+         return null;
+      
+      debug("JarBoot.getResource: url = " + url);
+      
+      VirtualFile file = VFS.getRoot(url);
+      debug("JarBoot.getResource: " + file.toURL());
+      return file.toURL();
+//      return url;
+   }
+   
+   public static void main(String args[]) throws Exception
+   {
+      VFSCacheFactory.getInstance("org.jboss.virtual.plugins.cache.IterableTimedVFSCache");
+      VFS.init();
+      
+      //ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+      
+      String resourceName = "META-INF/" + JARBOOT_PROPERTIES;
+      URL jarBootURL = getResource(resourceName);
+      if(jarBootURL == null)
+         throw new IllegalStateException("Resource '" + resourceName + "' could not be found");
+      
+      debug("JarBoot.main: jarBootURL = " + jarBootURL);
+      
+      Properties props = new Properties();
+      InputStream in = jarBootURL.openStream();
+      try
+      {
+         props.load(new BufferedInputStream(in));
+      }
+      finally
+      {
+         in.close();
+      }
+      
+      String boot = props.getProperty(BOOT_PROPERTY);
+      if(boot == null)
+         throw new IllegalStateException("Property " + BOOT_PROPERTY + " was not specified in " + jarBootURL);
+      
+      URL bootJarURL = getResource(boot);
+      if(bootJarURL == null)
+         throw new IllegalStateException("Boot jar '" + boot + "' could not be found");
+      
+      String s = bootJarURL.toExternalForm();
+      debug("JarBoot.main: s = " + s);
+      URL context = new URL(s.substring(0, s.length() - boot.length()));
+      debug("JarBoot.main: context = " + context);
+      
+      Manifest mf;
+      JarInputStream jis = new JarInputStream(new BufferedInputStream(bootJarURL.openStream()));
+      try
+      {
+         mf = jis.getManifest();
+      }
+      finally
+      {
+         jis.close();
+      }
+      if(mf == null)
+         throw new IllegalStateException("Boot jar " + bootJarURL + " does not contain a manifest");
+      
+      Attributes attrs = mf.getMainAttributes();
+      String mainClassName = attrs.getValue("Main-Class");
+      if(mainClassName == null)
+         throw new IllegalStateException("Manifest of boot jar " + bootJarURL + " does not contain a Main-Class");
+      
+      List<URL> urls = new ArrayList<URL>();
+      urls.add(bootJarURL);
+      String classPath = attrs.getValue("Class-Path");
+      if(classPath != null)
+      {
+         StringTokenizer st = new StringTokenizer(classPath, " ");
+         while(st.hasMoreTokens())
+         {
+            String spec = st.nextToken();
+            URL url = new URL(context, spec + "/");
+            debug("JarBoot.main: url = " + url);
+            urls.add(url);
+         }
+      }
+      
+      URLClassLoader nextClassLoader = new VFSClassLoader(urls.toArray(new URL[0]), null);
+      Class<?> mainClass;
+      try
+      {
+         mainClass = nextClassLoader.loadClass(mainClassName);
+      }
+      catch(ClassNotFoundException e)
+      {
+         throw new ClassNotFoundException(mainClassName + " in " + urls, e);
+      }
+      
+      Method mainMethod = mainClass.getMethod("main", String[].class);
+      
+      Object a[] = { args };
+      try
+      {
+         mainMethod.invoke(null, a);
+      }
+      catch(InvocationTargetException e)
+      {
+         Throwable cause = e.getCause();
+         if(cause instanceof Error)
+            throw (Error) cause;
+         if(cause instanceof RuntimeException)
+            throw (RuntimeException) cause;
+         throw (Exception) cause;
+      }
+   }
+}

Added: projects/reloaded/trunk/embedded/src/main/java/org/jboss/reloaded/embedded/lang/vfs/VFSClassLoader.java
===================================================================
--- projects/reloaded/trunk/embedded/src/main/java/org/jboss/reloaded/embedded/lang/vfs/VFSClassLoader.java	                        (rev 0)
+++ projects/reloaded/trunk/embedded/src/main/java/org/jboss/reloaded/embedded/lang/vfs/VFSClassLoader.java	2009-04-03 18:42:01 UTC (rev 86761)
@@ -0,0 +1,213 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.reloaded.embedded.lang.vfs;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.security.CodeSigner;
+import java.security.CodeSource;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
+import java.util.jar.Attributes.Name;
+
+import org.jboss.virtual.VFS;
+import org.jboss.virtual.VirtualFile;
+
+/**
+ * @author <a href="mailto:cdewolf at redhat.com">Carlo de Wolf</a>
+ * @version $Revision: $
+ */
+public class VFSClassLoader extends URLClassLoader
+{
+   private Map<URL, VirtualFile> cache = new HashMap<URL, VirtualFile>();
+   
+   public VFSClassLoader(URL urls[], ClassLoader parent) throws IOException
+   {
+      super(urls, parent);
+
+      for(URL url : urls)
+      {
+         String protocol = url.getProtocol();
+         if(protocol.startsWith("vfs"))
+         {
+            cache.put(url, VFS.getRoot(url));
+         }
+      }
+   }
+   
+   protected Class<?> defineClass(String name, URL url, VirtualFile resource) throws IOException
+   {
+      int i = name.lastIndexOf('.');
+      if(i != -1)
+      {
+         String pkgname = name.substring(0, i);
+         // Check if package already loaded.
+         Package pkg = getPackage(pkgname);
+         //Manifest man = res.getManifest();
+         Manifest man = null;
+         if (pkg != null)
+         {
+            // Package found, so check package sealing.
+            if (pkg.isSealed())
+            {
+               // Verify that code source URL is the same.
+               if (!pkg.isSealed(url))
+               {
+                  throw new SecurityException("sealing violation: package " + pkgname + " is sealed");
+               }
+
+            }
+            else
+            {
+               // Make sure we are not attempting to seal the package
+               // at this code source URL.
+               if ((man != null) && isSealed(pkgname, man))
+               {
+                  throw new SecurityException("sealing violation: can't seal package " + pkgname + ": already loaded");
+               }
+            }
+         }
+         else
+         {
+            if (man != null)
+            {
+               definePackage(pkgname, man, url);
+            }
+            else
+            {
+               definePackage(pkgname, null, null, null, null, null, null, null);
+            }
+         }
+      }
+      byte b[] = readResource(resource);
+      // TODO: a lot
+      CodeSigner signers[] = null;
+      CodeSource cs = new CodeSource(url, signers);
+      int off = 0;
+      int len = b.length;
+      return defineClass(name, b, off, len, cs);
+   }
+   
+   @Override
+   protected Class<?> findClass(String name) throws ClassNotFoundException
+   {
+      String path = name.replace('.', '/').concat(".class");
+      URL urls[] = getURLs();
+      for(URL url : urls)
+      {
+         String protocol = url.getProtocol();
+         if(protocol.startsWith("vfs"))
+         {
+            try
+            {
+               /*
+               URL resourceURL = new URL(url, path);
+               byte b[] = readResource(resourceURL);
+               // TODO: a lot
+               CodeSigner signers[] = null;
+               CodeSource cs = new CodeSource(url, signers);
+               int off = 0;
+               int len = b.length;
+               return defineClass(name, b, off, len, cs);
+               */
+               //VirtualFile file = VFS.getRoot(url);
+               VirtualFile root = cache.get(url);
+               assert root != null : "cache has failed for " + url;
+               VirtualFile resource = root.getChild(path);
+               if(resource != null)
+               {
+                  return defineClass(name, url, resource);
+               }
+            }
+            catch(IOException e1)
+            {
+               // ignore
+               //e1.printStackTrace();
+            }
+         }
+      }
+      return super.findClass(name);
+   }
+   
+   /**
+    * Returns true if the specified package name is sealed according to the
+    * given manifest.
+    */
+   protected boolean isSealed(String name, Manifest man)
+   {
+      String path = name.replace('.', '/').concat("/");
+      Attributes attr = man.getAttributes(path);
+      String sealed = null;
+      if (attr != null)
+      {
+         sealed = attr.getValue(Name.SEALED);
+      }
+      if (sealed == null)
+      {
+         if ((attr = man.getMainAttributes()) != null)
+         {
+            sealed = attr.getValue(Name.SEALED);
+         }
+      }
+      return "true".equalsIgnoreCase(sealed);
+   }
+   
+   protected byte[] readResource(URL url) throws IOException
+   {
+      byte buf[] = new byte[4096];
+      ByteArrayOutputStream out = new ByteArrayOutputStream();
+      BufferedInputStream in = new BufferedInputStream(url.openStream());
+      try
+      {
+         int l;
+         while((l = in.read(buf)) != -1)
+            out.write(buf, 0, l);
+      }
+      finally
+      {
+         in.close();
+      }
+      return out.toByteArray();
+   }
+   
+   protected byte[] readResource(VirtualFile file) throws IOException
+   {
+      ByteArrayOutputStream out = new ByteArrayOutputStream();
+      BufferedInputStream in = new BufferedInputStream(file.openStream());
+      try
+      {
+         int b;
+         while((b = in.read()) != -1)
+            out.write(b);
+      }
+      finally
+      {
+         in.close();
+      }
+      return out.toByteArray();
+   }
+}

Added: projects/reloaded/trunk/embedded/src/main/resources/META-INF/jarboot.properties
===================================================================
--- projects/reloaded/trunk/embedded/src/main/resources/META-INF/jarboot.properties	                        (rev 0)
+++ projects/reloaded/trunk/embedded/src/main/resources/META-INF/jarboot.properties	2009-04-03 18:42:01 UTC (rev 86761)
@@ -0,0 +1 @@
+boot=jboss-reloaded-vdf-bootstrap.jar
\ No newline at end of file




More information about the jboss-cvs-commits mailing list