import javax.naming.directory.BasicAttribute;
import javax.naming.ldap.LdapName;
+import org.argeo.osgi.useradmin.AbstractUserDirectory.WorkingCopy;
+
class LdifUser implements DirectoryUser {
private final AbstractUserDirectory userAdmin;
private final boolean frozen;
private Attributes publishedAttributes;
- private Attributes modifiedAttributes = null;
private final AttributeDictionary properties;
private final AttributeDictionary credentials;
@Override
public synchronized Attributes getAttributes() {
- return isEditing() ? modifiedAttributes : publishedAttributes;
+ return isEditing() ? getModifiedAttributes() : publishedAttributes;
+ }
+
+ /** Should only be called from working copy thread. */
+ private synchronized Attributes getModifiedAttributes() {
+ assert getWc() != null;
+ return getWc().getAttributes(getDn());
}
- protected synchronized boolean isEditing() {
- return userAdmin.isEditing() && modifiedAttributes != null;
+ private synchronized boolean isEditing() {
+ return getWc() != null && getModifiedAttributes() != null;
+ }
+
+ private synchronized WorkingCopy getWc() {
+ return userAdmin.getWorkingCopy();
}
protected synchronized void startEditing() {
throw new UserDirectoryException("Cannot edit frozen view");
if (getUserAdmin().isReadOnly())
throw new UserDirectoryException("User directory is read-only");
- assert modifiedAttributes == null;
- modifiedAttributes = (Attributes) publishedAttributes.clone();
+ assert getModifiedAttributes() == null;
+ getWc().startEditing(this);
+ // modifiedAttributes = (Attributes) publishedAttributes.clone();
}
- protected synchronized void stopEditing(boolean apply) {
- assert modifiedAttributes != null;
- if (apply)
- publishedAttributes = modifiedAttributes;
- modifiedAttributes = null;
+ public synchronized void publishAttributes(Attributes modifiedAttributes) {
+ publishedAttributes = modifiedAttributes;
}
+ // protected synchronized void stopEditing(boolean apply) {
+ // assert getModifiedAttributes() != null;
+ // if (apply)
+ // publishedAttributes = getModifiedAttributes();
+ // // modifiedAttributes = null;
+ // }
+
public DirectoryUser getPublished() {
return new LdifUser(userAdmin, dn, publishedAttributes, true);
}
throw new IllegalArgumentException("Key " + key + " excluded");
try {
- Attribute attribute = modifiedAttributes.get(key.toString());
+ Attribute attribute = getModifiedAttributes().get(
+ key.toString());
attribute = new BasicAttribute(key.toString());
attribute.add(value);
- Attribute previousAttribute = modifiedAttributes.put(attribute);
+ Attribute previousAttribute = getModifiedAttributes().put(
+ attribute);
if (previousAttribute != null)
return previousAttribute.get();
else
throw new IllegalArgumentException("Key " + key + " excluded");
try {
- Attribute attr = modifiedAttributes.remove(key.toString());
+ Attribute attr = getModifiedAttributes().remove(key.toString());
if (attr != null)
return attr.get();
else