| | |
| | | import org.opends.server.extensions.ConfigFileHandler; |
| | | import org.opends.server.protocols.ldap.LDAPResultCode; |
| | | import org.opends.server.types.Attribute; |
| | | import org.opends.server.types.AttributeBuilder; |
| | | import org.opends.server.types.AttributeType; |
| | | import org.opends.server.types.AttributeValue; |
| | | import org.opends.server.types.DN; |
| | |
| | | { |
| | | // Bootstrap the Directory Server configuration for use as a client. |
| | | DirectoryServer directoryServer = DirectoryServer.getInstance(); |
| | | directoryServer.bootstrapClient(); |
| | | DirectoryServer.bootstrapClient(); |
| | | |
| | | |
| | | // If we're to use the configuration then initialize it, along with the |
| | |
| | | { |
| | | try |
| | | { |
| | | directoryServer.initializeJMX(); |
| | | DirectoryServer.initializeJMX(); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | |
| | | } |
| | | } |
| | | |
| | | if (! sourceClasses.isEmpty()) |
| | | if (!sourceClasses.isEmpty()) |
| | | { |
| | | // Whatever is left must have been deleted. |
| | | AttributeType attrType = DirectoryServer.getObjectClassAttributeType(); |
| | | LinkedHashSet<AttributeValue> values = |
| | | new LinkedHashSet<AttributeValue>(); |
| | | AttributeBuilder builder = new AttributeBuilder(attrType); |
| | | for (ObjectClass oc : sourceClasses) |
| | | { |
| | | values.add(new AttributeValue(attrType, oc.getNameOrOID())); |
| | | builder.add(new AttributeValue(attrType, oc.getNameOrOID())); |
| | | } |
| | | |
| | | Attribute attr = new Attribute(attrType, attrType.getNameOrOID(), values); |
| | | modifications.add(new Modification(ModificationType.DELETE, attr)); |
| | | modifications.add(new Modification(ModificationType.DELETE, builder |
| | | .toAttribute())); |
| | | } |
| | | |
| | | if (! targetClasses.isEmpty()) |
| | | { |
| | | // Whatever is left must have been added. |
| | | AttributeType attrType = DirectoryServer.getObjectClassAttributeType(); |
| | | LinkedHashSet<AttributeValue> values = |
| | | new LinkedHashSet<AttributeValue>(); |
| | | AttributeBuilder builder = new AttributeBuilder(attrType); |
| | | for (ObjectClass oc : targetClasses) |
| | | { |
| | | values.add(new AttributeValue(attrType, oc.getNameOrOID())); |
| | | builder.add(new AttributeValue(attrType, oc.getNameOrOID())); |
| | | } |
| | | |
| | | Attribute a = new Attribute(attrType, attrType.getNameOrOID(), values); |
| | | modifications.add(new Modification(ModificationType.ADD, a)); |
| | | modifications.add(new Modification(ModificationType.ADD, builder |
| | | .toAttribute())); |
| | | } |
| | | |
| | | |
| | |
| | | } |
| | | else |
| | | { |
| | | // See if the value lists are equal. |
| | | LinkedHashSet<AttributeValue> sourceValues = sourceAttr.getValues(); |
| | | LinkedHashSet<AttributeValue> targetValues = targetAttr.getValues(); |
| | | LinkedHashSet<AttributeValue> deletedValues = |
| | | new LinkedHashSet<AttributeValue>(); |
| | | Iterator<AttributeValue> valueIterator = sourceValues.iterator(); |
| | | while (valueIterator.hasNext()) |
| | | // Compare the values. |
| | | AttributeBuilder addedValuesBuilder = new AttributeBuilder( |
| | | targetAttr); |
| | | addedValuesBuilder.removeAll(sourceAttr); |
| | | Attribute addedValues = addedValuesBuilder.toAttribute(); |
| | | if (!addedValues.isEmpty()) |
| | | { |
| | | AttributeValue v = valueIterator.next(); |
| | | valueIterator.remove(); |
| | | |
| | | if (! targetValues.remove(v)) |
| | | { |
| | | // This particular value has been deleted. |
| | | deletedValues.add(v); |
| | | } |
| | | modifications.add(new Modification(ModificationType.ADD, |
| | | addedValues)); |
| | | } |
| | | |
| | | if (! deletedValues.isEmpty()) |
| | | AttributeBuilder deletedValuesBuilder = new AttributeBuilder( |
| | | sourceAttr); |
| | | deletedValuesBuilder.removeAll(targetAttr); |
| | | Attribute deletedValues = deletedValuesBuilder.toAttribute(); |
| | | if (!deletedValues.isEmpty()) |
| | | { |
| | | Attribute attr = new Attribute(type, sourceAttr.getName(), |
| | | sourceAttr.getOptions(), |
| | | deletedValues); |
| | | modifications.add(new Modification(ModificationType.DELETE, |
| | | attr)); |
| | | } |
| | | |
| | | // Anything left in the target list has been added. |
| | | if (! targetValues.isEmpty()) |
| | | { |
| | | Attribute attr = new Attribute(type, sourceAttr.getName(), |
| | | sourceAttr.getOptions(), |
| | | targetValues); |
| | | modifications.add(new Modification(ModificationType.ADD, attr)); |
| | | deletedValues)); |
| | | } |
| | | } |
| | | } |
| | |
| | | for (Modification m : modifications) |
| | | { |
| | | Attribute a = m.getAttribute(); |
| | | LinkedHashSet<AttributeValue> values = a.getValues(); |
| | | if (values.isEmpty()) |
| | | if (a.isEmpty()) |
| | | { |
| | | LinkedList<Modification> attrMods = new LinkedList<Modification>(); |
| | | attrMods.add(m); |
| | |
| | | else |
| | | { |
| | | LinkedList<Modification> attrMods = new LinkedList<Modification>(); |
| | | LinkedHashSet<AttributeValue> valueSet = |
| | | new LinkedHashSet<AttributeValue>(); |
| | | for (AttributeValue v : values) |
| | | for (AttributeValue v : a) |
| | | { |
| | | valueSet.clear(); |
| | | valueSet.add(v); |
| | | Attribute attr = new Attribute(a.getAttributeType(), |
| | | a.getName(), valueSet); |
| | | AttributeBuilder builder = new AttributeBuilder(a, true); |
| | | builder.add(v); |
| | | Attribute attr = builder.toAttribute(); |
| | | |
| | | attrMods.clear(); |
| | | attrMods.add(new Modification(m.getModificationType(), attr)); |