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() ) );
}