You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by dj...@apache.org on 2007/08/10 01:40:18 UTC

svn commit: r564425 [1/4] - in /directory/sandbox/djencks/triplesec-jacc2: ./ admin-api2/ admin-api2/src/main/java/org/safehaus/triplesec/admin/ admin-api2/src/main/java/org/safehaus/triplesec/admin/dao/ admin-api2/src/main/java/org/safehaus/triplesec/...

Author: djencks
Date: Thu Aug  9 16:40:15 2007
New Revision: 564425

URL: http://svn.apache.org/viewvc?view=rev&rev=564425
Log:
It compiles but probably doesn't pass any integration tests

Added:
    directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/MoveAndRenameChangeEvent.java   (with props)
Removed:
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/ExternalUserModifier.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/GroupModifier.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/HauskeysUserModifier.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/LocalUserModifier.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/dao/DaoFactory.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/dao/ExternalUserDao.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/dao/GroupDao.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/dao/HauskeysUserDao.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/dao/LocalUserDao.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/dao/UserDao.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/dao/ldap/AbstractLdapDao.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/dao/ldap/JndiIterator.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/dao/ldap/LdapDao.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/dao/ldap/LdapDaoFactory.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/dao/ldap/LdapExternalUserDao.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/dao/ldap/LdapGroupDao.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/dao/ldap/LdapHauskeysUserDao.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/dao/ldap/LdapLocalUserDao.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/dao/ldap/LdapUserDao.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/dao/ldap/LdapUtils.java
Modified:
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/pom.xml
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/ExternalUser.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/Group.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/HauskeysUser.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/LocalUser.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/Profile.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/TriplesecAdmin.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/User.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/persistence/Query.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/persistence/QueryImpl.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/persistence/StateManager.java
    directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/test/java/org/safehaus/triplesec/admin/IntegrationTest.java
    directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/interceptor/ChangelogService.java
    directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/ModifyChangeEvent.java
    directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/ModifyDnChangeEvent.java
    directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/ModifyRdnChangeEvent.java
    directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/support/AttributeUtils.java
    directory/sandbox/djencks/triplesec-jacc2/configuration-io/src/main/java/org/safehaus/triplesec/configuration/ServerXmlUtils.java
    directory/sandbox/djencks/triplesec-jacc2/configuration-io/src/test/java/org/safehaus/triplesec/configuration/ServerXmlUtilsTest.java
    directory/sandbox/djencks/triplesec-jacc2/configuration/src/main/java/org/safehaus/triplesec/configuration/MutableTriplesecStartupConfiguration.java
    directory/sandbox/djencks/triplesec-jacc2/configuration/src/main/java/org/safehaus/triplesec/configuration/TriplesecStartupConfiguration.java
    directory/sandbox/djencks/triplesec-jacc2/itest-data/src/main/resources/server.xml
    directory/sandbox/djencks/triplesec-jacc2/jacc/src/main/java/org/apache/directory/triplesec/jacc/TripleSecPolicyConfigurationFactory.java
    directory/sandbox/djencks/triplesec-jacc2/main/pom.xml
    directory/sandbox/djencks/triplesec-jacc2/main/src/main/java/org/safehaus/triplesec/Service.java
    directory/sandbox/djencks/triplesec-jacc2/pom.xml
    directory/sandbox/djencks/triplesec-jacc2/store/src/main/java/org/safehaus/triplesec/store/interceptor/ApplicationAciManager.java
    directory/sandbox/djencks/triplesec-jacc2/store/src/main/java/org/safehaus/triplesec/store/interceptor/PolicyProtectionInterceptor.java
    directory/sandbox/djencks/triplesec-jacc2/store/src/test/java/org/safehaus/triplesec/store/ServerProfileStoreITest.java
    directory/sandbox/djencks/triplesec-jacc2/store/src/test/java/org/safehaus/triplesec/store/interceptor/ApplicationACIManagerITest.java
    directory/sandbox/djencks/triplesec-jacc2/store/src/test/java/org/safehaus/triplesec/store/interceptor/PolicyProtectionInterceptorITest.java
    directory/sandbox/djencks/triplesec-jacc2/swing-admin/src/main/java/org/safehaus/triplesec/admin/swing/ConnectionManager.java
    directory/sandbox/djencks/triplesec-jacc2/swing-admin/src/main/java/org/safehaus/triplesec/admin/swing/ExternalLinkPanel.java
    directory/sandbox/djencks/triplesec-jacc2/swing-admin/src/main/java/org/safehaus/triplesec/admin/swing/GroupPanel.java
    directory/sandbox/djencks/triplesec-jacc2/swing-admin/src/main/java/org/safehaus/triplesec/admin/swing/GroupUsersPanel.java
    directory/sandbox/djencks/triplesec-jacc2/swing-admin/src/main/java/org/safehaus/triplesec/admin/swing/HotpSettingsPanel.java
    directory/sandbox/djencks/triplesec-jacc2/swing-admin/src/main/java/org/safehaus/triplesec/admin/swing/NewApplicationPanel.java
    directory/sandbox/djencks/triplesec-jacc2/swing-admin/src/main/java/org/safehaus/triplesec/admin/swing/NewGroupPanel.java
    directory/sandbox/djencks/triplesec-jacc2/swing-admin/src/main/java/org/safehaus/triplesec/admin/swing/NewUserPanel.java
    directory/sandbox/djencks/triplesec-jacc2/swing-admin/src/main/java/org/safehaus/triplesec/admin/swing/ProvisioningPanel.java
    directory/sandbox/djencks/triplesec-jacc2/swing-admin/src/main/java/org/safehaus/triplesec/admin/swing/UserDependentsPanel.java
    directory/sandbox/djencks/triplesec-jacc2/swing-admin/src/main/java/org/safehaus/triplesec/admin/swing/UserInfoPanel.java
    directory/sandbox/djencks/triplesec-jacc2/swing-admin/src/main/java/org/safehaus/triplesec/admin/swing/UserPanel.java
    directory/sandbox/djencks/triplesec-jacc2/verifier/src/test/java/org/safehaus/triplesec/verifier/hotp/GenerateHotp.java
    directory/sandbox/djencks/triplesec-jacc2/verifier/src/test/java/org/safehaus/triplesec/verifier/hotp/HotpSamVerifierITest.java
    directory/sandbox/djencks/triplesec-jacc2/webapp-config/src/main/java/org/safehaus/triplesec/configui/util/TriplesecConfigBuilder.java
    directory/sandbox/djencks/triplesec-jacc2/webapp-config/src/test/java/org/safehaus/triplesec/configui/util/TriplesecConfigBuilderTest.java
    directory/sandbox/djencks/triplesec-jacc2/webapp-registration/src/main/java/org/safehaus/triplesec/registration/view/TriplesecRegistrationApplication.java
    directory/sandbox/djencks/triplesec-jacc2/webapp-registration/src/main/java/org/safehaus/triplesec/registration/view/panels/WizardPanelFinish.java
    directory/sandbox/djencks/triplesec-jacc2/webapp-wicket-admin/src/main/java/org/safehaus/triplesec/adminui/services/ConnectionManager.java

Modified: directory/sandbox/djencks/triplesec-jacc2/admin-api2/pom.xml
URL: http://svn.apache.org/viewvc/directory/sandbox/djencks/triplesec-jacc2/admin-api2/pom.xml?view=diff&rev=564425&r1=564424&r2=564425
==============================================================================
--- directory/sandbox/djencks/triplesec-jacc2/admin-api2/pom.xml (original)
+++ directory/sandbox/djencks/triplesec-jacc2/admin-api2/pom.xml Thu Aug  9 16:40:15 2007
@@ -165,7 +165,7 @@
             <plugin>
               <artifactId>maven-surefire-plugin</artifactId>
                 <configuration>
-                  <forkMode>pertest</forkMode>
+                  <forkMode>once</forkMode>
                 </configuration>
             </plugin>
         </plugins>

Modified: directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/ExternalUser.java
URL: http://svn.apache.org/viewvc/directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/ExternalUser.java?view=diff&rev=564425&r1=564424&r2=564425
==============================================================================
--- directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/ExternalUser.java (original)
+++ directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/ExternalUser.java Thu Aug  9 16:40:15 2007
@@ -20,42 +20,42 @@
 package org.safehaus.triplesec.admin;
 
 
-import java.util.Date;
-
-import org.safehaus.triplesec.admin.dao.ExternalUserDao;
+import org.safehaus.triplesec.admin.persistence.SingleValuedField;
+import org.safehaus.triplesec.admin.persistence.StateManager;
 
 
 public class ExternalUser extends User
 {
-    private final String referral;
-    private final ExternalUserDao dao;
-    
-    public ExternalUser( String creatorsName, Date createTimestamp, String modifiersName, 
-        Date modifyTimestamp, ExternalUserDao dao, String id, String description, String referral, boolean disabled )
-    {
-        super( creatorsName, createTimestamp, modifiersName, modifyTimestamp, id, description, disabled );
-        this.dao = dao;
-        this.referral = referral;
-    }
+    //TODO this is wrong
+    public static final String[] attrs = new String[] {"uid",
+            "referral"};
 
+    private final static int REFERRAL_INDEX = 3;
 
-    public ExternalUser( String creatorsName, Date createTimestamp, ExternalUserDao dao, String id, 
-        String description, String referral )
+    public ExternalUser()
     {
-        super( creatorsName, createTimestamp, id, description, false );
-        this.dao = dao;
-        this.referral = referral;
+        super( new StateManager<LocalUser>( ( LocalUser ) null ) );
+        getStateManager().setPc( this );
+        getStateManager().addField( new SingleValuedField<String>( "referral", null ) );
     }
 
-
-    public ExternalUserModifier modifier()
+    public ExternalUser( String id, String description, String referral, boolean disabled )
     {
-        return new ExternalUserModifier( dao, this );
+        this();
+        setId( id );
+        setDescription( description );
+        setDisabled( disabled );
+        setReferral( referral );
     }
 
 
     public String getReferral()
     {
-        return referral;
+        return getStateManager().getStringValue( REFERRAL_INDEX );
+    }
+
+    public void setReferral( String referral )
+    {
+        getStateManager().setStringValue( REFERRAL_INDEX, referral );
     }
 }

