You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2017/04/16 17:53:59 UTC

svn commit: r1791614 - in /directory/shared/trunk/ldap/schema/data/src/main/java/org/apache/directory/api/ldap/schema/loader: AttributeClassLoader.java SchemaEntityFactory.java

Author: elecharny
Date: Sun Apr 16 17:53:59 2017
New Revision: 1791614

URL: http://svn.apache.org/viewvc?rev=1791614&view=rev
Log:
Changed the Attribute classloader so that it accepts also jars instead of only simple class. This is mandatory for SyntaxChackers that have an inner class

Modified:
    directory/shared/trunk/ldap/schema/data/src/main/java/org/apache/directory/api/ldap/schema/loader/AttributeClassLoader.java
    directory/shared/trunk/ldap/schema/data/src/main/java/org/apache/directory/api/ldap/schema/loader/SchemaEntityFactory.java

Modified: directory/shared/trunk/ldap/schema/data/src/main/java/org/apache/directory/api/ldap/schema/loader/AttributeClassLoader.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/schema/data/src/main/java/org/apache/directory/api/ldap/schema/loader/AttributeClassLoader.java?rev=1791614&r1=1791613&r2=1791614&view=diff
==============================================================================
--- directory/shared/trunk/ldap/schema/data/src/main/java/org/apache/directory/api/ldap/schema/loader/AttributeClassLoader.java (original)
+++ directory/shared/trunk/ldap/schema/data/src/main/java/org/apache/directory/api/ldap/schema/loader/AttributeClassLoader.java Sun Apr 16 17:53:59 2017
@@ -20,12 +20,21 @@
 package org.apache.directory.api.ldap.schema.loader;
 
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.jar.JarEntry;
+import java.util.jar.JarInputStream;
+
 import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.model.entry.Attribute;
 import org.apache.directory.api.ldap.model.entry.Value;
 import org.apache.directory.api.ldap.model.exception.LdapException;
 import org.apache.directory.api.ldap.model.exception.LdapInvalidAttributeValueException;
 import org.apache.directory.api.ldap.model.message.ResultCodeEnum;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
 
 
 /**
@@ -35,7 +44,6 @@ import org.apache.directory.api.ldap.mod
  */
 public class AttributeClassLoader extends ClassLoader
 {
-
     /** The attribute. */
     private Attribute attribute;
 
@@ -66,6 +74,63 @@ public class AttributeClassLoader extend
         this.attribute = attribute;
     }
 
+    
+    /**
+     * Read data from a jar, and write them into a byte[]
+     */
+    private static byte[] getBytes( InputStream input ) throws IOException 
+    {
+        ByteArrayOutputStream result = new ByteArrayOutputStream();
+
+        byte[] buf = new byte[2048];
+        int bytesRead = input.read( buf );
+
+        while ( bytesRead != -1 ) 
+        {
+            result.write( buf, 0, bytesRead );
+            bytesRead = input.read( buf );
+        }
+      
+        result.flush();
+        result.close();
+        
+        return result.toByteArray();
+    }
+
+    
+    private Map<String, Class<?>> loadClasses( byte[] jarBytes ) throws IOException 
+    {
+        Map<String, Class<?>> map = new HashMap<>();
+        
+        try ( JarInputStream jis = new JarInputStream( new ByteArrayInputStream( jarBytes ) ) ) 
+        {
+            JarEntry entry;
+            boolean isJar = false;
+            
+            while ( ( entry = jis.getNextJarEntry() ) != null ) 
+            {
+                String fileName = entry.getName();
+                isJar = true;
+                
+                // Just consider the files ending with .class
+                if ( fileName.endsWith( ".class" ) )
+                {
+                    String className = fileName.substring( 0,  fileName.length() - ".class".length() ).replace( '/', '.' );
+                    byte[] classBytes = getBytes( jis );
+                    
+                    Class<?> clazz = defineClass( className, classBytes, 0, classBytes.length );
+                    map.put( className, clazz );
+                }
+            }
+            
+            if ( !isJar )
+            {
+                return null;
+            }
+        }
+
+        return map;
+    }
 
     /**
      * {@inheritDoc}
@@ -84,6 +149,31 @@ public class AttributeClassLoader extend
 
         classBytes = value.getBytes();
 
-        return defineClass( name, classBytes, 0, classBytes.length );
+        // May be we are dealing with a JAR ?
+        try 
+        {
+            Map<String, Class<?>> classes = loadClasses( classBytes );
+            
+            if ( classes == null )
+            {
+                // May be a simple class ?
+                return defineClass( name, classBytes, 0, classBytes.length );
+            }
+            
+            for ( Map.Entry<String, Class<?>> entry : classes.entrySet() )
+            {
+                if ( entry.getKey().contains( name ) )
+                {
+                    return entry.getValue();
+                }
+            }
+        }
+        catch ( IOException ioe )
+        {
+            // Ok, may be a pure class
+            return defineClass( name, classBytes, 0, classBytes.length );
+        }
+        
+        return null;
     }
 }

Modified: directory/shared/trunk/ldap/schema/data/src/main/java/org/apache/directory/api/ldap/schema/loader/SchemaEntityFactory.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/schema/data/src/main/java/org/apache/directory/api/ldap/schema/loader/SchemaEntityFactory.java?rev=1791614&r1=1791613&r2=1791614&view=diff
==============================================================================
--- directory/shared/trunk/ldap/schema/data/src/main/java/org/apache/directory/api/ldap/schema/loader/SchemaEntityFactory.java (original)
+++ directory/shared/trunk/ldap/schema/data/src/main/java/org/apache/directory/api/ldap/schema/loader/SchemaEntityFactory.java Sun Apr 16 17:53:59 2017
@@ -279,6 +279,7 @@ public class SchemaEntityFactory impleme
     {
         // Try to class load the syntaxChecker
         Class<?> clazz;
+        Class<?> clazz2;
         SyntaxChecker syntaxChecker;
         String byteCodeStr = StringConstants.EMPTY;
 
@@ -307,6 +308,7 @@ public class SchemaEntityFactory impleme
                 LOG.error( "Cannot load the syntax checker class constructor for class {}", className );
                 throw new LdapSchemaException( "Cannot load the syntax checker class " + cnfe.getMessage() );
             }
+            
                 
             byteCodeStr = new String( Base64.encode( byteCode.getBytes() ) );
         }