>();
+
+ for ( int i = 0; i < nbValues; i++ )
+ {
+ if ( hr )
+ {
+ ServerStringValue value = new ServerStringValue( attributeType );
+ }
+ }
+
+ break;
+ }
+
+ if ( nbValues != 0 )
+ {
+
+ }
+ else
+ {
+
+ }
+
+ String wrapped = in.readUTF();
+ /**
+ set( wrapped );
+
+ normalizedValue = in.readUTF();
+
+ if ( ( normalizedValue.length() == 0 ) && ( wrapped.length() != 0 ) )
+ {
+ // In this case, the normalized value is equal to the UP value
+ normalizedValue = wrapped;
+ }
+ */
+ }
+ }
}
Modified: directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/DefaultServerEntry.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/DefaultServerEntry.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/DefaultServerEntry.java (original)
+++ directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/DefaultServerEntry.java Tue Jan 15 16:32:18 2008
@@ -19,6 +19,10 @@
package org.apache.directory.server.core.entry;
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -50,8 +54,11 @@
* @author Apache Directory Project
* @version $Rev$, $Date$
*/
-public final class DefaultServerEntry implements ServerEntry
+public final class DefaultServerEntry implements ServerEntry, Externalizable
{
+ /** Used for serialization */
+ public static final long serialVersionUID = 2L;
+
/** The logger for this class */
private static final Logger LOG = LoggerFactory.getLogger( DefaultServerEntry.class );
@@ -111,12 +118,12 @@
*
* This entry must be initialized before being used !
*/
- public DefaultServerEntry()
+ /*public DefaultServerEntry()
{
registries = null;
initObjectClassAT( registries );
- }
+ }*/
/**
@@ -1548,7 +1555,116 @@
}
}
+
+ /**
+ * @see Externalizable#writeExternal(ObjectOutput)
+ *
+ * This is the place where we serialize entries, and all theirs
+ * elements. the reason why we don't call the underlying methods
+ * (ServerAttribute.write(), Value.write()) is that we need
+ * access to the registries to read back the values.
+ *
+ * The structure used to store the entry is the following :
+ *
[DN length] : can be -1 if we don't have a DN, 0 if the
+ * DN is empty, otherwise contains the DN's length.
+ * NOTE :This should be unnecessary, as the DN should always exists
+ *
+ *
+ *
+ * DN : The entry's DN. Can be empty (rootDSE=
+ *
+ * We have to store the UPid, and all the values, if any.
+ */
+ public void writeExternal( ObjectOutput out ) throws IOException
+ {
+ if ( dn == null )
+ {
+ // We don't have a DN, so write a -1 instead of a real length
+ out.writeInt( -1 );
+ }
+ else
+ {
+ // Here, we should ask ourselves if it would not be better
+ // to serialize the current LdapDN instead of a String.
+ String dnString = dn.getUpName();
+ out.writeInt( dnString.length() );
+ out.writeUTF( dnString );
+
+ }
+
+ out.flush();
+ }
+
+ /**
+ * @see Externalizable#readExternal(ObjectInput)
+ */
+ public void readExternal( ObjectInput in ) throws IOException, ClassNotFoundException
+ {
+ if ( in.available() == 0 )
+ {
+ String message = "Cannot read an null Attribute";
+ LOG.error( message );
+ throw new IOException( message );
+ }
+ else
+ {
+ // Read the HR flag
+ boolean hr = in.readBoolean();
+ }
+ /*
+ // Read the UPid
+ upId = in.readUTF();
+
+ // Read the number of values
+ int nbValues = in.readInt();
+
+ switch ( nbValues )
+ {
+ case -1 :
+ values = null;
+ break;
+
+ case 0 :
+ values = new ArrayList>();
+ break;
+
+ default :
+ values = new ArrayList>();
+
+ for ( int i = 0; i < nbValues; i++ )
+ {
+ if ( hr )
+ {
+ ServerStringValue value = new ServerStringValue( attributeType );
+ }
+
+ break;
+ }
+ if ( nbValues != 0 )
+ {
+
+ }
+ else
+ {
+
+ }
+ //
+ String wrapped = in.readUTF();
+
+ set( wrapped );
+
+ normalizedValue = in.readUTF();
+
+ if ( ( normalizedValue.length() == 0 ) && ( wrapped.length() != 0 ) )
+ {
+ // In this case, the normalized value is equal to the UP value
+ normalizedValue = wrapped;
+ }
+ }*/
+ }
+
+
/**
* @see Object#toString()
*/
Modified: directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ObjectClassAttribute.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ObjectClassAttribute.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ObjectClassAttribute.java (original)
+++ directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ObjectClassAttribute.java Tue Jan 15 16:32:18 2008
@@ -42,6 +42,9 @@
*/
public class ObjectClassAttribute extends AbstractServerAttribute
{
+ /** Used for serialization */
+ public static final long serialVersionUID = 2L;
+
/** logger for reporting errors that might not be handled properly upstream */
private static final Logger LOG = LoggerFactory.getLogger( ObjectClassAttribute.class );
@@ -62,7 +65,7 @@
private Set mustList = new HashSet();
/** The global registries */
- private Registries registries;
+ private transient Registries registries;
/**
Modified: directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerAttribute.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerAttribute.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerAttribute.java (original)
+++ directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerAttribute.java Tue Jan 15 16:32:18 2008
@@ -32,7 +32,7 @@
* @author Apache Directory Project
* @version $Rev$, $Date$
*/
-public interface ServerAttribute extends EntryAttribute>, Iterable>, Cloneable
+public interface ServerAttribute extends EntryAttribute>
{
/**
* Gets the attribute type associated with this ServerAttribute.
Modified: directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerBinaryValue.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerBinaryValue.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerBinaryValue.java (original)
+++ directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerBinaryValue.java Tue Jan 15 16:32:18 2008
@@ -24,10 +24,16 @@
import org.apache.directory.shared.ldap.schema.AttributeType;
import org.apache.directory.shared.ldap.schema.MatchingRule;
import org.apache.directory.shared.ldap.schema.Normalizer;
+import org.apache.directory.shared.ldap.util.StringTools;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.naming.NamingException;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
import java.util.Arrays;
import java.util.Comparator;
@@ -41,8 +47,11 @@
* @author Apache Directory Project
* @version $Rev$, $Date$
*/
-public class ServerBinaryValue extends AbstractBinaryValue implements ServerValue, Cloneable
+public class ServerBinaryValue extends AbstractBinaryValue implements ServerValue, Externalizable
{
+ /** Used for serialization */
+ public static final long serialVersionUID = 2L;
+
/** logger for reporting errors that might not be handled properly upstream */
private static final Logger LOG = LoggerFactory.getLogger( ServerBinaryValue.class );
@@ -131,10 +140,40 @@
// -----------------------------------------------------------------------
- // ServerValue Methods
+ // ServerValue Methods
// -----------------------------------------------------------------------
+ public void normalize() throws NamingException
+ {
+ if ( getReference() != null )
+ {
+ Normalizer normalizer = getNormalizer();
+
+ if ( normalizer == null )
+ {
+ normalizedValue = getCopy();
+ }
+ else
+ {
+ normalizedValue = ( byte[] ) normalizer.normalize( getCopy() );
+ }
+
+ if ( Arrays.equals( super.getReference(), normalizedValue ) )
+ {
+ same = true;
+ }
+ else
+ {
+ same = false;
+ }
+ }
+ else
+ {
+ normalizedValue = null;
+ same = true;
+ }
+ }
-
+
/**
* Gets the normalized (cannonical) representation for the wrapped string.
* If the wrapped String is null, null is returned, otherwise the normalized
@@ -155,25 +194,7 @@
if ( normalizedValue == null )
{
- Normalizer normalizer = getNormalizer();
-
- if ( normalizer == null )
- {
- normalizedValue = getCopy();
- }
- else
- {
- normalizedValue = ( byte[] ) normalizer.normalize( getCopy() );
- }
-
- if ( Arrays.equals( super.getReference(), normalizedValue ) )
- {
- same = true;
- }
- else
- {
- same = false;
- }
+ normalize();
}
return normalizedValue;
@@ -460,5 +481,108 @@
}
return clone;
+ }
+
+
+ /**
+ * @see Externalizable#writeExternal(ObjectOutput)
+ *
+ * We will write the value and the normalized value, only
+ * if the normalized value is different.
+ *
+ * The data will be stored following this structure :
+ *
+ * [UP value]
+ * [Norm value] (will be null if normValue == upValue)
+ */
+ public void writeExternal( ObjectOutput out ) throws IOException
+ {
+ if ( getReference() != null )
+ {
+ out.writeInt( getReference().length );
+ out.write( getReference() );
+
+ if ( same )
+ {
+ // If the normalized value is equal to the UP value,
+ // don't save it
+ out.writeInt( 0 );
+ }
+ else
+ {
+ out.writeInt( normalizedValue.length );
+ out.write( normalizedValue );
+ }
+ }
+ else
+ {
+ out.writeInt( -1 );
+ }
+
+ out.flush();
+ }
+
+
+ /**
+ * @see Externalizable#readExternal(ObjectInput)
+ */
+ public void readExternal( ObjectInput in ) throws IOException, ClassNotFoundException
+ {
+ if ( in.available() == 0 )
+ {
+ set( null );
+ normalizedValue = null;
+ }
+ else
+ {
+ int wrappedLength = in.readInt();
+ byte[] wrapped = null;
+
+ switch ( wrappedLength )
+ {
+ case -1 :
+ // No value, no normalized value
+ same = true;
+ break;
+
+ case 0 :
+ // Empty value, so is the normalized value
+ wrapped = StringTools.EMPTY_BYTES;
+ normalizedValue = wrapped;
+ same = true;
+ break;
+
+ default :
+ wrapped = new byte[wrappedLength];
+ in.readFully( wrapped );
+
+ int normalizedLength = in.readInt();
+
+ // The normalized length should be either 0 or N,
+ // but it can't be -1
+ switch ( normalizedLength )
+ {
+ case -1 :
+ String message = "The normalized value cannot be null when the User Provide value is not";
+ LOG.error( message );
+ throw new IOException( message );
+
+ case 0 :
+ normalizedValue = StringTools.EMPTY_BYTES;
+ same = true;
+ break;
+
+ default :
+ same = false;
+ normalizedValue = new byte[normalizedLength];
+ in.readFully( normalizedValue );
+ break;
+ }
+
+ break;
+ }
+
+ set( wrapped );
+ }
}
}
Modified: directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerStreamedValue.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerStreamedValue.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerStreamedValue.java (original)
+++ directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerStreamedValue.java Tue Jan 15 16:32:18 2008
@@ -72,8 +72,11 @@
* @author Apache Directory Project
* @version $Rev$, $Date$
*/
-public class ServerStreamedValue extends AbstractStreamedValue implements ServerValue, Cloneable
+public class ServerStreamedValue extends AbstractStreamedValue implements ServerValue
{
+ /** Used for serialization */
+ public static final long serialVersionUID = 2L;
+
/** logger for reporting errors that might not be handled properly upstream */
private static final Logger LOG = LoggerFactory.getLogger( ServerStreamedValue.class );
@@ -143,6 +146,10 @@
// -----------------------------------------------------------------------
// ServerValue Methods
// -----------------------------------------------------------------------
+ public void normalize() throws NamingException
+ {
+
+ }
/**
Modified: directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerStringValue.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerStringValue.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerStringValue.java (original)
+++ directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerStringValue.java Tue Jan 15 16:32:18 2008
@@ -28,6 +28,11 @@
import org.slf4j.LoggerFactory;
import javax.naming.NamingException;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
import java.util.Comparator;
@@ -40,8 +45,11 @@
* @author Apache Directory Project
* @version $Rev$, $Date$
*/
-public class ServerStringValue extends AbstractStringValue implements ServerValue, Cloneable
+public class ServerStringValue extends AbstractStringValue implements ServerValue, Externalizable
{
+ /** Used for serialization */
+ public static final long serialVersionUID = 2L;
+
/** logger for reporting errors that might not be handled properly upstream */
private static final Logger LOG = LoggerFactory.getLogger( ServerStringValue.class );
@@ -49,7 +57,7 @@
private transient AttributeType attributeType;
/** the canonical representation of the wrapped String value */
- private transient String normalizedValue;
+ private String normalizedValue;
/** cached results of the isValid() method call */
private transient Boolean valid;
@@ -111,7 +119,7 @@
{
// Why should we invalidate the normalized value if it's we're setting the
// wrapper to it's current value?
- if ( wrapped.equals( get() ) )
+ if ( ( wrapped != null ) && wrapped.equals( get() ) )
{
return;
}
@@ -125,10 +133,28 @@
// -----------------------------------------------------------------------
// ServerValue Methods
// -----------------------------------------------------------------------
+ /**
+ * Compute the normalized (canonical) representation for the wrapped string.
+ * If the wrapped String is null, the normalized form will be null too.
+ *
+ * @throws NamingException if the value cannot be properly normalized
+ */
+ public void normalize() throws NamingException
+ {
+ Normalizer normalizer = getNormalizer();
+ if ( normalizer == null )
+ {
+ normalizedValue = get();
+ }
+ else
+ {
+ normalizedValue = ( String ) normalizer.normalize( get() );
+ }
+ }
/**
- * Gets the normalized (cannonical) representation for the wrapped string.
+ * Gets the normalized (canonical) representation for the wrapped string.
* If the wrapped String is null, null is returned, otherwise the normalized
* form is returned. If no the normalizedValue is null, then this method
* will attempt to generate it from the wrapped value: repeated calls to
@@ -147,16 +173,7 @@
if ( normalizedValue == null )
{
- Normalizer normalizer = getNormalizer();
-
- if ( normalizer == null )
- {
- normalizedValue = get();
- }
- else
- {
- normalizedValue = ( String ) normalizer.normalize( get() );
- }
+ normalize();
}
return normalizedValue;
@@ -410,6 +427,66 @@
catch ( CloneNotSupportedException cnse )
{
return null;
+ }
+ }
+
+
+ /**
+ * @see Externalizable#writeExternal(ObjectOutput)
+ *
+ * We will write the value and the normalized value, only
+ * if the normalized value is different.
+ *
+ * The data will be stored following this structure :
+ *
+ * [UP value]
+ * [Norm value] (will be null if normValue == upValue)
+ */
+ public void writeExternal( ObjectOutput out ) throws IOException
+ {
+ if ( get() != null )
+ {
+ out.writeUTF( get() );
+
+ if ( normalizedValue.equals( get() ) )
+ {
+ // If the normalized value is equal to the UP value,
+ // don't save it
+ out.writeUTF( "" );
+ }
+ else
+ {
+ out.writeUTF( normalizedValue );
+ }
+ }
+
+ out.flush();
+ }
+
+
+ /**
+ * @see Externalizable#readExternal(ObjectInput)
+ */
+ public void readExternal( ObjectInput in ) throws IOException, ClassNotFoundException
+ {
+ if ( in.available() == 0 )
+ {
+ set( null );
+ normalizedValue = null;
+ }
+ else
+ {
+ String wrapped = in.readUTF();
+
+ set( wrapped );
+
+ normalizedValue = in.readUTF();
+
+ if ( ( normalizedValue.length() == 0 ) && ( wrapped.length() != 0 ) )
+ {
+ // In this case, the normalized value is equal to the UP value
+ normalizedValue = wrapped;
+ }
}
}
}
Modified: directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerValue.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerValue.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerValue.java (original)
+++ directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerValue.java Tue Jan 15 16:32:18 2008
@@ -84,4 +84,13 @@
boolean instanceOf( AttributeType attributeType ) throws NamingException;
ServerValue clone();
+
+
+ /**
+ * Compute the normalized value
+ *
+ * @throws NamingException If the normalized has not been created of if
+ * there is a problem during the normalization
+ */
+ void normalize() throws NamingException;
}
Modified: directory/apacheds/branches/bigbang/core-entry/src/test/java/org/apache/directory/server/core/entry/ServerBinaryValueTest.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-entry/src/test/java/org/apache/directory/server/core/entry/ServerBinaryValueTest.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core-entry/src/test/java/org/apache/directory/server/core/entry/ServerBinaryValueTest.java (original)
+++ directory/apacheds/branches/bigbang/core-entry/src/test/java/org/apache/directory/server/core/entry/ServerBinaryValueTest.java Tue Jan 15 16:32:18 2008
@@ -20,19 +20,32 @@
package org.apache.directory.server.core.entry;
+import org.apache.directory.server.core.entry.ServerStringValueTest.AT;
+import org.apache.directory.server.core.entry.ServerStringValueTest.MR;
+import org.apache.directory.server.core.entry.ServerStringValueTest.S;
import org.apache.directory.shared.ldap.schema.AbstractAttributeType;
import org.apache.directory.shared.ldap.schema.AbstractMatchingRule;
import org.apache.directory.shared.ldap.schema.AbstractSyntax;
import org.apache.directory.shared.ldap.schema.AttributeType;
import org.apache.directory.shared.ldap.schema.ByteArrayComparator;
+import org.apache.directory.shared.ldap.schema.DeepTrimToLowerNormalizer;
import org.apache.directory.shared.ldap.schema.MatchingRule;
import org.apache.directory.shared.ldap.schema.Normalizer;
import org.apache.directory.shared.ldap.schema.Syntax;
+import org.apache.directory.shared.ldap.schema.syntax.AcceptAllSyntaxChecker;
import org.apache.directory.shared.ldap.schema.syntax.SyntaxChecker;
+import org.apache.directory.shared.ldap.util.StringTools;
+import org.junit.Before;
import org.junit.Test;
import javax.naming.NamingException;
import javax.naming.directory.InvalidAttributeValueException;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
import java.util.Arrays;
import java.util.Comparator;
@@ -58,6 +71,10 @@
*/
public class ServerBinaryValueTest
{
+ static private S s;
+ static private AT at;
+ static private MR mr;
+
/**
* A local Syntax class for tests
*/
@@ -259,7 +276,7 @@
if ( value instanceof byte[] )
{
byte[] val = (byte[])value;
- // each byte will be changed to be > 0
+ // each byte will be changed to be > 0, and spaces will be trimmed
byte[] newVal = new byte[ val.length ];
int i = 0;
@@ -268,7 +285,7 @@
newVal[i++] = (byte)(b & 0x007F);
}
- return newVal;
+ return StringTools.trim( newVal );
}
throw new IllegalStateException( "expected byte[] to normalize" );
@@ -282,6 +299,49 @@
/**
+ * Initialize an AttributeType and the associated MatchingRule
+ * and Syntax
+ */
+ @Before public void initAT()
+ {
+ s = new S( "1.1.1.1", false );
+ s.setSyntaxChecker( new AcceptAllSyntaxChecker( "1.1.1.1" ) );
+ mr = new MR( "1.1.2.1" );
+ mr.syntax = s;
+ mr.comparator = new ByteArrayComparator();
+ mr.normalizer = new Normalizer()
+ {
+ public static final long serialVersionUID = 1L;
+
+ public Object normalize( Object value ) throws NamingException
+ {
+ if ( value instanceof byte[] )
+ {
+ byte[] val = (byte[])value;
+ // each byte will be changed to be > 0, and spaces will be trimmed
+ byte[] newVal = new byte[ val.length ];
+ int i = 0;
+
+ for ( byte b:val )
+ {
+ newVal[i++] = (byte)(b & 0x007F);
+ }
+
+ return StringTools.trim( newVal );
+ }
+
+ throw new IllegalStateException( "expected byte[] to normalize" );
+ }
+ };
+ at = new AT( "1.1.3.1" );
+ at.setEquality( mr );
+ at.setOrdering( mr );
+ at.setSubstr( mr );
+ at.setSyntax( s );
+ }
+
+
+ /**
* Test the constructor with bad AttributeType
*/
@Test public void testBadConstructor()
@@ -413,4 +473,138 @@
assertFalse( v3.equals( v2 ) );
assertTrue( v3.isValid() );
}
+
+
+
+ /**
+ * Test serialization of a BinaryValue which has a normalized value
+ */
+ @Test public void testNormalizedBinaryValueSerialization() throws NamingException, IOException, ClassNotFoundException
+ {
+ byte[] v1 = StringTools.getBytesUtf8( " Test Test " );
+ byte[] v1Norm = StringTools.getBytesUtf8( "Test Test" );
+
+ // First check with a value which will be normalized
+ ServerBinaryValue sv = new ServerBinaryValue( at, v1 );
+
+ sv.normalize();
+ byte[] normalized = sv.getNormalizedReference();
+
+ assertTrue( Arrays.equals( v1Norm, normalized ) );
+ assertTrue( Arrays.equals( v1, sv.getReference() ) );
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream out = new ObjectOutputStream( baos );
+
+ sv.writeExternal( out );
+
+ ObjectInputStream in = null;
+
+ byte[] data = baos.toByteArray();
+ in = new ObjectInputStream( new ByteArrayInputStream( data ) );
+
+ ServerBinaryValue sv2 = new ServerBinaryValue( at );
+ sv2.readExternal( in );
+
+ assertEquals( sv, sv2 );
+ }
+
+
+ /**
+ * Test serialization of a BinaryValue which does not have a normalized value
+ */
+ @Test public void testNoNormalizedBinaryValueSerialization() throws NamingException, IOException, ClassNotFoundException
+ {
+ byte[] v1 = StringTools.getBytesUtf8( "test" );
+ byte[] v1Norm = StringTools.getBytesUtf8( "test" );
+
+ // First check with a value which will be normalized
+ ServerBinaryValue sv = new ServerBinaryValue( at, v1 );
+
+ sv.normalize();
+ byte[] normalized = sv.getNormalizedReference();
+
+ assertTrue( Arrays.equals( v1Norm, normalized ) );
+ assertTrue( Arrays.equals( v1, sv.get() ) );
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream out = new ObjectOutputStream( baos );
+
+ sv.writeExternal( out );
+
+ ObjectInputStream in = null;
+
+ byte[] data = baos.toByteArray();
+
+ in = new ObjectInputStream( new ByteArrayInputStream( data ) );
+
+ ServerBinaryValue sv2 = new ServerBinaryValue( at );
+ sv2.readExternal( in );
+
+ assertEquals( sv, sv2 );
+ }
+
+
+ /**
+ * Test serialization of a null BinaryValue
+ */
+ @Test public void testNullBinaryValueSerialization() throws NamingException, IOException, ClassNotFoundException
+ {
+ // First check with a value which will be normalized
+ ServerBinaryValue sv = new ServerBinaryValue( at );
+
+ sv.normalize();
+ byte[] normalized = sv.getNormalizedReference();
+
+ assertEquals( null, normalized );
+ assertEquals( null, sv.get() );
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream out = new ObjectOutputStream( baos );
+
+ sv.writeExternal( out );
+
+ ObjectInputStream in = null;
+
+ byte[] data = baos.toByteArray();
+
+ in = new ObjectInputStream( new ByteArrayInputStream( data ) );
+
+ ServerBinaryValue sv2 = new ServerBinaryValue( at );
+ sv2.readExternal( in );
+
+ assertEquals( sv, sv2 );
+ }
+
+
+ /**
+ * Test serialization of an empty BinaryValue
+ */
+ @Test public void testEmptyBinaryValueSerialization() throws NamingException, IOException, ClassNotFoundException
+ {
+ // First check with a value which will be normalized
+ ServerBinaryValue sv = new ServerBinaryValue( at, StringTools.EMPTY_BYTES );
+
+ sv.normalize();
+ byte[] normalized = sv.getNormalizedReference();
+
+ assertTrue( Arrays.equals( StringTools.EMPTY_BYTES, normalized ) );
+ assertTrue( Arrays.equals( StringTools.EMPTY_BYTES, sv.get() ) );
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream out = new ObjectOutputStream( baos );
+
+ sv.writeExternal( out );
+
+ ObjectInputStream in = null;
+
+ byte[] data = baos.toByteArray();
+
+ in = new ObjectInputStream( new ByteArrayInputStream( data ) );
+
+ ServerBinaryValue sv2 = new ServerBinaryValue( at );
+ sv2.readExternal( in );
+
+ assertEquals( sv, sv2 );
+ }
}
Modified: directory/apacheds/branches/bigbang/core-entry/src/test/java/org/apache/directory/server/core/entry/ServerStringValueTest.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-entry/src/test/java/org/apache/directory/server/core/entry/ServerStringValueTest.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core-entry/src/test/java/org/apache/directory/server/core/entry/ServerStringValueTest.java (original)
+++ directory/apacheds/branches/bigbang/core-entry/src/test/java/org/apache/directory/server/core/entry/ServerStringValueTest.java Tue Jan 15 16:32:18 2008
@@ -25,16 +25,24 @@
import org.apache.directory.shared.ldap.schema.AbstractSyntax;
import org.apache.directory.shared.ldap.schema.AttributeType;
import org.apache.directory.shared.ldap.schema.ByteArrayComparator;
+import org.apache.directory.shared.ldap.schema.DeepTrimToLowerNormalizer;
import org.apache.directory.shared.ldap.schema.MatchingRule;
import org.apache.directory.shared.ldap.schema.NoOpNormalizer;
import org.apache.directory.shared.ldap.schema.Normalizer;
import org.apache.directory.shared.ldap.schema.Syntax;
import org.apache.directory.shared.ldap.schema.syntax.AcceptAllSyntaxChecker;
import org.apache.directory.shared.ldap.schema.syntax.SyntaxChecker;
+import org.junit.Before;
import org.junit.Test;
import javax.naming.NamingException;
import javax.naming.directory.InvalidAttributeValueException;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -62,6 +70,10 @@
*/
public class ServerStringValueTest
{
+ static private S s;
+ static private AT at;
+ static private MR mr;
+
/**
* A local Syntax class for tests
*/
@@ -364,6 +376,26 @@
/**
+ * Initialize an AttributeType and the associated MatchingRule
+ * and Syntax
+ */
+ @Before public void initAT()
+ {
+ s = new S( "1.1.1.1", false );
+ s.setSyntaxChecker( new AcceptAllSyntaxChecker( "1.1.1.1" ) );
+ mr = new MR( "1.1.2.1" );
+ mr.syntax = s;
+ mr.comparator = new ByteArrayComparator();
+ mr.normalizer = new DeepTrimToLowerNormalizer();
+ at = new AT( "1.1.3.1" );
+ at.setEquality( mr );
+ at.setOrdering( mr );
+ at.setSubstr( mr );
+ at.setSyntax( s );
+ }
+
+
+ /**
* Test the constructor with bad AttributeType
*/
@Test public void testBadConstructor()
@@ -657,18 +689,6 @@
*/
@Test public void testAcceptAllNoNormalization() throws Exception
{
- S s = new S( "1.1.1.1", false );
- s.setSyntaxChecker( new AcceptAllSyntaxChecker( "1.1.1.1" ) );
- final MR mr = new MR( "1.1.2.1" );
- mr.syntax = s;
- mr.comparator = new ByteArrayComparator();
- mr.normalizer = new NoOpNormalizer();
- AT at = new AT( "1.1.3.1" );
- at.setEquality( mr );
- at.setOrdering( mr );
- at.setSubstr( mr );
- at.setSyntax( s );
-
// check that normalization and syntax checks work as expected
ServerStringValue value = new ServerStringValue( at, "hello" );
assertEquals( value.get(), value.get() );
@@ -772,4 +792,129 @@
}
+ /**
+ * Test serialization of a StringValue which has a normalized value
+ */
+ @Test public void testNormalizedStringValueSerialization() throws NamingException, IOException, ClassNotFoundException
+ {
+ // First check with a value which will be normalized
+ ServerStringValue sv = new ServerStringValue( at, " Test Test " );
+
+ sv.normalize();
+ String normalized = sv.getNormalized();
+
+ assertEquals( "test test", normalized );
+ assertEquals( " Test Test ", sv.get() );
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream out = new ObjectOutputStream( baos );
+
+ sv.writeExternal( out );
+
+ ObjectInputStream in = null;
+
+ byte[] data = baos.toByteArray();
+ in = new ObjectInputStream( new ByteArrayInputStream( data ) );
+
+ ServerStringValue sv2 = new ServerStringValue( at );
+ sv2.readExternal( in );
+
+ assertEquals( sv, sv2 );
+ }
+
+
+ /**
+ * Test serialization of a StringValue which does not have a normalized value
+ */
+ @Test public void testNoNormalizedStringValueSerialization() throws NamingException, IOException, ClassNotFoundException
+ {
+ // First check with a value which will be normalized
+ ServerStringValue sv = new ServerStringValue( at, "test" );
+
+ sv.normalize();
+ String normalized = sv.getNormalized();
+
+ assertEquals( "test", normalized );
+ assertEquals( "test", sv.get() );
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream out = new ObjectOutputStream( baos );
+
+ sv.writeExternal( out );
+
+ ObjectInputStream in = null;
+
+ byte[] data = baos.toByteArray();
+
+ in = new ObjectInputStream( new ByteArrayInputStream( data ) );
+
+ ServerStringValue sv2 = new ServerStringValue( at );
+ sv2.readExternal( in );
+
+ assertEquals( sv, sv2 );
+ }
+
+
+ /**
+ * Test serialization of a null StringValue
+ */
+ @Test public void testNullStringValueSerialization() throws NamingException, IOException, ClassNotFoundException
+ {
+ // First check with a value which will be normalized
+ ServerStringValue sv = new ServerStringValue( at );
+
+ sv.normalize();
+ String normalized = sv.getNormalized();
+
+ assertEquals( null, normalized );
+ assertEquals( null, sv.get() );
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream out = new ObjectOutputStream( baos );
+
+ sv.writeExternal( out );
+
+ ObjectInputStream in = null;
+
+ byte[] data = baos.toByteArray();
+
+ in = new ObjectInputStream( new ByteArrayInputStream( data ) );
+
+ ServerStringValue sv2 = new ServerStringValue( at );
+ sv2.readExternal( in );
+
+ assertEquals( sv, sv2 );
+ }
+
+
+ /**
+ * Test serialization of an empty StringValue
+ */
+ @Test public void testEmptyStringValueSerialization() throws NamingException, IOException, ClassNotFoundException
+ {
+ // First check with a value which will be normalized
+ ServerStringValue sv = new ServerStringValue( at, "" );
+
+ sv.normalize();
+ String normalized = sv.getNormalized();
+
+ assertEquals( "", normalized );
+ assertEquals( "", sv.get() );
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream out = new ObjectOutputStream( baos );
+
+ sv.writeExternal( out );
+
+ ObjectInputStream in = null;
+
+ byte[] data = baos.toByteArray();
+
+ in = new ObjectInputStream( new ByteArrayInputStream( data ) );
+
+ ServerStringValue sv2 = new ServerStringValue( at );
+ sv2.readExternal( in );
+
+ assertEquals( sv, sv2 );
+ }
}
Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java Tue Jan 15 16:32:18 2008
@@ -700,7 +700,7 @@
switch( reverse.getChangeType().getChangeType() )
{
case( ChangeType.ADD_ORDINAL ):
- System.out.println( "Reverted attributes : --> " + reverse.getAttributes() );
+ //System.out.println( "Reverted attributes : --> " + reverse.getAttributes() );
ctx.createSubcontext( reverse.getDn(), reverse.getAttributes() );
break;
case( ChangeType.DELETE_ORDINAL ):
Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/context/AddOperationContext.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/context/AddOperationContext.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/context/AddOperationContext.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/interceptor/context/AddOperationContext.java Tue Jan 15 16:32:18 2008
@@ -19,6 +19,7 @@
*/
package org.apache.directory.server.core.interceptor.context;
+
import org.apache.directory.server.core.entry.ServerEntry;
import org.apache.directory.server.schema.registries.Registries;
import org.apache.directory.shared.ldap.name.LdapDN;
Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/referral/ReferralInterceptor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/referral/ReferralInterceptor.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/referral/ReferralInterceptor.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/referral/ReferralInterceptor.java Tue Jan 15 16:32:18 2008
@@ -33,6 +33,7 @@
import org.apache.directory.server.core.authz.DefaultAuthorizationInterceptor;
import org.apache.directory.server.core.entry.ServerAttribute;
import org.apache.directory.server.core.entry.ServerEntry;
+import org.apache.directory.server.core.entry.ServerEntryUtils;
import org.apache.directory.server.core.entry.ServerStringValue;
import org.apache.directory.server.core.entry.ServerValue;
import org.apache.directory.server.core.enumeration.ReferralHandlingEnumeration;
@@ -79,7 +80,6 @@
import org.apache.directory.shared.ldap.message.ResultCodeEnum;
import org.apache.directory.shared.ldap.name.LdapDN;
import org.apache.directory.shared.ldap.schema.AttributeType;
-import org.apache.directory.shared.ldap.util.AttributeUtils;
import org.apache.directory.shared.ldap.util.StringTools;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -297,14 +297,15 @@
}
- public void doReferralException( LdapDN farthest, LdapDN targetUpdn, Attribute refs ) throws NamingException
+ public void doReferralException( LdapDN farthest, LdapDN targetUpdn, ServerAttribute refs ) throws NamingException
{
// handle referral here
List list = new ArrayList( refs.size() );
- for ( int ii = 0; ii < refs.size(); ii++ )
+ Iterator> refUrls = refs.getAll();
+ while ( refUrls.hasNext() )
{
- String val = ( String ) refs.get( ii );
+ String val = (String)(refUrls.next().get());
// need to add non-ldap URLs as-is
if ( !val.startsWith( "ldap" ) )
@@ -411,9 +412,14 @@
return;
}
- Attributes referral = invocation.getProxy().lookup( new LookupOperationContext( registries, farthest ), PartitionNexusProxy.LOOKUP_BYPASS );
+ ServerEntry referral = ServerEntryUtils.toServerEntry(
+ invocation.getProxy().lookup(
+ new LookupOperationContext( registries, farthest ),
+ PartitionNexusProxy.LOOKUP_BYPASS ),
+ farthest, registries );
+
AttributeType refsType = atRegistry.lookup( oidRegistry.getOid( SchemaConstants.REF_AT ) );
- Attribute refs = AttributeUtils.getAttribute( referral, refsType );
+ ServerAttribute refs = referral.get( refsType );
doReferralException( farthest, new LdapDN( name.getUpName() ), refs );
}
else if ( refval.equals( FOLLOW ) )
@@ -451,8 +457,12 @@
return next.compare( opContext );
}
- Attributes referral = invocation.getProxy().lookup( new LookupOperationContext( registries, farthest ), PartitionNexusProxy.LOOKUP_BYPASS );
- Attribute refs = referral.get( SchemaConstants.REF_AT );
+ ServerEntry referral = ServerEntryUtils.toServerEntry(
+ invocation.getProxy().lookup(
+ new LookupOperationContext( registries, farthest ),
+ PartitionNexusProxy.LOOKUP_BYPASS ),
+ farthest, registries );
+ ServerAttribute refs = referral.get( SchemaConstants.REF_AT );
doReferralException( farthest, new LdapDN( name.getUpName() ), refs );
// we really can't get here since doReferralException will throw an exception
@@ -506,9 +516,14 @@
return;
}
- Attributes referral = invocation.getProxy().lookup( new LookupOperationContext( registries, farthest ), PartitionNexusProxy.LOOKUP_BYPASS );
- Attribute refs = referral.get( SchemaConstants.REF_AT );
+ ServerEntry referral = ServerEntryUtils.toServerEntry(
+ invocation.getProxy().lookup(
+ new LookupOperationContext( registries, farthest ),
+ PartitionNexusProxy.LOOKUP_BYPASS ),
+ farthest, registries );
+ ServerAttribute refs = referral.get( SchemaConstants.REF_AT );
doReferralException( farthest, new LdapDN( name.getUpName() ), refs );
+
}
else if ( refval.equals( FOLLOW ) )
{
@@ -578,9 +593,12 @@
}
else if ( farthestSrc != null )
{
- Attributes referral = invocation.getProxy().lookup( new LookupOperationContext( registries, farthestSrc ),
- PartitionNexusProxy.LOOKUP_BYPASS );
- Attribute refs = referral.get( SchemaConstants.REF_AT );
+ ServerEntry referral = ServerEntryUtils.toServerEntry(
+ invocation.getProxy().lookup(
+ new LookupOperationContext( registries, farthestSrc ),
+ PartitionNexusProxy.LOOKUP_BYPASS ),
+ farthestSrc, registries );
+ ServerAttribute refs = referral.get( SchemaConstants.REF_AT );
doReferralException( farthestSrc, new LdapDN( oldName.getUpName() ), refs );
}
else if ( farthestDst != null )
@@ -650,10 +668,14 @@
}
else if ( farthestSrc != null )
{
- Attributes referral = invocation.getProxy().lookup( new LookupOperationContext( registries, farthestSrc ),
- PartitionNexusProxy.LOOKUP_BYPASS );
- Attribute refs = referral.get( SchemaConstants.REF_AT );
+ ServerEntry referral = ServerEntryUtils.toServerEntry(
+ invocation.getProxy().lookup(
+ new LookupOperationContext( registries, farthestSrc ),
+ PartitionNexusProxy.LOOKUP_BYPASS ),
+ farthestSrc, registries );
+ ServerAttribute refs = referral.get( SchemaConstants.REF_AT );
doReferralException( farthestSrc, new LdapDN( oldName.getUpName() ), refs );
+
}
else if ( farthestDst != null )
{
@@ -727,10 +749,14 @@
if ( farthestSrc != null )
{
- Attributes referral = invocation.getProxy().lookup( new LookupOperationContext( registries, farthestSrc ),
- PartitionNexusProxy.LOOKUP_BYPASS );
- Attribute refs = referral.get( SchemaConstants.REF_AT );
+ ServerEntry referral = ServerEntryUtils.toServerEntry(
+ invocation.getProxy().lookup(
+ new LookupOperationContext( registries, farthestSrc ),
+ PartitionNexusProxy.LOOKUP_BYPASS ),
+ farthestSrc, registries );
+ ServerAttribute refs = referral.get( SchemaConstants.REF_AT );
doReferralException( farthestSrc, new LdapDN( oldName.getUpName() ), refs );
+
}
else if ( farthestDst != null )
{
@@ -856,8 +882,12 @@
return;
}
- Attributes referral = invocation.getProxy().lookup( new LookupOperationContext( registries, farthest ), PartitionNexusProxy.LOOKUP_BYPASS );
- Attribute refs = referral.get( SchemaConstants.REF_AT );
+ ServerEntry referral = ServerEntryUtils.toServerEntry(
+ invocation.getProxy().lookup(
+ new LookupOperationContext( registries, farthest ),
+ PartitionNexusProxy.LOOKUP_BYPASS ),
+ farthest, registries );
+ ServerAttribute refs = referral.get( SchemaConstants.REF_AT );
doReferralException( farthest, new LdapDN( name.getUpName() ), refs );
}
else if ( refval.equals( FOLLOW ) )
Modified: directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/operation/AddEntryOperation.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/operation/AddEntryOperation.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/operation/AddEntryOperation.java (original)
+++ directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/operation/AddEntryOperation.java Tue Jan 15 16:32:18 2008
@@ -28,6 +28,7 @@
import org.apache.directory.mitosis.common.CSN;
import org.apache.directory.mitosis.operation.support.EntryUtil;
import org.apache.directory.mitosis.store.ReplicationStore;
+import org.apache.directory.server.core.entry.ServerEntry;
import org.apache.directory.server.core.entry.ServerEntryUtils;
import org.apache.directory.server.core.interceptor.context.AddOperationContext;
import org.apache.directory.server.core.interceptor.context.DeleteOperationContext;
@@ -56,7 +57,7 @@
*
* @param entry an entry
*/
- public AddEntryOperation( CSN csn, LdapDN normalizedName, Attributes entry )
+ public AddEntryOperation( CSN csn, LdapDN normalizedName, ServerEntry entry )
{
super( csn );
@@ -64,7 +65,7 @@
assert entry != null;
this.normalizedName = normalizedName;
- this.entry = ( Attributes ) entry.clone();
+ this.entry = ServerEntryUtils.toAttributesImpl( entry );
}
@@ -85,9 +86,7 @@
EntryUtil.createGlueEntries( registries, nexus, normalizedName, false );
// Replace the entry if an entry with the same name exists.
- Attributes oldEntry = nexus.lookup( new LookupOperationContext( registries, normalizedName ) );
-
- if ( oldEntry != null )
+ if ( nexus.lookup( new LookupOperationContext( registries, normalizedName ) ) != null )
{
recursiveDelete( nexus, normalizedName, registries );
}
@@ -101,6 +100,7 @@
throws NamingException
{
NamingEnumeration ne = nexus.list( new ListOperationContext( registries, normalizedName ) );
+
if ( !ne.hasMore() )
{
nexus.delete( new DeleteOperationContext( registries, normalizedName ) );
Modified: directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/operation/OperationCodec.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/operation/OperationCodec.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/operation/OperationCodec.java (original)
+++ directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/operation/OperationCodec.java Tue Jan 15 16:32:18 2008
@@ -69,6 +69,7 @@
public Operation decode( byte[] data )
{
ObjectInputStream in;
+
try
{
in = new ObjectInputStream( new ByteArrayInputStream( data ) );
@@ -76,6 +77,7 @@
}
catch ( IOException e )
{
+ e.printStackTrace();
throw ( InternalError ) new InternalError().initCause( e );
}
catch ( ClassNotFoundException e )
Modified: directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/operation/OperationFactory.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/operation/OperationFactory.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/operation/OperationFactory.java (original)
+++ directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/operation/OperationFactory.java Tue Jan 15 16:32:18 2008
@@ -26,6 +26,9 @@
import org.apache.directory.mitosis.common.UUIDFactory;
import org.apache.directory.mitosis.configuration.ReplicationConfiguration;
import org.apache.directory.server.core.DirectoryService;
+import org.apache.directory.server.core.entry.ServerAttribute;
+import org.apache.directory.server.core.entry.ServerEntry;
+import org.apache.directory.server.core.entry.ServerEntryUtils;
import org.apache.directory.server.core.interceptor.context.EntryOperationContext;
import org.apache.directory.server.core.interceptor.context.LookupOperationContext;
import org.apache.directory.server.core.interceptor.context.ModifyOperationContext;
@@ -107,7 +110,7 @@
* Creates a new {@link Operation} that performs LDAP "add" operation
* with a newly generated {@link CSN}.
*/
- public Operation newAdd( LdapDN normalizedName, Attributes entry ) throws NamingException
+ public Operation newAdd( LdapDN normalizedName, ServerEntry entry ) throws NamingException
{
return newAdd( newCSN(), normalizedName, entry );
}
@@ -119,24 +122,24 @@
* additional attributes; {@link Constants#ENTRY_CSN} ({@link CSN}),
* {@link Constants#ENTRY_UUID}, and {@link Constants#ENTRY_DELETED}.
*/
- private Operation newAdd( CSN csn, LdapDN normalizedName, Attributes entry ) throws NamingException
+ private Operation newAdd( CSN csn, LdapDN normalizedName, ServerEntry entry ) throws NamingException
{
// Check an entry already exists.
checkBeforeAdd( normalizedName );
// Insert 'entryUUID' and 'entryDeleted'.
- entry = ( Attributes ) entry.clone();
- entry.remove( Constants.ENTRY_UUID );
- entry.remove( Constants.ENTRY_DELETED );
- entry.put( Constants.ENTRY_UUID, uuidFactory.newInstance().toOctetString() );
- entry.put( Constants.ENTRY_DELETED, "FALSE" );
+ ServerEntry cloneEntry = ( ServerEntry ) entry.clone();
+ cloneEntry.remove( Constants.ENTRY_UUID );
+ cloneEntry.remove( Constants.ENTRY_DELETED );
+ cloneEntry.put( Constants.ENTRY_UUID, uuidFactory.newInstance().toOctetString() );
+ cloneEntry.put( Constants.ENTRY_DELETED, "FALSE" );
// NOTE: We inlined addDefaultOperations() because ApacheDS currently
// creates an index entry only for ADD operation (and not for
// MODIFY operation)
- entry.put( Constants.ENTRY_CSN, csn.toOctetString() );
+ cloneEntry.put( Constants.ENTRY_CSN, csn.toOctetString() );
- return new AddEntryOperation( csn, normalizedName, entry );
+ return new AddEntryOperation( csn, normalizedName, cloneEntry );
}
@@ -253,6 +256,7 @@
// Retrieve all subtree including the base entry
SearchControls ctrl = new SearchControls();
ctrl.setSearchScope( SearchControls.SUBTREE_SCOPE );
+
NamingEnumeration e = nexus.search(
new SearchOperationContext( registries, oldName, AliasDerefMode.DEREF_ALWAYS,
new PresenceNode( SchemaConstants.OBJECT_CLASS_AT_OID ), ctrl ) );
@@ -270,17 +274,21 @@
"TRUE" ) ) );
// Get the old entry attributes and replace RDN if required
- Attributes entry = sr.getAttributes();
+ LdapDN entryName = new LdapDN( sr.getName() );
+ ServerEntry entry = ServerEntryUtils.toServerEntry( sr.getAttributes(), entryName, registries );
+
if ( oldEntryName.size() == oldName.size() )
{
if ( deleteOldRn )
{
// Delete the old RDN attribute value
String oldRDNAttributeID = oldName.getRdn().getUpType();
- Attribute oldRDNAttribute = entry.get( oldRDNAttributeID );
+ ServerAttribute oldRDNAttribute = entry.get( oldRDNAttributeID );
+
if ( oldRDNAttribute != null )
{
- boolean removed = oldRDNAttribute.remove( oldName.getRdn().getUpValue() );
+ boolean removed = oldRDNAttribute.remove( (String)oldName.getRdn().getUpValue() );
+
if ( removed && oldRDNAttribute.size() == 0 )
{
// Now an empty attribute, remove it.
@@ -288,10 +296,12 @@
}
}
}
+
// Add the new RDN attribute value.
String newRDNAttributeID = newRdn.getUpType();
String newRDNAttributeValue = ( String ) newRdn.getUpValue();
- Attribute newRDNAttribute = entry.get( newRDNAttributeID );
+ ServerAttribute newRDNAttribute = entry.get( newRDNAttributeID );
+
if ( newRDNAttribute != null )
{
newRDNAttribute.add( newRDNAttributeValue );
@@ -305,10 +315,12 @@
// Calculate new name from newParentName, oldEntryName, and newRdn.
LdapDN newEntryName = ( LdapDN ) newParentName.clone();
newEntryName.add( newRdn );
+
for ( int i = oldEntryName.size() - newEntryName.size(); i > 0; i-- )
{
newEntryName.add( oldEntryName.get( oldEntryName.size() - i ) );
}
+
newEntryName.normalize( attributeRegistry.getNormalizerMapping() );
// Add the new entry
Modified: directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/operation/support/EntryUtil.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/operation/support/EntryUtil.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/operation/support/EntryUtil.java (original)
+++ directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/operation/support/EntryUtil.java Tue Jan 15 16:32:18 2008
@@ -25,6 +25,8 @@
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
+import org.apache.directory.server.core.entry.DefaultServerEntry;
+import org.apache.directory.server.core.entry.ServerEntry;
import org.apache.directory.server.core.entry.ServerEntryUtils;
import org.apache.directory.server.core.interceptor.context.AddOperationContext;
import org.apache.directory.server.core.interceptor.context.EntryOperationContext;
@@ -32,8 +34,6 @@
import org.apache.directory.server.core.partition.PartitionNexus;
import org.apache.directory.server.schema.registries.Registries;
import org.apache.directory.shared.ldap.constants.SchemaConstants;
-import org.apache.directory.shared.ldap.message.AttributeImpl;
-import org.apache.directory.shared.ldap.message.AttributesImpl;
import org.apache.directory.shared.ldap.name.LdapDN;
import org.apache.directory.shared.ldap.util.NamespaceTools;
import org.apache.directory.shared.ldap.util.StringTools;
@@ -120,7 +120,7 @@
}
// Create a glue entry.
- Attributes entry = new AttributesImpl( true );
+ ServerEntry entry = new DefaultServerEntry( registries, name );
//// Add RDN attribute.
String rdn = name.get( name.size() - 1 );
@@ -129,13 +129,10 @@
entry.put( rdnAttribute, rdnValue );
//// Add objectClass attribute.
- Attribute objectClassAttr = new AttributeImpl( SchemaConstants.OBJECT_CLASS_AT );
- objectClassAttr.add( SchemaConstants.TOP_OC );
- objectClassAttr.add( SchemaConstants.EXTENSIBLE_OBJECT_OC );
- entry.put( objectClassAttr );
+ entry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC, SchemaConstants.EXTENSIBLE_OBJECT_OC );
// And add it to the nexus.
- nexus.add( new AddOperationContext( registries, name, ServerEntryUtils.toServerEntry( entry, name, registries ) ) );
+ nexus.add( new AddOperationContext( registries, name, entry ) );
}
Modified: directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/service/ReplicationInterceptor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/service/ReplicationInterceptor.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/service/ReplicationInterceptor.java (original)
+++ directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/service/ReplicationInterceptor.java Tue Jan 15 16:32:18 2008
@@ -397,7 +397,8 @@
public void add( NextInterceptor nextInterceptor, AddOperationContext addContext ) throws NamingException
{
- Operation op = operationFactory.newAdd( addContext.getDn(), ServerEntryUtils.toAttributesImpl( addContext.getEntry() ) );
+ Operation op = operationFactory.newAdd(
+ addContext.getDn(), addContext.getEntry() );
op.execute( nexus, store, registries );
}
Modified: directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/service/protocol/handler/ReplicationClientContextHandler.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/service/protocol/handler/ReplicationClientContextHandler.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/service/protocol/handler/ReplicationClientContextHandler.java (original)
+++ directory/apacheds/branches/bigbang/mitosis/src/main/java/org/apache/directory/mitosis/service/protocol/handler/ReplicationClientContextHandler.java Tue Jan 15 16:32:18 2008
@@ -44,6 +44,7 @@
import org.apache.directory.mitosis.store.ReplicationStore;
import org.apache.directory.server.core.entry.ServerAttribute;
import org.apache.directory.server.core.entry.ServerEntry;
+import org.apache.directory.server.core.entry.ServerEntryUtils;
import org.apache.directory.server.core.entry.ServerValue;
import org.apache.directory.server.core.interceptor.context.SearchOperationContext;
import org.apache.directory.shared.ldap.constants.SchemaConstants;
@@ -58,8 +59,6 @@
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
-import javax.naming.directory.Attribute;
-import javax.naming.directory.Attributes;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import java.net.InetSocketAddress;
@@ -399,10 +398,14 @@
while ( e.hasMore() )
{
SearchResult sr = e.next();
- Attributes attrs = sr.getAttributes();
+ ServerEntry attrs = ServerEntryUtils.toServerEntry(
+ sr.getAttributes(),
+ new LdapDN( sr.getName() ),
+ ctx.getDirectoryService().getRegistries() ) ;
// Skip entries without entryCSN attribute.
- Attribute entryCSNAttr = attrs.get( org.apache.directory.mitosis.common.Constants.ENTRY_CSN );
+ ServerAttribute entryCSNAttr = attrs.get( org.apache.directory.mitosis.common.Constants.ENTRY_CSN );
+
if ( entryCSNAttr == null )
{
continue;
@@ -410,6 +413,7 @@
// Get entryCSN of the entry. Skip if entryCSN value is invalid.
CSN csn;
+
try
{
Object val = entryCSNAttr.get();
Modified: directory/apacheds/branches/bigbang/mitosis/src/test/java/org/apache/directory/mitosis/service/AbstractReplicationServiceTestCase.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/mitosis/src/test/java/org/apache/directory/mitosis/service/AbstractReplicationServiceTestCase.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/mitosis/src/test/java/org/apache/directory/mitosis/service/AbstractReplicationServiceTestCase.java (original)
+++ directory/apacheds/branches/bigbang/mitosis/src/test/java/org/apache/directory/mitosis/service/AbstractReplicationServiceTestCase.java Tue Jan 15 16:32:18 2008
@@ -31,6 +31,8 @@
import org.apache.directory.server.core.interceptor.Interceptor;
import org.apache.directory.server.core.jndi.CoreContextFactory;
import org.apache.mina.util.AvailablePortFinder;
+import org.junit.After;
+import org.junit.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -53,7 +55,7 @@
* @author Apache Directory Project
* @version $Rev$, $Date$
*/
-public abstract class AbstractReplicationServiceTestCase extends TestCase
+public abstract class AbstractReplicationServiceTestCase
{
private static final Logger LOG = LoggerFactory.getLogger( AbstractReplicationServiceTestCase.class );
protected Map contexts = new HashMap();
@@ -61,13 +63,13 @@
protected Map replicationServices = new HashMap();
- protected void setUp() throws Exception
+ @Before public void setUp() throws Exception
{
createReplicas( new String[] { "A", "B", "C" } );
}
- protected void tearDown() throws Exception
+ @After public void tearDown() throws Exception
{
destroyAllReplicas();
}
@@ -78,6 +80,7 @@
int lastAvailablePort = 1024;
Replica[] replicas = new Replica[ names.length ];
+
for( int i = 0; i < names.length; i++ )
{
int replicationPort = AvailablePortFinder.getNextAvailable( lastAvailablePort );
Modified: directory/apacheds/branches/bigbang/mitosis/src/test/java/org/apache/directory/mitosis/service/DIRSERVER1013ITest.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/mitosis/src/test/java/org/apache/directory/mitosis/service/DIRSERVER1013ITest.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/mitosis/src/test/java/org/apache/directory/mitosis/service/DIRSERVER1013ITest.java (original)
+++ directory/apacheds/branches/bigbang/mitosis/src/test/java/org/apache/directory/mitosis/service/DIRSERVER1013ITest.java Tue Jan 15 16:32:18 2008
@@ -24,6 +24,10 @@
import org.apache.directory.shared.ldap.constants.SchemaConstants;
import org.apache.directory.shared.ldap.message.AttributesImpl;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertNull;
/**
@@ -39,14 +43,14 @@
*/
public class DIRSERVER1013ITest extends AbstractReplicationServiceTestCase
{
- protected void setUp() throws Exception
+ @Before public void setUp() throws Exception
{
// Create two replicas as we currently can't have the
// replication service enabled without more than one.
createReplicas( new String[] { "A", "B" } );
}
- public void testNoRDNOID () throws Exception
+ @Test public void testNoRDNOID () throws Exception
{
LdapContext ctxA = getReplicaContext( "A" );
Modified: directory/apacheds/branches/bigbang/mitosis/src/test/java/org/apache/directory/mitosis/service/ReplicationServiceITest.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/mitosis/src/test/java/org/apache/directory/mitosis/service/ReplicationServiceITest.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/mitosis/src/test/java/org/apache/directory/mitosis/service/ReplicationServiceITest.java (original)
+++ directory/apacheds/branches/bigbang/mitosis/src/test/java/org/apache/directory/mitosis/service/ReplicationServiceITest.java Tue Jan 15 16:32:18 2008
@@ -19,6 +19,9 @@
*/
package org.apache.directory.mitosis.service;
+import java.util.HashMap;
+import java.util.Map;
+
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
@@ -34,6 +37,11 @@
import org.apache.directory.shared.ldap.message.AttributesImpl;
import org.apache.directory.shared.ldap.message.ModificationItemImpl;
import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.shared.ldap.schema.DeepTrimToLowerNormalizer;
+import org.apache.directory.shared.ldap.schema.OidNormalizer;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
/**
* A test case for {@link ReplicationServiceITest}
@@ -43,12 +51,26 @@
*/
public class ReplicationServiceITest extends AbstractReplicationServiceTestCase
{
- protected void setUp() throws Exception
+ private Map oids;
+
+ @Before public void setUp() throws Exception
{
createReplicas( new String[] { "A", "B", "C" } );
+
+
+ // Initialize OIDs maps for normalization
+ oids = new HashMap();
+
+ oids.put( "ou", new OidNormalizer( "ou", new DeepTrimToLowerNormalizer() ) );
+ oids.put( "organizationalUnitName", new OidNormalizer( "ou", new DeepTrimToLowerNormalizer() ) );
+ oids.put( "2.5.4.11", new OidNormalizer( "ou", new DeepTrimToLowerNormalizer() ) );
+ oids.put( "cn", new OidNormalizer( "cn", new DeepTrimToLowerNormalizer() ) );
+ oids.put( "commonName", new OidNormalizer( "cn", new DeepTrimToLowerNormalizer() ) );
+ oids.put( "2.5.4.3", new OidNormalizer( "cn", new DeepTrimToLowerNormalizer() ) );
}
- public void testOneWay() throws Exception
+ @Ignore
+ @Test public void testOneWay() throws Exception
{
String dn1 = "cn=test,ou=system";
String dn2 = "cn=test2,ou=system";
Modified: directory/apacheds/branches/bigbang/mitosis/src/test/java/org/apache/directory/mitosis/service/protocol/codec/AbstractMessageCodecTest.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/mitosis/src/test/java/org/apache/directory/mitosis/service/protocol/codec/AbstractMessageCodecTest.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/mitosis/src/test/java/org/apache/directory/mitosis/service/protocol/codec/AbstractMessageCodecTest.java (original)
+++ directory/apacheds/branches/bigbang/mitosis/src/test/java/org/apache/directory/mitosis/service/protocol/codec/AbstractMessageCodecTest.java Tue Jan 15 16:32:18 2008
@@ -30,11 +30,12 @@
import org.apache.mina.filter.codec.demux.MessageDecoder;
import org.apache.mina.filter.codec.demux.MessageEncoder;
import org.apache.mina.filter.codec.support.SimpleProtocolEncoderOutput;
+import org.junit.Test;
import sun.misc.Queue;
-public abstract class AbstractMessageCodecTest extends TestCase
+public abstract class AbstractMessageCodecTest
{
private final BaseMessage message;
private final MessageEncoder encoder;
@@ -62,7 +63,7 @@
}
- public void testMessageCodec() throws Exception
+ @Test public void testMessageCodec() throws Exception
{
SimpleProtocolEncoderOutput encoderOut = new SimpleProtocolEncoderOutput()
{
Modified: directory/apacheds/branches/bigbang/mitosis/src/test/java/org/apache/directory/mitosis/service/protocol/codec/LogEntryMessageCodecTest.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/mitosis/src/test/java/org/apache/directory/mitosis/service/protocol/codec/LogEntryMessageCodecTest.java?rev=612324&r1=612323&r2=612324&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/mitosis/src/test/java/org/apache/directory/mitosis/service/protocol/codec/LogEntryMessageCodecTest.java (original)
+++ directory/apacheds/branches/bigbang/mitosis/src/test/java/org/apache/directory/mitosis/service/protocol/codec/LogEntryMessageCodecTest.java Tue Jan 15 16:32:18 2008
@@ -20,7 +20,11 @@
package org.apache.directory.mitosis.service.protocol.codec;
+import java.util.HashMap;
+import java.util.Map;
+
import javax.naming.InvalidNameException;
+import javax.naming.NamingException;
import org.apache.directory.mitosis.common.ReplicaId;
import org.apache.directory.mitosis.common.DefaultCSN;
@@ -31,17 +35,42 @@
import org.apache.directory.mitosis.service.protocol.message.LogEntryMessage;
import org.apache.directory.shared.ldap.message.AttributeImpl;
import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.shared.ldap.schema.DeepTrimToLowerNormalizer;
+import org.apache.directory.shared.ldap.schema.OidNormalizer;
public class LogEntryMessageCodecTest extends AbstractMessageCodecTest
{
+ private static Map oids = new HashMap();
+
+ static
+ {
+ oids.put( "ou", new OidNormalizer( "ou", new DeepTrimToLowerNormalizer() ) );
+ oids.put( "organizationalUnitName", new OidNormalizer( "ou", new DeepTrimToLowerNormalizer() ) );
+ oids.put( "2.5.4.11", new OidNormalizer( "ou", new DeepTrimToLowerNormalizer() ) );
+ }
+
- public LogEntryMessageCodecTest() throws InvalidNameException
+ public LogEntryMessageCodecTest() throws InvalidNameException, NamingException
{
+ // Initialize OIDs maps for normalization
+ /*Map oids = new HashMap();
+
+ oids.put( "ou", new OidNormalizer( "ou", new DeepTrimToLowerNormalizer() ) );
+ oids.put( "organizationalUnitName", new OidNormalizer( "ou", new DeepTrimToLowerNormalizer() ) );
+ oids.put( "2.5.4.11", new OidNormalizer( "ou", new DeepTrimToLowerNormalizer() ) );
+ */
+
super(
- new LogEntryMessage( 1234, new AddAttributeOperation( new DefaultCSN( System.currentTimeMillis(),
- new ReplicaId( "testReplica0" ), 1234 ), new LdapDN( "ou=system" ),
- new AttributeImpl( "Hello", "Test" ) ) ), new LogEntryMessageEncoder(), new LogEntryMessageDecoder() );
+ new LogEntryMessage(
+ 1234,
+ new AddAttributeOperation(
+ new DefaultCSN( System.currentTimeMillis(),
+ new ReplicaId( "testReplica0" ), 1234 ),
+ new LdapDN( "ou=system" ).normalize( oids ),
+ new AttributeImpl( "Hello", "Test" ) ) ),
+ new LogEntryMessageEncoder(),
+ new LogEntryMessageDecoder() );
}