Modified: directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/Group.java
URL: http://svn.apache.org/viewvc/directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/Group.java?view=diff&rev=564425&r1=564424&r2=564425
==============================================================================
--- directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/Group.java (original)
+++ directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/Group.java Thu Aug  9 16:40:15 2007
@@ -20,57 +20,88 @@
 package org.safehaus.triplesec.admin;
 
 
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashSet;
+import java.util.Collection;
 import java.util.Set;
 
-import org.safehaus.triplesec.admin.dao.GroupDao;
+import javax.naming.directory.Attributes;
 
+import org.safehaus.triplesec.admin.persistence.PersistenceCapable;
+import org.safehaus.triplesec.admin.persistence.ReferenceMapField;
+import org.safehaus.triplesec.admin.persistence.SimpleRdn;
+import org.safehaus.triplesec.admin.persistence.State;
+import org.safehaus.triplesec.admin.persistence.StateManager;
 
-public class Group extends AdministeredEntity
+
+public class Group implements PersistenceCapable
 {
-    private final GroupDao dao;
-    private final String name;
-    private final Set members;
-    
-    
-    public Group( String creatorsName, Date createTimestamp, GroupDao dao, String name, Set members )
-    {
-        this( creatorsName, createTimestamp, null, null, dao, name, members );
-    }
-    
-    
-    public Group( String creatorsName, Date createTimestamp, String modifiersName, 
-        Date modifyTimestamp, GroupDao dao, String name, Set members )
-    {
-        super( creatorsName, createTimestamp, modifiersName, modifyTimestamp );
-        this.dao = dao;
-        this.name = name;
-        this.members = new HashSet( members );
+    public static final String[] attrs = new String[] {"cn",
+            "uniqueMember"};
+
+    protected static final int NAME_INDEX = 0;
+    protected static final int MEMBERS_INDEX = 1;
+
+    private StateManager<Group> stateManager;
+
+    public Group()
+    {
+        this.stateManager = new StateManager<Group>( this );
+        stateManager.setRdn( new SimpleRdn( "cn", null, "ou=groups" ) );
+        stateManager.addField( new ReferenceMapField<User>( "uniqueMember" ) );
+
+        stateManager.setState( State.EMPTY );
     }
 
+/*
+    public Group( String name, Set<User> members )
+    {
+        this();
+        setName( name );
+    }
+*/
+
 
     public String getName()
     {
-        return name;
+        return stateManager.getId();
+    }
+
+    public void setName( String name )
+    {
+        stateManager.setId( name );
     }
 
 
-    public Set getMembers()
+    public Collection<User> getMembers()
+    {
+        return stateManager.getReferenceMapField( MEMBERS_INDEX ).getCurrentValues();
+    }
+
+    public void addMember( User member )
     {
-        return Collections.unmodifiableSet( members );
+        stateManager.getReferenceMapField( MEMBERS_INDEX ).addValue( member );
     }
-    
-    
-    public GroupModifier modifier()
+
+    public void removeMember( User member )
     {
-        return new GroupModifier( dao, this );
+        stateManager.getReferenceMapField( MEMBERS_INDEX ).removeValue( member );
     }
-    
-    
+
     public String toString()
     {
-        return name;
+        return getName();
+    }
+
+    public StateManager getStateManager()
+    {
+        return stateManager;
+    }
+
+    public Attributes getAttributes()
+    {
+        return null;
+    }
+
+    public void parentSet( StateManager parentSm )
+    {
     }
 }

Modified: directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/HauskeysUser.java
URL: http://svn.apache.org/viewvc/directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/HauskeysUser.java?view=diff&rev=564425&r1=564424&r2=564425
==============================================================================
--- directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/HauskeysUser.java (original)
+++ directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/HauskeysUser.java Thu Aug  9 16:40:15 2007
@@ -20,221 +20,204 @@
 package org.safehaus.triplesec.admin;
 
 
-import java.util.Date;
+import org.safehaus.triplesec.admin.persistence.SingleValuedField;
+import org.safehaus.triplesec.admin.persistence.StateManager;
 
-import org.safehaus.triplesec.admin.dao.HauskeysUserDao;
 
-
-public class HauskeysUser extends User
+public class HauskeysUser extends LocalUser
 {
-    private final HauskeysUserDao dao;
-    private final String firstName;
-    private final String lastName;
-    private final String password;
-    private final String mobile;
-    private final String email;
-    private final String notifyBy;
-    private final String mobileCarrier;
-    private final String tokenPin;
-    private final String midletName;
-    private final String failuresInEpoch;
-    private final String activationKey;
-    private final String realm;
-    private final String secret;
-    private final String label;
-    private final String movingFactor;
-    private final String address1;
-    private final String address2;
-    private final String city;
-    private final String stateProvRegion;
-    private final String zipPostalCode;
-    private final String country;
-    private final String company;
-    
-    
-    public HauskeysUser( String creatorsName, Date createTimestamp, String modifiersName, 
-        Date modifyTimestamp, HauskeysUserDao dao, String id, String description, String firstName, 
-        String lastName, String password, String mobile, String email, String notifyBy, 
-        String mobileCarrier, String tokenPin, String midletName, String failuresInEpoch, 
-        String activationKey, String realm, String secret, String label, String movingFactor, 
-        String address1, String address2, String city, String stateProvRegion, 
-        String zipPostalCode, String country, String company, boolean disabled )
-    {
-        super( creatorsName, createTimestamp, modifiersName, modifyTimestamp, id, description, disabled );
-        this.dao = dao;
-        this.firstName = firstName;
-        this.lastName = lastName;
-        this.password = password;
-        this.mobile = mobile;
-        this.email = email;
-        this.notifyBy = notifyBy;
-        this.mobileCarrier = mobileCarrier;
-        this.tokenPin = tokenPin;
-        this.midletName = midletName;
-        this.failuresInEpoch = failuresInEpoch;
-        this.activationKey = activationKey;
-        this.realm = realm;
-        this.secret = secret;
-        this.label = label;
-        this.movingFactor = movingFactor;
-        this.address1 = address1;
-        this.address2 = address2;
-        this.city = city;
-        this.stateProvRegion = stateProvRegion;
-        this.zipPostalCode = zipPostalCode;
-        this.country = country;
-        this.company = company;
-    }
-
-
-    public HauskeysUser( String creatorsName, Date createTimestamp, HauskeysUserDao dao, String id, 
-        String description, String firstName, String lastName, String password, String mobile, 
-        String email, String notifyBy, String mobileCarrier, String tokenPin, String midletName, 
-        String failuresInEpoch, String activationKey, String realm, String secret, String label, 
-        String movingFactor, String address1, String address2, String city, String stateProvRegion, 
-        String zipPostalCode, String country, String company, boolean disabled )
-    {
-        this( creatorsName, createTimestamp, null, null, dao, id, description, firstName, lastName, 
-            password, mobile, email, notifyBy, mobileCarrier, tokenPin, midletName, failuresInEpoch, 
-            activationKey, realm, secret, label, movingFactor, address1, address2, city, stateProvRegion, 
-            zipPostalCode, country, company, disabled );
+    //TODO this is wrong
+    public static final String[] attrs = new String[] {"uid",
+            "referral"};
+
+    private static final int MOBILE_INDEX = 14;
+    private static final int NOTIFYBY_INDEX = 14;
+    private static final int MOBILECARRIER_INDEX = 14;
+    private static final int TOKENPIN_INDEX = 14;
+    private static final int MIDLETNAME_INDEX = 14;
+    private static final int FAILURESINEPOCH_INDEX = 14;
+    private static final int ACTIVATIONKEY_INDEX = 14;
+    private static final int REALM_INDEX = 14;
+    private static final int SECRET_INDEX = 14;
+    private static final int LABEL_INDEX = 14;
+    private static final int MOVINGFACTOR_INDEX = 14;
+
+
+    public HauskeysUser()
+    {
+        super( new StateManager<HauskeysUser>( ( HauskeysUser ) null ) );
+        getStateManager().setPc( this );
+
+        getStateManager().addField( new SingleValuedField<String>( "mobile", null ) );
+        getStateManager().addField( new SingleValuedField<String>( "notifyBy", null ) );
+        getStateManager().addField( new SingleValuedField<String>( "mobileCarrier", null ) );
+        getStateManager().addField( new SingleValuedField<String>( "tokenPin", null ) );
+        getStateManager().addField( new SingleValuedField<String>( "midletName", null ) );
+        getStateManager().addField( new SingleValuedField<String>( "failuresInEpoch", null ) );
+        getStateManager().addField( new SingleValuedField<String>( "activationKey", null ) );
+        getStateManager().addField( new SingleValuedField<String>( "realm", null ) );
+        getStateManager().addField( new SingleValuedField<String>( "secret", null ) );
+        getStateManager().addField( new SingleValuedField<String>( "label", null ) );
+        getStateManager().addField( new SingleValuedField<String>( "movingFactor", null ) );
+    }
+
+    public HauskeysUser( String id, String description, String firstName,
+            String lastName, String password, String mobile, String email, String notifyBy,
+            String mobileCarrier, String tokenPin, String midletName, String failuresInEpoch,
+            String activationKey, String realm, String secret, String label, String movingFactor,
+            String address1, String address2, String city, String stateProvRegion,
+            String zipPostalCode, String country, String company, boolean disabled )
+    {
+        this();
+        setId( id );
+        setDescription( description );
+        setDisabled( disabled );
+
+        setFirstName( firstName );
+        setLastName( lastName );
+        setPassword( password );
+        setEmail( email );
+        setAddress1( address1 );
+        setAddress2( address2 );
+        setCity( city );
+        setStateProvRegion( stateProvRegion );
+        setZipPostalCode( zipPostalCode );
+        setCountry( country );
+        setCompany( company );
+
+        setMobile( mobile );
+        setNotifyBy( notifyBy );
+        setMobileCarrier( mobileCarrier );
+        setTokenPin( tokenPin );
+        setMidletName( midletName );
+        setFailuresInEpoch( failuresInEpoch );
+        setActivationKey( activationKey );
+        setRealm( realm );
+        setSecret( secret );
+        setLabel( label );
+        setMovingFactor( movingFactor );
     }
 
 
     public String getMobile()
     {
-        return mobile;
+        return getStateManager().getStringValue( MOBILE_INDEX );
     }
 
 
-    public String getEmail()
+    public void setMobile( String mobile )
     {
-        return email;
+        getStateManager().setStringValue( MOBILE_INDEX, mobile );
     }
 
-
     public String getNotifyBy()
     {
-        return notifyBy;
+        return getStateManager().getStringValue( NOTIFYBY_INDEX );
     }
 
 
-    public String getMobileCarrier()
+    public void setNotifyBy( String notifyBy )
     {
-        return mobileCarrier;
+        getStateManager().setStringValue( NOTIFYBY_INDEX, notifyBy );
     }
 
-
-    public String getTokenPin()
+    public String getMobileCarrier()
     {
-        return tokenPin;
+        return getStateManager().getStringValue( MOBILECARRIER_INDEX );
     }
 
 
-    public String getMidletName()
+    public void setMobileCarrier( String mobileCarrier )
     {
-        return midletName;
+        getStateManager().setStringValue( MOBILECARRIER_INDEX, mobileCarrier );
     }
 
-
-    public String getFailuresInEpoch()
+    public String getTokenPin()
     {
-        return failuresInEpoch;
+        return getStateManager().getStringValue( TOKENPIN_INDEX );
     }
 
 
-    public String getActivationKey()
+    public void setTokenPin( String tokenPin )
     {
-        return activationKey;
+        getStateManager().setStringValue( TOKENPIN_INDEX, tokenPin );
     }
 
-
-    public String getRealm()
+    public String getMidletName()
     {
-        return realm;
+        return getStateManager().getStringValue( MIDLETNAME_INDEX );
     }
 
 
-    public String getSecret()
+    public void setMidletName( String midletName )
     {
-        return secret;
+        getStateManager().setStringValue( MIDLETNAME_INDEX, midletName );
     }
 
-
-    public String getLabel()
+    public String getFailuresInEpoch()
     {
-        return label;
+        return getStateManager().getStringValue( FAILURESINEPOCH_INDEX );
     }
 
 
-    public String getMovingFactor()
+    public void setFailuresInEpoch( String failuresInEpoch )
     {
-        return movingFactor;
+        getStateManager().setStringValue( FAILURESINEPOCH_INDEX, failuresInEpoch );
     }
-    
-    
-    public String getFirstName()
+
+    public String getActivationKey()
     {
-        return firstName;
+        return getStateManager().getStringValue( ACTIVATIONKEY_INDEX );
     }
 
 
-    public String getLastName()
+    public void setActivationKey( String activationKey )
     {
-        return lastName;
+        getStateManager().setStringValue( ACTIVATIONKEY_INDEX, activationKey );
     }
 
-
-    public String getPassword()
+    public String getRealm()
     {
-        return password;
+        return getStateManager().getStringValue( REALM_INDEX );
     }
 
 
-    public String getAddress1()
+    public void setRealm( String realm )
     {
-        return address1;
+        getStateManager().setStringValue( REALM_INDEX, realm );
     }
 
-
-    public String getAddress2()
+    public String getSecret()
     {
-        return address2;
+        return getStateManager().getStringValue( SECRET_INDEX );
     }
 
 
-    public String getCity()
+    public void setSecret( String secret )
     {
-        return city;
+        getStateManager().setStringValue( SECRET_INDEX, secret );
     }
 
-
-    public String getStateProvRegion()
+    public String getLabel()
     {
-        return stateProvRegion;
+        return getStateManager().getStringValue( LABEL_INDEX );
     }
 
 
-    public String getZipPostalCode()
+    public void setLabel( String label )
     {
-        return zipPostalCode;
+        getStateManager().setStringValue( LABEL_INDEX, label );
     }
 
-
-    public String getCountry()
+    public String getMovingFactor()
     {
-        return country;
+        return getStateManager().getStringValue( MOVINGFACTOR_INDEX );
     }
 
 
-    public String getCompany()
+    public void setMovingFactor( String movingFactor )
     {
-        return company;
+        getStateManager().setStringValue( MOVINGFACTOR_INDEX, movingFactor );
     }
 
-    
-    public HauskeysUserModifier modifier()
-    {
-        return new HauskeysUserModifier( dao, this );
-    }
 }

Modified: directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/LocalUser.java
URL: http://svn.apache.org/viewvc/directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/LocalUser.java?view=diff&rev=564425&r1=564424&r2=564425
==============================================================================
--- directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/LocalUser.java (original)
+++ directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/LocalUser.java Thu Aug  9 16:40:15 2007
@@ -20,139 +20,189 @@
 package org.safehaus.triplesec.admin;
 
 
-import java.util.Date;
-
-import org.safehaus.triplesec.admin.dao.LocalUserDao;
+import org.safehaus.triplesec.admin.persistence.SingleValuedField;
+import org.safehaus.triplesec.admin.persistence.StateManager;
 
 
 public class LocalUser extends User
 {
-    private final LocalUserDao dao;
-    private final String firstName;
-    private final String lastName;
-    private final String password;
-    private final String address1;
-    private final String address2;
-    private final String city;
-    private final String stateProvRegion;
-    private final String zipPostalCode;
-    private final String country;
-    private final String company;
-    private final String email;
-    
-    
-    public LocalUser( String creatorsName, Date createTimestamp, String modifiersName, 
-        Date modifyTimestamp, LocalUserDao dao, String id, String description, String firstName, 
-        String lastName, String password, String address1, String address2, String city, String stateProvRegion, 
-        String zipPostalCode, String country, String company, String email, boolean disabled )
-    {
-        super( creatorsName, createTimestamp, modifiersName, modifyTimestamp, id, description, disabled );
-        this.dao = dao;
-        this.firstName = firstName;
-        this.lastName = lastName;
-        this.password = password;
-        
-        this.address1 = address1;
-        this.address2 = address2;
-        this.city = city;
-        this.stateProvRegion = stateProvRegion;
-        this.zipPostalCode = zipPostalCode;
-        this.country = country;
-        this.company = company;
-        this.email = email;
-    }
-
+    //TODO this is wrong
+    public static final String[] attrs = new String[] {"uid",
+            "referral"};
+
+    private final static int FIRST_NAME_INDEX = 3;
+    private final static int LAST_NAME_INDEX = 4;
+    private final static int PASSWORD_INDEX = 5;
+    private final static int ADDRESS1_INDEX = 6;
+    private final static int ADDRESS2_INDEX = 7;
+    private final static int CITY_INDEX = 8;
+    private final static int STATEPROVREGION_INDEX = 9;
+    private final static int ZIPPOSTALCODE_INDEX = 10;
+    private final static int COUNTRY_INDEX = 11;
+    private final static int COMPANY_INDEX = 12;
+    private final static int EMAIL_INDEX = 13;
+
+    public LocalUser()
+    {
+        this( new StateManager<LocalUser>( ( LocalUser ) null ) );
+        getStateManager().setPc( this );
+    }
+
+    protected LocalUser( StateManager<? extends LocalUser> stateManager )
+    {
+        super( stateManager );
+        getStateManager().addField( new SingleValuedField<String>( "firstname", null ) );
+        getStateManager().addField( new SingleValuedField<String>( "lastname", null ) );
+        getStateManager().addField( new SingleValuedField<String>( "password", null ) );
+        getStateManager().addField( new SingleValuedField<String>( "address1", null ) );
+        getStateManager().addField( new SingleValuedField<String>( "address2", null ) );
+        getStateManager().addField( new SingleValuedField<String>( "city", null ) );
+        getStateManager().addField( new SingleValuedField<String>( "stateProvRegion", null ) );
+        getStateManager().addField( new SingleValuedField<String>( "zipPostalCode", null ) );
+        getStateManager().addField( new SingleValuedField<String>( "country", null ) );
+        getStateManager().addField( new SingleValuedField<String>( "company", null ) );
+        getStateManager().addField( new SingleValuedField<String>( "email", null ) );
 
-    public LocalUser( String creatorsName, Date createTimestamp, LocalUserDao dao, String id, 
-        String description, String firstName, String lastName, String password, String address1, 
-        String address2, String city, String stateProvRegion, String zipPostalCode, String country, 
-        String company, String email, boolean disabled )
-    {
-        super( creatorsName, createTimestamp, id, description, disabled );
-        this.dao = dao;
-        this.firstName = firstName;
-        this.lastName = lastName;
-        this.password = password;
-        
-        this.address1 = address1;
-        this.address2 = address2;
-        this.city = city;
-        this.stateProvRegion = stateProvRegion;
-        this.zipPostalCode = zipPostalCode;
-        this.country = country;
-        this.company = company;
-        this.email = email;
     }
 
+    public LocalUser( String id, String description, String firstName,
+            String lastName, String password, String address1, String address2, String city, String stateProvRegion,
+            String zipPostalCode, String country, String company, String email, boolean disabled )
+    {
+        this();
+        setId( id );
+        setDescription( description );
+        setDisabled( disabled );
+        setFirstName( firstName );
+        setLastName( lastName );
+        setPassword( password );
+        setAddress1( address1 );
+        setAddress2( address2 );
+        setCity( city );
+        setStateProvRegion( stateProvRegion );
+        setZipPostalCode( zipPostalCode );
+        setCountry( country );
+        setCompany( company );
+        setEmail( email );
+    }
 
-    public LocalUserModifier modifier()
+    public String getFirstName()
     {
-        return new LocalUserModifier( dao, this );
+        return getStateManager().getStringValue( FIRST_NAME_INDEX );
     }
 
-
-    public String getFirstName()
+    public void setFirstName( String firstName )
     {
-        return firstName;
+        getStateManager().setStringValue( FIRST_NAME_INDEX, firstName );
     }
 
 
     public String getEmail()
     {
-        return email;
+        return getStateManager().getStringValue( EMAIL_INDEX );
     }
 
 
+    public void setEmail( String email )
+    {
+        getStateManager().setStringValue( EMAIL_INDEX, email );
+    }
+
     public String getLastName()
     {
-        return lastName;
+        return getStateManager().getStringValue( LAST_NAME_INDEX );
     }
 
 
+    public void setLastName( String lastName )
+    {
+        getStateManager().setStringValue( LAST_NAME_INDEX, lastName );
+    }
+
     public String getPassword()
     {
-        return password;
+        return getStateManager().getStringValue( PASSWORD_INDEX );
     }
 
 
+    public void setPassword( String password )
+    {
+        getStateManager().setStringValue( PASSWORD_INDEX, password );
+    }
+
     public String getAddress1()
     {
-        return address1;
+        return getStateManager().getStringValue( ADDRESS1_INDEX );
     }
 
 
+    public void setAddress1( String address1 )
+    {
+        getStateManager().setStringValue( ADDRESS1_INDEX, address1 );
+    }
+
     public String getAddress2()
     {
-        return address2;
+        return getStateManager().getStringValue( ADDRESS2_INDEX );
     }
 
 
+    public void setAddress2( String address2 )
+    {
+        getStateManager().setStringValue( ADDRESS2_INDEX, address2 );
+    }
+
     public String getCity()
     {
-        return city;
+        return getStateManager().getStringValue( CITY_INDEX );
     }
 
 
+    public void setCity( String city )
+    {
+        getStateManager().setStringValue( CITY_INDEX, city );
+    }
+
     public String getStateProvRegion()
     {
-        return stateProvRegion;
+        return getStateManager().getStringValue( STATEPROVREGION_INDEX );
     }
 
 
+    public void setStateProvRegion( String stateProvRegion )
+    {
+        getStateManager().setStringValue( STATEPROVREGION_INDEX, stateProvRegion );
+    }
+
     public String getZipPostalCode()
     {
-        return zipPostalCode;
+        return getStateManager().getStringValue( ZIPPOSTALCODE_INDEX );
     }
 
 
+    public void setZipPostalCode( String zipPostalCode )
+    {
+        getStateManager().setStringValue( ZIPPOSTALCODE_INDEX, zipPostalCode );
+    }
+
     public String getCountry()
     {
-        return country;
+        return getStateManager().getStringValue( COUNTRY_INDEX );
     }
 
 
+    public void setCountry( String country )
+    {
+        getStateManager().setStringValue( COUNTRY_INDEX, country );
+    }
+
     public String getCompany()
     {
-        return company;
+        return getStateManager().getStringValue( COMPANY_INDEX );
+    }
+
+    public void setCompany( String company )
+    {
+        getStateManager().setStringValue( COMPANY_INDEX, company );
     }
 }

Modified: directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/Profile.java
URL: http://svn.apache.org/viewvc/directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/Profile.java?view=diff&rev=564425&r1=564424&r2=564425
==============================================================================
--- directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/Profile.java (original)
+++ directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/Profile.java Thu Aug  9 16:40:15 2007
@@ -71,6 +71,7 @@
 
     }
 
+/*
     public Profile(  String profileId, String description,
             Set grants, Set denials, Set roles, boolean disabled, String user )
     {
@@ -80,6 +81,7 @@
         stateManager.setStringValue( DESCRIPTION_INDEX, description);
         stateManager.setStringValue( USERID_INDEX, user);
     }
+*/
 
 
 
@@ -160,11 +162,11 @@
 
     public boolean isDisabled()
     {
-        return ((SingleValuedField<Boolean>)stateManager.getField( DISABLED_INDEX)).getCurrentValue();
+        return stateManager.getBooleanValue( DISABLED_INDEX);
     }
 
     public void setDisabled(boolean disabled) {
-        ((SingleValuedField<Boolean>)stateManager.getField( DISABLED_INDEX)).setValue( disabled);
+        stateManager.setBooleanValue( DISABLED_INDEX, disabled);
     }
 
 

Modified: directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/TriplesecAdmin.java
URL: http://svn.apache.org/viewvc/directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/TriplesecAdmin.java?view=diff&rev=564425&r1=564424&r2=564425
==============================================================================
--- directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/TriplesecAdmin.java (original)
+++ directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/TriplesecAdmin.java Thu Aug  9 16:40:15 2007
@@ -20,23 +20,20 @@
 package org.safehaus.triplesec.admin;
 
 
-import java.util.HashSet;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Properties;
-import java.util.Set;
 
 import javax.naming.NamingException;
 import javax.naming.directory.DirContext;
 import javax.naming.ldap.InitialLdapContext;
 
-import org.safehaus.triplesec.admin.dao.DaoFactory;
-import org.safehaus.triplesec.admin.dao.ExternalUserDao;
-import org.safehaus.triplesec.admin.dao.GroupDao;
-import org.safehaus.triplesec.admin.dao.HauskeysUserDao;
-import org.safehaus.triplesec.admin.dao.LocalUserDao;
-import org.safehaus.triplesec.admin.dao.UserDao;
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.commons.lang.math.RandomUtils;
 import org.safehaus.triplesec.admin.persistence.EntityManager;
 import org.safehaus.triplesec.admin.persistence.EntityManagerImpl;
+import org.safehaus.triplesec.admin.persistence.PCException;
 import org.safehaus.triplesec.admin.persistence.Query;
 
 
@@ -50,13 +47,18 @@
      */
     private String appDn;
     private Query<Application> appQuery;
+    private Query<Group> groupQuery;
+    private Query<ExternalUser> externalUserQuery;
+    private Query<HauskeysUser> hauskeysUserQuery;
+    private Query<LocalUser> localUserQuery;
+    private Query<User> userQuery;
+    private Query<User> userByActivationKey;
     //deprecated
-    private DaoFactory factory;
-    private GroupDao groupDao;
-    private ExternalUserDao externalUserDao;
-    private LocalUserDao localUserDao;
-    private HauskeysUserDao hauskeysUserDao;
-    private UserDao userDao;
+//    private DaoFactory factory;
+//    private ExternalUserDao externalUserDao;
+//    private LocalUserDao localUserDao;
+//    private HauskeysUserDao hauskeysUserDao;
+//    private UserDao userDao;
 
 
     public TriplesecAdmin( EntityManager entityManager, String appDn )
@@ -64,6 +66,13 @@
         this.entityManager = entityManager;
         this.appDn = appDn;
         appQuery = ( Query<Application> ) entityManager.createQuery( appDn, Application.class, "(& (appName=*) (objectClass=policyApplication) )");
+        groupQuery = ( Query<Group> ) entityManager.createQuery( "ou=Groups", Group.class, "(& (cn=:groupId) (objectClass=groupOfUniqueNames))");
+        //TODO figure out how to query for multiple object classes
+        externalUserQuery = ( Query<ExternalUser> ) entityManager.createQuery( "ou=Users", ExternalUser.class, "(& (uid=:uid) (objectClass=referral))");
+        hauskeysUserQuery = ( Query<HauskeysUser> ) entityManager.createQuery( "ou=Users", HauskeysUser.class, "(& (uid=:uid) (objectClass=safehausProfile))");
+        localUserQuery = ( Query<LocalUser> ) entityManager.createQuery( "ou=Users", LocalUser.class, "(& (uid=:uid) (objectClass=krb5Principal))");
+        userQuery = ( Query<User> ) entityManager.createQuery( "ou=Users", User.class, "(& (uid=:uid) (| (objectClass=referral) (objectClass=person) ))");
+        userByActivationKey = ( Query<User> ) entityManager.createQuery( "ou=Users", User.class, "(& (safehausActivationKey=:activationKey) (| (objectClass=referral) (objectClass=person) ))");
     }
 
     /**
@@ -90,12 +99,12 @@
             throw new DataAccessException( "Could not construct DirContext", e);
         }
         entityManager = new EntityManagerImpl(dirContext, rootDn);
-        factory = DaoFactory.createInstance( props );
-        groupDao = factory.getGroupDao();
-        externalUserDao = factory.getExternalUserDao();
-        localUserDao = factory.getLocalUserDao();
-        hauskeysUserDao = factory.getHauskeysUserDao();
-        userDao = factory.getUserDao();
+        groupQuery = ( Query<Group> ) entityManager.createQuery( "ou=Groups",  Group.class, "(& (cn=:groupId) (objectClass=groupOfUniqueNames))");
+//        factory = DaoFactory.createInstance( props );
+//        externalUserDao = factory.getExternalUserDao();
+//        localUserDao = factory.getLocalUserDao();
+//        hauskeysUserDao = factory.getHauskeysUserDao();
+//        userDao = factory.getUserDao();
     }
 
 
@@ -110,39 +119,51 @@
     // -----------------------------------------------------------------------
 
 
-    public ExternalUserModifier newExternalUser( String id, String referral )
-    {
-        return new ExternalUserModifier( externalUserDao, id, referral );
-    }
-
-
-    public LocalUserModifier newLocalUser( String id, String firstName, String lastName, String password )
-    {
-        return new LocalUserModifier( localUserDao, id, firstName, lastName, password );
-    }
-
-
-    public HauskeysUserModifier newHauskeysUser( String id, String firstName, String lastName, String password )
-    {
-        return new HauskeysUserModifier( hauskeysUserDao, id, firstName, lastName, password );
-    }
-
 
     public User getUser( String id ) throws DataAccessException
     {
-        return userDao.load( id );
-    }
+        Map<String, String> parameters = new HashMap<String, String>();
+        parameters.put("uid", id);
+        Map<String, User> results = userQuery.execute( parameters );
+        if (results.isEmpty()) {
+            return null;
+        }
+        Iterator<User> iterator = results.values().iterator();
+        User user = iterator.next();
+        if (iterator.hasNext()) {
+            throw new DataAccessException("More than one user found: " + results);
+        }
+        return user;
+     }
 
 
     public boolean hasUser( String id ) throws DataAccessException
     {
-        return userDao.hasUser( id );
+        return getUser( id ) != null;
     }
 
 
     public String getRandomUniqueActivationKey() throws DataAccessException
     {
-        return userDao.getRandomUniqueActivationKey();
+        String key = null;
+        int count = 0;
+        boolean isNotUnique = true;
+        while( isNotUnique && count < 10 )
+        {
+            // max length 16, min length 8 bytes
+            int length = 8 + RandomUtils.nextInt() % 8;
+            key = RandomStringUtils.randomNumeric( length );
+
+            try
+            {
+                isNotUnique = !userByActivationKey.execute("activationKey", key).isEmpty();
+            } catch ( PCException e )
+            {
+                throw new DataAccessException("Could not search for activation key", e);
+            }
+        }
+
+        return key;
     }
 
 
@@ -177,28 +198,26 @@
     // -----------------------------------------------------------------------
 
 
-    public GroupModifier newGroup( String name, String member )
-    {
-        Set members = new HashSet();
-        members.add( member );
-        return new GroupModifier( groupDao, name, members );
-    }
-
 
-    public GroupModifier newGroup( String name, Set members )
+    public synchronized Group getGroup( String name ) throws DataAccessException
     {
-        return new GroupModifier( groupDao, name, members );
-    }
-
-
-    public Group getGroup( String name ) throws DataAccessException
-    {
-        return groupDao.load( name );
+        Map<String, String> parameters = new HashMap<String, String>();
+        parameters.put("groupId", name);
+        Map<String, Group> results = groupQuery.execute( parameters );
+        if (results.isEmpty()) {
+            return null;
+        }
+        Iterator<Group> iterator = results.values().iterator();
+        Group group = iterator.next();
+        if (iterator.hasNext()) {
+            throw new DataAccessException("More than one group found: " + results);
+        }
+        return group;
     }
 
     public void close()
     {
         entityManager.close();
-        factory.close();
+//        factory.close();
     }
 }

Modified: directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/User.java
URL: http://svn.apache.org/viewvc/directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/User.java?view=diff&rev=564425&r1=564424&r2=564425
==============================================================================
--- directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/User.java (original)
+++ directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/User.java Thu Aug  9 16:40:15 2007
@@ -20,58 +20,99 @@
 package org.safehaus.triplesec.admin;
 
 
-import java.util.Date;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.BasicAttributes;
 
+import org.safehaus.triplesec.admin.persistence.PersistenceCapable;
+import org.safehaus.triplesec.admin.persistence.SimpleRdn;
+import org.safehaus.triplesec.admin.persistence.SingleValuedField;
+import org.safehaus.triplesec.admin.persistence.State;
+import org.safehaus.triplesec.admin.persistence.StateManager;
 
-public abstract class User extends AdministeredEntity
+
+public class User implements PersistenceCapable
 {
-    private final String id;
-    private final String description;
-    private final boolean disabled;
-    
-    
-    public User( String creatorsName, Date createTimestamp, String id, String description )
-    {
-        this( creatorsName, createTimestamp, null, null, id, description, false );
-    }
-    
-    
-    public User( String creatorsName, Date createTimestamp, String id, String description, boolean disabled )
-    {
-        this( creatorsName, createTimestamp, null, null, id, description, false );
-    }
-    
-    
-    public User( String creatorsName, Date createTimestamp, String modifiersName, 
-        Date modifyTimestamp, String id, String description, boolean disabled )
-    {
-        super( creatorsName, createTimestamp, modifiersName, modifyTimestamp );
-        this.id = id;
-        this.description = description;
-        this.disabled = disabled;
+    public static final String[] attrs = new String[] {"uid",
+            Constants.DESCRIPTION_ID, null,
+            Constants.SAFEHAUS_DISABLED_ID};
+
+    protected static final int ID_INDEX = 0;
+    protected static final int DESCRIPTION_INDEX = 1;
+    protected static final int DISABLED_INDEX = 2;
+
+    private StateManager<? extends User> stateManager;
+
+    public User( StateManager<? extends User> stateManager )
+    {
+        this.stateManager = stateManager;
+        stateManager.setRdn( new SimpleRdn( "uid", null, "ou=users" ) );
+        stateManager.addField( new SingleValuedField<String>( Constants.DESCRIPTION_ID, null ) );
+        stateManager.addField( new SingleValuedField<Boolean>( Constants.SAFEHAUS_DISABLED_ID, null ) );
+
+        stateManager.setState( State.EMPTY );
+    }
+
+    public User( StateManager<? extends User> stateManager, String id, String description )
+    {
+        this( stateManager, id, description, false );
+    }
+
+    public User( StateManager<? extends User> stateManager, String id, String description, boolean disabled )
+    {
+        this( stateManager );
+        setId( id );
+        setDescription( description );
+        setDisabled( disabled );
     }
 
 
     public String getId()
     {
-        return id;
+        return stateManager.getId();
     }
 
 
+    public void setId( String id )
+    {
+        stateManager.setId( id );
+    }
+
     public String getDescription()
     {
-        return description;
+        return stateManager.getStringValue( DESCRIPTION_INDEX );
+    }
+
+    public void setDescription( String description )
+    {
+        stateManager.setStringValue( DESCRIPTION_INDEX, description );
+    }
+
+    public boolean isDisabled()
+    {
+        return stateManager.getBooleanValue( DISABLED_INDEX );
     }
 
+    public void setDisabled( boolean disabled )
+    {
+        stateManager.setBooleanValue( DISABLED_INDEX, disabled );
+    }
 
     public String toString()
     {
-        return id;
+        return getId();
     }
-    
-    
-    public boolean isDisabled()
+
+    public StateManager getStateManager()
+    {
+        return stateManager;
+    }
+
+    public Attributes getAttributes()
+    {
+        return new BasicAttributes( Constants.OBJECT_CLASS_ID, "person", true );
+    }
+
+    public void parentSet( StateManager parentSm )
     {
-        return disabled;
     }
 }

Modified: directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/persistence/Query.java
URL: http://svn.apache.org/viewvc/directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/persistence/Query.java?view=diff&rev=564425&r1=564424&r2=564425
==============================================================================
--- directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/persistence/Query.java (original)
+++ directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/persistence/Query.java Thu Aug  9 16:40:15 2007
@@ -31,8 +31,14 @@
 
     Map<String, T> execute();
 
-    Map<String, T> execute(String rdn);
+    Map<String, T> execute( String rdn );
+
+    Map<String, T> execute( PersistenceCapable parent );
+
+    Map<String, T> execute( Map<String, String> parameters );
+
+    Map<String, T> execute( String paramName, String paramValue );
+
+    void setParameter( String paramName, String paramValue );
 
-    Map<String, T> execute(PersistenceCapable parent);
-   
 }

Modified: directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/persistence/QueryImpl.java
URL: http://svn.apache.org/viewvc/directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/persistence/QueryImpl.java?view=diff&rev=564425&r1=564424&r2=564425
==============================================================================
--- directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/persistence/QueryImpl.java (original)
+++ directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/persistence/QueryImpl.java Thu Aug  9 16:40:15 2007
@@ -23,6 +23,9 @@
 import java.util.Collection;
 import java.util.Map;
 import java.util.HashMap;
+import java.util.Collections;
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
 import java.lang.reflect.*;
 
 import javax.naming.directory.SearchControls;
@@ -33,16 +36,19 @@
 import javax.naming.NamingException;
 
 /**
- * @version $Rev:$ $Date:$
+ * @version $Rev$ $Date$
  */
 public class QueryImpl<T extends PersistenceCapable> implements Query<T>, ChangeListener<T>
 {
+
+    private static final Pattern paramsPattern = Pattern.compile( ":\\w");
     private final EntityManagerImpl em;
     private final Class<T> pcClass;
     private final String query;
     private final SearchControls controls;
     private String rdn;
     private PersistenceCapable parent;
+    private Map<String, String> parameters;
 
 
     public QueryImpl( EntityManagerImpl em, Class<T> pcClass, String query )
@@ -77,6 +83,22 @@
 
     public Map<String, T> execute()
     {
+        String substitutedQuery = substitute( parameters );
+        return internalExecute( substitutedQuery );
+    }
+
+    public Map<String, T> execute( Map<String, String> parameters) {
+        String substitedQuery = substitute( parameters );
+        return internalExecute( substitedQuery );
+    }
+    public Map<String, T> execute( String paramName, String paramValue) {
+        Map<String, String> parameters = Collections.singletonMap( paramName, paramValue);
+        String substitedQuery = substitute( parameters );
+        return internalExecute( substitedQuery );
+    }
+
+    private Map<String, T> internalExecute( String substitutedQuery )
+    {
         Map<String, T> map = new HashMap<String, T>();
         DirContext ctx = em.getDirContext();
         StringBuffer buf = rdn == null? new StringBuffer(): new StringBuffer(rdn).append(",");
@@ -87,7 +109,7 @@
         String name = buf.toString();
         try
         {
-            for ( NamingEnumeration ne = ctx.search( name, query, controls) ; ne.hasMoreElements(); ) {
+            for ( NamingEnumeration ne = ctx.search( name, substitutedQuery, controls) ; ne.hasMoreElements(); ) {
                 SearchResult result = ( SearchResult ) ne.nextElement();
                 Attributes attrs = result.getAttributes();
                 String dn = result.getName();
@@ -123,6 +145,30 @@
     {
         setParent( parent );
         return execute();
+    }
+
+    public void setParameter( String paramName, String paramValue )
+    {
+        if (parameters == null ){
+            parameters  = new HashMap<String, String>();
+        }
+        parameters.put(paramName, paramValue);
+    }
+
+    private String substitute( Map<String, String> parameters ) {
+        Matcher matcher = paramsPattern.matcher( query);
+        StringBuffer result = new StringBuffer();
+        while (matcher.find( )) {
+            String paramName = matcher.group().substring( 1); //remove leading :
+            String value = parameters.get(paramName);
+            if (value == null) {
+                //TODO should this throw an exception?
+                value = "";
+            }
+            matcher.appendReplacement( result, value);
+        }
+        matcher.appendTail( result);
+        return result.toString();
     }
 
     public void changed( String oldId, String newId, T t )

Modified: directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/persistence/StateManager.java
URL: http://svn.apache.org/viewvc/directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/persistence/StateManager.java?view=diff&rev=564425&r1=564424&r2=564425
==============================================================================
--- directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/persistence/StateManager.java (original)
+++ directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/main/java/org/safehaus/triplesec/admin/persistence/StateManager.java Thu Aug  9 16:40:15 2007
@@ -218,6 +218,20 @@
         }
     }
 
+    public Boolean getBooleanValue( int pos )
+    {
+        return ( ( SingleValuedField<Boolean> ) getField( pos ) ).getCurrentValue();
+    }
+
+    public void setBooleanValue( int pos, Boolean value )
+    {
+        ( ( SingleValuedField<Boolean> ) getField( pos ) ).setValue( value );
+        if ( state == State.CLEAN )
+        {
+            state = State.DIRTY;
+        }
+    }
+
     public ModificationItem[] getModificationItems()
     {
         List<ModificationItem> mods = new ArrayList<ModificationItem>();

Modified: directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/test/java/org/safehaus/triplesec/admin/IntegrationTest.java
URL: http://svn.apache.org/viewvc/directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/test/java/org/safehaus/triplesec/admin/IntegrationTest.java?view=diff&rev=564425&r1=564424&r2=564425
==============================================================================
--- directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/test/java/org/safehaus/triplesec/admin/IntegrationTest.java (original)
+++ directory/sandbox/djencks/triplesec-jacc2/admin-api2/src/test/java/org/safehaus/triplesec/admin/IntegrationTest.java Thu Aug  9 16:40:15 2007
@@ -22,19 +22,16 @@
 
 import java.util.Properties;
 
-import javax.naming.directory.Attributes;
 import javax.naming.directory.DirContext;
 import javax.naming.directory.InitialDirContext;
 import javax.security.auth.kerberos.KerberosKey;
 import javax.security.auth.kerberos.KerberosPrincipal;
 
 import org.apache.directory.shared.ldap.util.StringTools;
-import org.safehaus.triplesec.admin.dao.DaoFactory;
-import org.safehaus.triplesec.admin.dao.ldap.LdapDaoFactory;
 import org.safehaus.triplesec.admin.persistence.EntityManager;
 import org.safehaus.triplesec.admin.persistence.EntityManagerImpl;
-import org.safehaus.triplesec.admin.persistence.State;
 import org.safehaus.triplesec.admin.persistence.PCException;
+import org.safehaus.triplesec.admin.persistence.State;
 import org.safehaus.triplesec.integration.TriplesecIntegration;
 
 
@@ -51,7 +48,7 @@
     private static final String NEW_APP_RDN = "appName=newName,appName=mockApplication,ou=applications";
 
     private Properties props;
-    private DaoFactory factory;
+//    private DaoFactory factory;
     private DirContext ctx;
     private TriplesecAdmin admin;
 
@@ -69,18 +66,18 @@
         super.setUp();
 
         props = new Properties();
-        props.setProperty( DaoFactory.IMPLEMENTATION_CLASS, LdapDaoFactory.class.getName() );
+//        props.setProperty( DaoFactory.IMPLEMENTATION_CLASS, LdapDaoFactory.class.getName() );
         props.setProperty( "java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory" );
         props.setProperty( "java.naming.provider.url", "ldap://localhost:" + getLdapPort() + "/dc=example,dc=com" );
         props.setProperty( "java.naming.security.principal", "uid=admin,ou=system" );
         props.setProperty( "java.naming.security.credentials", "secret" );
         props.setProperty( "java.naming.security.authentication", "simple" );
 
-        factory = DaoFactory.createInstance( props );
+//        factory = DaoFactory.createInstance( props );
         ctx = new InitialDirContext( props );
         admin = new TriplesecAdmin( props );
 
-        assertNotNull( factory );
+//        assertNotNull( factory );
 
         entityManager = new EntityManagerImpl( ctx, "dc=example,dc=com" );
         Application.PARENT_APPLICATION_RDN = "appName=mockApplication,ou=applications";
@@ -470,6 +467,7 @@
     }
 
 
+/*
     public void testLocalUserDao() throws Exception
     {
         assertFalse( admin.hasUser( "testLocalUser" ) );
@@ -536,8 +534,10 @@
         user.modifier().delete();
         assertFalse( admin.hasUser( "testLocalUser" ) );
     }
+*/
 
 
+/*
     public void testHauskeysUserDao() throws Exception
     {
         assertFalse( admin.hasUser( "testHauskeysUser" ) );
@@ -603,8 +603,10 @@
         user.modifier().delete();
         assertFalse( admin.hasUser( "testHauskeysUser" ) );
     }
+*/
 
 
+/*
     public void testExternalUserDao() throws Exception
     {
         final String uid = "testExternalUser";
@@ -636,6 +638,7 @@
         user.modifier().delete();
         assertFalse( admin.hasUser( uid ) );
     }
+*/
 
 /*
     public void testGroupDao() throws Exception

Modified: directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/interceptor/ChangelogService.java
URL: http://svn.apache.org/viewvc/directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/interceptor/ChangelogService.java?view=diff&rev=564425&r1=564424&r2=564425
==============================================================================
--- directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/interceptor/ChangelogService.java (original)
+++ directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/interceptor/ChangelogService.java Thu Aug  9 16:40:15 2007
@@ -27,31 +27,31 @@
 import java.sql.Timestamp;
 import java.util.Date;
 import java.util.LinkedList;
-import java.util.List;
 import java.util.Properties;
 
 import javax.naming.NamingException;
-import javax.naming.directory.Attributes;
-import javax.naming.directory.ModificationItem;
 
 import org.apache.directory.server.core.DirectoryServiceConfiguration;
 import org.apache.directory.server.core.configuration.InterceptorConfiguration;
 import org.apache.directory.server.core.interceptor.BaseInterceptor;
 import org.apache.directory.server.core.interceptor.NextInterceptor;
+import org.apache.directory.server.core.interceptor.context.AddOperationContext;
+import org.apache.directory.server.core.interceptor.context.ModifyOperationContext;
+import org.apache.directory.server.core.interceptor.context.MoveAndRenameOperationContext;
+import org.apache.directory.server.core.interceptor.context.MoveOperationContext;
+import org.apache.directory.server.core.interceptor.context.OperationContext;
+import org.apache.directory.server.core.interceptor.context.RenameOperationContext;
 import org.apache.directory.server.core.invocation.InvocationStack;
 import org.apache.directory.server.core.jndi.ServerContext;
 import org.apache.directory.server.schema.registries.AttributeTypeRegistry;
-import org.apache.directory.shared.ldap.name.LdapDN;
 import org.apache.directory.shared.ldap.util.DateUtils;
-import org.apache.directory.shared.ldap.util.NamespaceTools;
-import org.apache.directory.shared.ldap.message.ModificationItemImpl;
 import org.safehaus.triplesec.changelog.beta.model.AddChangeEvent;
 import org.safehaus.triplesec.changelog.beta.model.ChangeEvent;
 import org.safehaus.triplesec.changelog.beta.model.DeleteChangeEvent;
 import org.safehaus.triplesec.changelog.beta.model.ModifyChangeEvent;
 import org.safehaus.triplesec.changelog.beta.model.ModifyDnChangeEvent;
 import org.safehaus.triplesec.changelog.beta.model.ModifyRdnChangeEvent;
-import org.safehaus.triplesec.changelog.beta.model.StringAttribute;
+import org.safehaus.triplesec.changelog.beta.model.MoveAndRenameChangeEvent;
 import org.safehaus.triplesec.changelog.beta.support.AttributeUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -61,6 +61,8 @@
  * An interceptor which maintains a change log as it intercepts changes to the
  * directory. It maintains an embedded DB for writing Changelog Event records.
  * 
+ * @org.apache.xbean.XBean
+ *
  * @author <a href="mailto:ersiner@safehaus.org">Ersin Er</a>
  * @author <a href="mailto:akarasulu@safehaus.org">Alex Karasulu</a>
  */
@@ -218,17 +220,18 @@
     // Overridden (only change inducing) intercepted methods
     // -----------------------------------------------------------------------
 
-    public void add( NextInterceptor next, LdapDN nDn, Attributes entry ) throws NamingException
+    public void add( NextInterceptor next, OperationContext opContext ) throws NamingException
     {
-        next.add( nDn, entry );
+        next.add( opContext );
 
         if ( ! isActive )
         {
             return;
         }
 
-        AddChangeEvent changeEvent = new AddChangeEvent( 0, nDn.getUpName(), getPrincipalName(), 
-            new Date(), AttributeUtils.attributesToStringAttributeList( entry, registry ) );
+        AddOperationContext addContext = (AddOperationContext) opContext;
+        AddChangeEvent changeEvent = new AddChangeEvent( 0, addContext.getDn().getUpName(), getPrincipalName(),
+            new Date(), AttributeUtils.attributesToStringAttributeList( addContext.getEntry(), registry ) );
         
         // Enqueue the buffer onto a queue that is emptied by another thread asynchronously.
         synchronized ( queue )
@@ -239,16 +242,16 @@
     }
 
 
-    public void delete( NextInterceptor next, LdapDN nDn ) throws NamingException
+    public void delete( NextInterceptor next, OperationContext opContext ) throws NamingException
     {
-        next.delete( nDn );
+        next.delete( opContext );
 
         if ( ! isActive )
         {
             return;
         }
 
-        DeleteChangeEvent changeEvent = new DeleteChangeEvent( 0, nDn.toString(), getPrincipalName(), new Date() ); 
+        DeleteChangeEvent changeEvent = new DeleteChangeEvent( 0, opContext.getDn().toString(), getPrincipalName(), new Date() );
         
         // Enqueue the buffer onto a queue that is emptied by another thread asynchronously.
         synchronized ( queue )
@@ -259,56 +262,50 @@
     }
 
 
-    public void modify( NextInterceptor next, LdapDN nDn, int modOp, Attributes mods ) throws NamingException
-    {
-        /**
-         * TODO: We need to deep copy here (before invoking the next
-         * interceptor) attributes that are being deleted or replaced. They
-         * should be gathered from the DIT while we do not have them passed
-         * here. BTW, logging this detailed information can also be necessary
-         * for "rollback support".
-         * 
-         * This issue is also valid for other similar operations.
-         */
-
-        next.modify( nDn, modOp, mods );
-
-        if ( ! isActive )
-        {
-            return;
-        }
-        
-        List strAttributes = AttributeUtils.attributesToStringAttributeList( mods, registry );
-        ModifyChangeEvent changeEvent = new ModifyChangeEvent( 0, nDn.toString(), getPrincipalName(), new Date() );
-        changeEvent.addModificationAttributes( modOp, strAttributes );
-        
-        // Enqueue the buffer onto a queue that is emptied by another thread asynchronously.
-        synchronized ( queue )
-        {
-            queue.addLast( changeEvent );
-            queue.notifyAll();
-        }
-
-    }
+//    public void modify( NextInterceptor next, OperationContext opContext ) throws NamingException
+//    {
+//        /**
+//         * TODO: We need to deep copy here (before invoking the next
+//         * interceptor) attributes that are being deleted or replaced. They
+//         * should be gathered from the DIT while we do not have them passed
+//         * here. BTW, logging this detailed information can also be necessary
+//         * for "rollback support".
+//         *
+//         * This issue is also valid for other similar operations.
+//         */
+//
+//        next.modify( opContext );
+//
+//        if ( ! isActive )
+//        {
+//            return;
+//        }
+//        ModifyOperationContext modContext = (ModifyOperationContext) opContext;
+//        List strAttributes = AttributeUtils.attributesToStringAttributeList( modContext.getModItems(), registry );
+//        ModifyChangeEvent changeEvent = new ModifyChangeEvent( 0, modContext.getDn().toString(), getPrincipalName(), new Date() );
+//        changeEvent.addModificationAttributes( modContext.get, strAttributes );
+//
+//        // Enqueue the buffer onto a queue that is emptied by another thread asynchronously.
+//        synchronized ( queue )
+//        {
+//            queue.addLast( changeEvent );
+//            queue.notifyAll();
+//        }
+//
+//    }
 
 
-    public void modify( NextInterceptor next, LdapDN nDn, ModificationItemImpl[] mods ) throws NamingException
+    public void modify( NextInterceptor next, OperationContext opContext ) throws NamingException
     {
 
-        next.modify( nDn, mods );
+        next.modify( opContext );
 
         if ( ! isActive )
         {
             return;
         }
 
-        ModifyChangeEvent changeEvent = new ModifyChangeEvent( 0, nDn.toString(), getPrincipalName(), new Date() );
-        
-        for (int i = 0; i < mods.length; i++ )
-        {
-            StringAttribute strAttribute = AttributeUtils.attributeToStringAttribute( mods[i].getAttribute(), registry );
-            changeEvent.addModificationAttribute( mods[i].getModificationOp(), strAttribute );
-        }
+        ModifyChangeEvent changeEvent = new ModifyChangeEvent( 0, opContext.getDn().toString(), getPrincipalName(), new Date(), ((ModifyOperationContext)opContext).getModItems());
 
         // Enqueue the buffer onto a queue that is emptied by another thread asynchronously.
         synchronized ( queue )
@@ -319,10 +316,10 @@
     }
     
     
-    public void modifyRn( NextInterceptor next, LdapDN name, String newRn, boolean deleteOldRn ) throws NamingException
+    public void rename( NextInterceptor next, OperationContext operationContext ) throws NamingException
     {
         
-        next.modifyRn( name, newRn, deleteOldRn );
+        next.rename( operationContext );
         
         if ( ! isActive )
         {
@@ -331,11 +328,9 @@
         
         ModifyRdnChangeEvent changeEvent = new ModifyRdnChangeEvent( 
             0,
-            name.toString(), 
-            getPrincipalName(), 
+            getPrincipalName(),
             new Date(), 
-            newRn, 
-            deleteOldRn);
+            (RenameOperationContext) operationContext );
 
         // Enqueue the buffer onto a queue that is emptied by another thread asynchronously.
         synchronized ( queue )
@@ -347,24 +342,22 @@
     }
     
     
-    public void move( NextInterceptor next, LdapDN oldName, LdapDN newParentName, String newRn, boolean deleteOldRn ) throws NamingException
+    public void move( NextInterceptor next, OperationContext opContext ) throws NamingException
     {
         
-        next.move( oldName, newParentName, newRn, deleteOldRn );
+        next.move( opContext );
 
         if ( ! isActive )
         {
             return;
         }
 
-        String newDn = newRn + "," + newParentName;
+//        String newDn = newRn + "," + newParentName;
         ModifyDnChangeEvent changeEvent = new ModifyDnChangeEvent( 
             0,
-            oldName.toString(), 
-            getPrincipalName(), 
+            getPrincipalName(),
             new Date(), 
-            newDn, 
-            deleteOldRn );
+            (MoveOperationContext) opContext );
 
         // Enqueue the buffer onto a queue that is emptied by another thread asynchronously.
         synchronized ( queue )
@@ -376,23 +369,20 @@
     }
       
     
-    public void move( NextInterceptor next, LdapDN oldName, LdapDN newParentName ) throws NamingException
+    public void moveAndRename( NextInterceptor next, OperationContext opContext ) throws NamingException
     {
-        next.move( oldName, newParentName );
+        next.move( opContext );
         
         if ( ! isActive )
         {
             return;
         }
-        
-        String newDn = NamespaceTools.getRdn( oldName.toString() ) + "," + newParentName;
-        ModifyDnChangeEvent changeEvent = new ModifyDnChangeEvent( 
+        MoveAndRenameOperationContext context = (MoveAndRenameOperationContext) opContext;
+        ChangeEvent changeEvent = new MoveAndRenameChangeEvent(
             0,
-            oldName.toString(), 
-            getPrincipalName(), 
+            getPrincipalName(),
             new Date(), 
-            newDn, 
-            false );
+            context );
         
         // Enqueue the buffer onto a queue that is emptied by another thread asynchronously.
         synchronized ( queue )

Modified: directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/ModifyChangeEvent.java
URL: http://svn.apache.org/viewvc/directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/ModifyChangeEvent.java?view=diff&rev=564425&r1=564424&r2=564425
==============================================================================
--- directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/ModifyChangeEvent.java (original)
+++ directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/ModifyChangeEvent.java Thu Aug  9 16:40:15 2007
@@ -26,6 +26,8 @@
 import java.util.List;
 import java.util.Map;
 
+import javax.naming.directory.ModificationItem;
+
 import org.safehaus.triplesec.changelog.beta.support.AttributeModificationType;
 import org.safehaus.triplesec.changelog.beta.support.ChangeEventType;
 
@@ -35,103 +37,27 @@
  */
 public class ModifyChangeEvent extends BaseChangeEvent
 {
-    private List addedAttributes = new ArrayList();
-    private List removedAttributes = new ArrayList();
-    private List replacedAttributes = new ArrayList();
-    private Map modifications = new HashMap();
-    
-    /** Refecence types used for as keys for the attribute modification map */
-    private static Integer ADD_ATTRIBUTE_MODIFICATION_OBJECT = new Integer( AttributeModificationType.ADD_ATTRIBUTE_MODIFICATION );
-    private static Integer REMOVE_ATTRIBUTE_MODIFICATION_OBJECT = new Integer( AttributeModificationType.REMOVE_ATTRIBUTE_MODIFICATION );
-    private static Integer REPLACE_ATTRIBUTE_MODIFICATION_OBJECT = new Integer( AttributeModificationType.REPLACE_ATTRIBUTE_MODIFICATION );
+    private final ModificationItem[] mods;
 
-    public ModifyChangeEvent( int id, String affectedEntryName, String changeEventPrincipal, Date changeEventTime )
+    public ModifyChangeEvent(int id, String affectedEntryName, String changeEventPrincipal, Date changeEventTime, ModificationItem[] modificationItems)
     {
         super( id, ChangeEventType.MODIFY_CHANGE_EVENT, affectedEntryName, changeEventPrincipal, changeEventTime );
-        
-        modifications.put( ADD_ATTRIBUTE_MODIFICATION_OBJECT, addedAttributes );
-        modifications.put( REMOVE_ATTRIBUTE_MODIFICATION_OBJECT, removedAttributes );
-        modifications.put( REPLACE_ATTRIBUTE_MODIFICATION_OBJECT, replacedAttributes );
-    }
-    
-    public void addModificationAttribute( int modType, StringAttribute attribute )
-    {
-        switch ( modType )
-        {
-            case AttributeModificationType.ADD_ATTRIBUTE_MODIFICATION:
-                addedAttributes.add( attribute );
-                break;
-            case AttributeModificationType.REMOVE_ATTRIBUTE_MODIFICATION:
-                removedAttributes.add( attribute );
-                break;
-            case AttributeModificationType.REPLACE_ATTRIBUTE_MODIFICATION:
-                replacedAttributes.add( attribute );
-                break;
-            default:
-                throw new IllegalArgumentException( "Unmatched Attribute Modification Type: " + modType );
-        }
-    }
-    
-    public void addModificationAttributes( int modType, List stringAttributes )
-    {
-        Iterator it = stringAttributes.iterator();
-        while ( it.hasNext() )
-        {
-            addModificationAttribute( modType, (StringAttribute) it.next() );
-        }
-    }
-    
-    public List getAddedAttributes()
-    {
-        return addedAttributes;
-    }
-    
-    public List getRemovedAttributes()
-    {
-        return removedAttributes;
-    }
-    
-    public List getReplacedAttributes()
-    {
-        return replacedAttributes;
-    }
-    
-    public boolean anyAddedAttributeExists()
-    {
-        return addedAttributes.size() > 0;
+        this.mods = modificationItems;
     }
-    
-    public boolean anyRemovedAttributeExists()
-    {
-        return removedAttributes.size() > 0;
-    }
-    
-    public boolean anyReplacedAttributeExists()
-    {
-        return replacedAttributes.size() > 0;
+
+    /**
+     * TODO not safe... should return an immutable copy and use a list.
+     */
+    public ModificationItem[] getMods() {
+        return mods;
     }
 
     public String getEventMessage()
     {
         StringBuffer buffer = new StringBuffer();
         
-        if ( anyAddedAttributeExists() )
-        {
-            buffer.append( "added:: " );
-            buffer.append( getAddedAttributes().toString() );
-            buffer.append( "\n" );
-        }
-        if ( anyRemovedAttributeExists() )
-        {
-            buffer.append( "removed:: " );
-            buffer.append( getRemovedAttributes().toString() );
-            buffer.append( "\n" );
-        }
-        if ( anyReplacedAttributeExists() )
-        {
-            buffer.append( "replaced:: " );
-            buffer.append( getReplacedAttributes().toString() );
-            buffer.append( "\n" );
+        for (ModificationItem mod: mods) {
+            buffer.append(mod.toString()).append("\n");
         }
         
         return buffer.toString();

Modified: directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/ModifyDnChangeEvent.java
URL: http://svn.apache.org/viewvc/directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/ModifyDnChangeEvent.java?view=diff&rev=564425&r1=564424&r2=564425
==============================================================================
--- directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/ModifyDnChangeEvent.java (original)
+++ directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/ModifyDnChangeEvent.java Thu Aug  9 16:40:15 2007
@@ -22,6 +22,7 @@
 import java.util.Date;
 
 import org.safehaus.triplesec.changelog.beta.support.ChangeEventType;
+import org.apache.directory.server.core.interceptor.context.MoveOperationContext;
 
 /**
  * @author ersin
@@ -29,29 +30,18 @@
  */
 public class ModifyDnChangeEvent extends BaseChangeEvent
 {
-    private String newDn;
-    private boolean deleteOldRdn;
-    
+    private final String newDn;
+
     
-    public ModifyDnChangeEvent( int id, String affectedEntryName, String changeEventPrincipal, Date changeEventTime, String newDn, boolean deleteOldRdn )
+    public ModifyDnChangeEvent( int id, String changeEventPrincipal, Date changeEventTime, MoveOperationContext operationContext)
     {
-        super( id, ChangeEventType.MODDN_CHANGE_EVENT, affectedEntryName, changeEventPrincipal, changeEventTime );
-        this.newDn = newDn;
-        this.deleteOldRdn = deleteOldRdn;
+        super( id, ChangeEventType.MODDN_CHANGE_EVENT, operationContext.getDn().toString(), changeEventPrincipal, changeEventTime );
+        this.newDn = operationContext.getParent().toString();
     }
     
 
     /**
-     * @return Returns the deleteOldRdn.
-     */
-    public boolean isDeleteOldRdn()
-    {
-        return deleteOldRdn;
-    }
-
-
-    /**
-     * @return Returns the newDn.
+     * @return Returns the newDn.  This is the parent of the current Dn in its new location.
      */
     public String getNewDn()
     {

Modified: directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/ModifyRdnChangeEvent.java
URL: http://svn.apache.org/viewvc/directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/ModifyRdnChangeEvent.java?view=diff&rev=564425&r1=564424&r2=564425
==============================================================================
--- directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/ModifyRdnChangeEvent.java (original)
+++ directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/ModifyRdnChangeEvent.java Thu Aug  9 16:40:15 2007
@@ -22,6 +22,8 @@
 import java.util.Date;
 
 import org.safehaus.triplesec.changelog.beta.support.ChangeEventType;
+import org.apache.directory.server.core.interceptor.context.ModifyOperationContext;
+import org.apache.directory.server.core.interceptor.context.RenameOperationContext;
 
 /**
  * @author ersin
@@ -33,11 +35,11 @@
     private boolean deleteOldRdn;
     
     
-    public ModifyRdnChangeEvent( int id, String affectedEntryName, String changeEventPrincipal, Date changeEventTime, String newRdn, boolean deleteOldRdn )
+    public ModifyRdnChangeEvent( int id, String changeEventPrincipal, Date changeEventTime, RenameOperationContext modContext )
     {
-        super( id, ChangeEventType.MODRDN_CHANGE_EVENT, affectedEntryName, changeEventPrincipal, changeEventTime );
-        this.newRdn = newRdn;
-        this.deleteOldRdn = deleteOldRdn;
+        super( id, ChangeEventType.MODRDN_CHANGE_EVENT, modContext.getDn().toString(), changeEventPrincipal, changeEventTime );
+        this.newRdn = modContext.getNewRdn();
+        this.deleteOldRdn = modContext.getDelOldDn();
     }
     
 

Added: directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/MoveAndRenameChangeEvent.java
URL: http://svn.apache.org/viewvc/directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/MoveAndRenameChangeEvent.java?view=auto&rev=564425
==============================================================================
--- directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/MoveAndRenameChangeEvent.java (added)
+++ directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/MoveAndRenameChangeEvent.java Thu Aug  9 16:40:15 2007
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+package org.safehaus.triplesec.changelog.beta.model;
+
+import java.util.Date;
+
+import org.apache.directory.server.core.interceptor.context.MoveAndRenameOperationContext;
+import org.safehaus.triplesec.changelog.beta.support.ChangeEventType;
+
+/**
+ * @author ersin
+ *
+ */
+public class MoveAndRenameChangeEvent extends BaseChangeEvent
+{
+    private final String newParentDn;
+    private final String newRdn;
+    private final boolean deleteOldDn;
+
+
+    public MoveAndRenameChangeEvent( int id, String changeEventPrincipal, Date changeEventTime, MoveAndRenameOperationContext operationContext)
+    {
+        super( id, ChangeEventType.MODDN_CHANGE_EVENT, operationContext.getDn().toString(), changeEventPrincipal, changeEventTime );
+        this.newParentDn = operationContext.getParent().toString();
+        this.newRdn = operationContext.getNewRdn();
+        this.deleteOldDn = operationContext.getDelOldDn();
+    }
+
+
+    /**
+     * @return Returns the newDn.  This is the parent of the current Dn in its new location.
+     */
+    public String getNewDn()
+    {
+        return newParentDn;
+    }
+
+
+    public String getNewRdn() {
+        return newRdn;
+    }
+
+    public boolean isDeleteOldDn() {
+        return deleteOldDn;
+    }/* (non-Javadoc)
+     * @see org.safehaus.triplesec.changelog.model.BaseChangeEvent#getEventMessage()
+     */
+    public String getEventMessage()
+    {
+        return "dn moved to parent " + newParentDn + " and rdn: " + newRdn + " with old db deleted: " + deleteOldDn;
+    }
+
+}

Propchange: directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/MoveAndRenameChangeEvent.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/MoveAndRenameChangeEvent.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/model/MoveAndRenameChangeEvent.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/support/AttributeUtils.java
URL: http://svn.apache.org/viewvc/directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/support/AttributeUtils.java?view=diff&rev=564425&r1=564424&r2=564425
==============================================================================
--- directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/support/AttributeUtils.java (original)
+++ directory/sandbox/djencks/triplesec-jacc2/changelog/src/main/java/org/safehaus/triplesec/changelog/beta/support/AttributeUtils.java Thu Aug  9 16:40:15 2007
@@ -56,7 +56,7 @@
         String id = ( String ) attr.getID();
         int size = attr.size();
         
-        boolean isBinary = ! registry.lookup( id ).getSyntax().isHumanReadible();
+        boolean isBinary = ! registry.lookup( id ).getSyntax().isHumanReadable();
         
         StringAttribute strAttribute = new StringAttribute( id );