I am a fool, I should have googled this a bit further..it's the Change Sequence Number..

Yiannis Mavroukakis wrote:
Or maybe there is!..Almost a result, I am doing this now,

 List<Modification> modItems = ServerEntryUtils.toServerModification(
                               ldifEntry.getModificationItemsArray( ) ,
directoryService.getRegistries( ).getAttributeTypeRegistry( ) ); modOp.modify( ldifEntry.getDn( ) , modItems ,clusterBypass );

Modification: replace
, attribute : entryCSN: '0x32 0x30 0x30 0x39 0x30 0x33 0x31 0x31 0x31 0x37 0x33 0x31 0x33 0x31 0x2E 0x30 ...'

It now blows up with the following exception,

javax.naming.NoPermissionException: Cannot modify the attribute 'entryCSN']

Why is it not possible to modify this? Is this a per-server unique value? And if so I assume it won't hurt if I don't include it in the Modification List in ldifEntry?

Thanks guys,

Yiannis.

Yiannis Mavroukakis wrote:
Ouch I just realised this won't really ever work..ModifyOperationContext requires a ServerModification item for it to work, which in turns requires ServerAttribute to be constructed and I can't get any of them out of an Ldif object in the context of a Modify operation...double damn!

Y.

Yiannis Mavroukakis wrote:


Emmanuel Lecharny wrote:
Yiannis Mavroukakis wrote:

Hello everyone :-)

I've got a problem trying to use LdifEntry with ModifyOperationContext. If you remember from previous emails, I'm using LdifEntry because it can be serialized. I'm stuffing my Modification
objects in the LdifEntry object like so

       for( AttributeType attributeType : list )
       {
           EntryAttribute entryAttribute = ( (ServerAttribute) entry
                   .get( attributeType ) ).toClientAttribute( );
           ldiff.addAttribute( entryAttribute );
           if( changeType.equals( ChangeType.Modify ) )
           {
               ClientModification mod = new ClientModification(
                       ModificationOperation.REPLACE_ATTRIBUTE ,
                       entryAttribute );
               ldiff.addModificationItem( mod );
           }
       }

This serializes fine, however ModifyOperationContext.modify() gives me a

java.lang.ClassCastException: org.apache.directory.shared.ldap.entry.client.DefaultClientAttribute cannot be cast to org.apache.directory.server.core.entry.ServerAttribute

when I pass the LdifEntry object modification list to it because it expects ServerAttributes and not ClientAttributes and as far as I can remember, ServerAttributes are not serializable (?). Is there any way I can get around this requirement?
Just store the initial entry.getAttribute() into the modification :

      for( AttributeType attributeType : list )
      {
          EntryAttribute entryAttribute = ( (ServerAttribute) entry
                  .get( attributeType ) ).toClientAttribute( );
          ldiff.addAttribute( entryAttribute );
          if( changeType.equals( ChangeType.Modify ) )
          {
              ClientModification mod = new ClientModification(
                      ModificationOperation.REPLACE_ATTRIBUTE ,
entry.get( attributeType ) ); <----------------------
              ldiff.addModificationItem( mod );
          }
      }

It should work.


Whoops :-)

81d:36
java.lang.IllegalStateException: Cannot use standard serialization for a ServerAttribute at org.apache.directory.server.core.entry.DefaultServerAttribute.writeExternal(DefaultServerAttribute.java:1190) at java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1421)

Reply via email to