| | |
| | | */ |
| | | private String rdName; |
| | | |
| | | /** |
| | | * The condition which is used to determine if a referenced |
| | | * managed object is enabled. |
| | | */ |
| | | /** The condition which is used to determine if a referenced managed object is enabled. */ |
| | | private Condition targetIsEnabledCondition = Conditions.TRUE; |
| | | |
| | | /** |
| | |
| | | this.targetNeedsEnablingCondition = condition; |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | protected AggregationPropertyDefinition<C, S> buildInstance(AbstractManagedObjectDefinition<?, ?> d, |
| | | String propertyName, EnumSet<PropertyOption> options, AdministratorAction adminAction, |
| | |
| | | |
| | | } |
| | | |
| | | /** |
| | | * A change listener which prevents the named component from being disabled. |
| | | */ |
| | | /** A change listener which prevents the named component from being disabled. */ |
| | | private final class ReferentialIntegrityChangeListener implements ServerManagedObjectChangeListener<S> { |
| | | |
| | | /** |
| | |
| | | this.message = message; |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public ConfigChangeResult applyConfigurationChange(ServerManagedObject<? extends S> mo) { |
| | | try { |
| | | if (targetIsEnabledCondition.evaluate(mo)) { |
| | |
| | | + relationDefinition.getChildDefinition().getUserFriendlyName()); |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public boolean isConfigurationChangeAcceptable(ServerManagedObject<? extends S> mo, |
| | | List<LocalizableMessage> unacceptableReasons) { |
| | | // Always prevent the referenced component from being |
| | |
| | | |
| | | } |
| | | |
| | | /** |
| | | * A delete listener which prevents the named component from being deleted. |
| | | */ |
| | | /** A delete listener which prevents the named component from being deleted. */ |
| | | private final class ReferentialIntegrityDeleteListener implements ConfigurationDeleteListener<S> { |
| | | |
| | | /** The DN of the referenced configuration entry. */ |
| | |
| | | this.message = message; |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public ConfigChangeResult applyConfigurationDelete(S configuration) { |
| | | // This should not happen - the |
| | | // isConfigurationDeleteAcceptable() call-back should have |
| | |
| | | } |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public boolean isConfigurationDeleteAcceptable(S configuration, List<LocalizableMessage> unacceptableReasons) { |
| | | if (configuration.dn().equals(dn)) { |
| | | // Always prevent deletion of the referenced component. |
| | |
| | | |
| | | } |
| | | |
| | | /** |
| | | * The server-side constraint handler implementation. |
| | | */ |
| | | /** The server-side constraint handler implementation. */ |
| | | private class ServerHandler extends ServerConstraintHandler { |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public boolean isUsable(ServerManagedObject<?> managedObject, |
| | | Collection<LocalizableMessage> unacceptableReasons) throws ConfigException { |
| | |
| | | return isUsable; |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public void performPostAdd(ServerManagedObject<?> managedObject) throws ConfigException { |
| | | // First make sure existing listeners associated with this |
| | |
| | | } |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public void performPostDelete(ServerManagedObject<?> managedObject) throws ConfigException { |
| | | // Remove any registered delete and change listeners. |
| | |
| | | } |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public void performPostModify(ServerManagedObject<?> managedObject) throws ConfigException { |
| | | // Remove all the constraints associated with this managed |
| | |
| | | */ |
| | | private class SourceClientHandler extends ClientConstraintHandler { |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public boolean isAddAcceptable(ManagementContext context, ManagedObject<?> managedObject, |
| | | Collection<LocalizableMessage> unacceptableReasons) throws LdapException { |
| | |
| | | return isAcceptable; |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public boolean isModifyAcceptable(ManagementContext context, ManagedObject<?> managedObject, |
| | | Collection<LocalizableMessage> unacceptableReasons) throws LdapException { |
| | |
| | | */ |
| | | private class TargetClientHandler extends ClientConstraintHandler { |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public boolean isDeleteAcceptable(ManagementContext context, ManagedObjectPath<?, ?> path, |
| | | Collection<LocalizableMessage> unacceptableReasons) throws LdapException { |
| | |
| | | return isAcceptable; |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public boolean isModifyAcceptable(ManagementContext context, ManagedObject<?> managedObject, |
| | | Collection<LocalizableMessage> unacceptableReasons) throws LdapException { |
| | |
| | | return isAcceptable; |
| | | } |
| | | |
| | | /** |
| | | * Find all managed objects which reference the named managed |
| | | * object using this property. |
| | | */ |
| | | /** Find all managed objects which reference the named managed object using this property. */ |
| | | private <C1 extends ConfigurationClient> List<ManagedObject<? extends C1>> findReferences( |
| | | ManagementContext context, AbstractManagedObjectDefinition<C1, ?> mod, String name) |
| | | throws LdapException { |
| | |
| | | |
| | | private static final Logger debugLogger = LoggerFactory.getLogger(AggregationPropertyDefinition.class); |
| | | |
| | | /** |
| | | * The active server-side referential integrity change listeners |
| | | * associated with this property. |
| | | */ |
| | | /** The active server-side referential integrity change listeners associated with this property. */ |
| | | private final Map<DN, List<ReferentialIntegrityChangeListener>> changeListeners = new HashMap<>(); |
| | | |
| | | /** |
| | | * The active server-side referential integrity delete listeners |
| | | * associated with this property. |
| | | */ |
| | | /** The active server-side referential integrity delete listeners associated with this property. */ |
| | | private final Map<DN, List<ReferentialIntegrityDeleteListener>> deleteListeners = new HashMap<>(); |
| | | |
| | | /** |
| | | * The name of the managed object which is the parent of the |
| | | * aggregated managed objects. |
| | | */ |
| | | /** The name of the managed object which is the parent of the aggregated managed objects. */ |
| | | private ManagedObjectPath<?, ?> parentPath; |
| | | |
| | | /** |
| | |
| | | */ |
| | | private final String rdName; |
| | | |
| | | /** |
| | | * The relation in the parent managed object which contains the |
| | | * aggregated managed objects. |
| | | */ |
| | | /** The relation in the parent managed object which contains the aggregated managed objects. */ |
| | | private InstantiableRelationDefinition<C, S> relationDefinition; |
| | | |
| | | /** The source constraint. */ |
| | | private final Constraint sourceConstraint; |
| | | |
| | | /** |
| | | * The condition which is used to determine if a referenced managed |
| | | * object is enabled. |
| | | */ |
| | | /** The condition which is used to determine if a referenced managed object is enabled. */ |
| | | private final Condition targetIsEnabledCondition; |
| | | |
| | | /** |
| | |
| | | this.targetIsEnabledCondition = targetIsEnabledCondition; |
| | | this.sourceConstraint = new Constraint() { |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public Collection<ClientConstraintHandler> getClientConstraintHandlers() { |
| | | ClientConstraintHandler handler = new SourceClientHandler(); |
| | | return Collections.singleton(handler); |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public Collection<ServerConstraintHandler> getServerConstraintHandlers() { |
| | | ServerConstraintHandler handler = new ServerHandler(); |
| | | return Collections.singleton(handler); |
| | |
| | | }; |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) { |
| | | return v.visitAggregation(this, p); |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public <R, P> R accept(PropertyValueVisitor<R, P> v, String value, P p) { |
| | | return v.visitAggregation(this, value, p); |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public String decodeValue(String value) { |
| | | Reject.ifNull(value); |
| | |
| | | return targetNeedsEnablingCondition; |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public String normalizeValue(String value) { |
| | | try { |
| | |
| | | } |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public void toString(StringBuilder builder) { |
| | | super.toString(builder); |
| | |
| | | builder.append(targetIsEnabledCondition); |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public void validateValue(String value) { |
| | | try { |
| | |
| | | // for actions performed against referenced managed objects. |
| | | Constraint constraint = new Constraint() { |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public Collection<ClientConstraintHandler> getClientConstraintHandlers() { |
| | | ClientConstraintHandler handler = new TargetClientHandler(); |
| | | return Collections.singleton(handler); |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public Collection<ServerConstraintHandler> getServerConstraintHandlers() { |
| | | return Collections.emptyList(); |
| | | } |