@Override
 public void registerReadOnlyAttribute(
     final String attributeName,
     final OperationStepHandler readHandler,
     AttributeAccess.Storage storage) {
   checkPermission();
   AttributeAccess aa =
       new AttributeAccess(AccessType.READ_ONLY, storage, readHandler, null, null, null);
   if (attributesUpdater.putIfAbsent(this, attributeName, aa) != null) {
     throw alreadyRegistered("attribute", attributeName);
   }
 }
 @Override
 public void registerMetric(AttributeDefinition definition, OperationStepHandler metricHandler) {
   checkPermission();
   AttributeAccess aa =
       new AttributeAccess(
           AccessType.METRIC,
           AttributeAccess.Storage.RUNTIME,
           metricHandler,
           null,
           definition,
           definition.getFlags());
   if (attributesUpdater.putIfAbsent(this, definition.getName(), aa) != null) {
     throw alreadyRegistered("attribute", definition.getName());
   }
   registerAttributeAccessConstraints(definition);
 }
 @Override
 public void registerOperationHandler(
     final String operationName,
     final OperationStepHandler handler,
     final DescriptionProvider descriptionProvider,
     final boolean inherited,
     EntryType entryType) {
   checkPermission();
   if (operationsUpdater.putIfAbsent(
           this,
           operationName,
           new OperationEntry(handler, descriptionProvider, inherited, entryType))
       != null) {
     throw alreadyRegistered("operation handler", operationName);
   }
 }
 @Override
 public void registerReadOnlyAttribute(
     final AttributeDefinition definition, final OperationStepHandler readHandler) {
   checkPermission();
   final EnumSet<AttributeAccess.Flag> flags = definition.getFlags();
   final String attributeName = definition.getName();
   AttributeAccess.Storage storage =
       (flags != null && flags.contains(AttributeAccess.Flag.STORAGE_RUNTIME))
           ? Storage.RUNTIME
           : Storage.CONFIGURATION;
   AttributeAccess aa =
       new AttributeAccess(AccessType.READ_ONLY, storage, readHandler, null, definition, flags);
   if (attributesUpdater.putIfAbsent(this, attributeName, aa) != null) {
     throw alreadyRegistered("attribute", attributeName);
   }
   registerAttributeAccessConstraints(definition);
 }
 @Override
 public void registerReadOnlyAttribute(
     final String attributeName,
     final OperationStepHandler readHandler,
     AttributeAccess.Storage storage) {
   if (attributesUpdater.putIfAbsent(
           this,
           attributeName,
           new AttributeAccess(AccessType.READ_ONLY, storage, readHandler, null, null))
       != null) {
     throw new IllegalArgumentException(
         "An attribute named '"
             + attributeName
             + "' is already registered at location '"
             + getLocationString()
             + "'");
   }
 }
 @Override
 public void registerOperationHandler(
     OperationDefinition definition, OperationStepHandler handler, boolean inherited) {
   checkPermission();
   if (operationsUpdater.putIfAbsent(
           this,
           definition.getName(),
           new OperationEntry(
               handler,
               definition.getDescriptionProvider(),
               inherited,
               definition.getEntryType(),
               definition.getFlags(),
               definition.getAccessConstraints()))
       != null) {
     throw alreadyRegistered("operation handler", definition.getName());
   }
   registerOperationAccessConstraints(definition);
 }
 @Override
 public void registerMetric(
     String attributeName,
     OperationStepHandler metricHandler,
     EnumSet<AttributeAccess.Flag> flags) {
   if (attributesUpdater.putIfAbsent(
           this,
           attributeName,
           new AttributeAccess(
               AccessType.METRIC, AttributeAccess.Storage.RUNTIME, metricHandler, null, flags))
       != null) {
     throw new IllegalArgumentException(
         "An attribute named '"
             + attributeName
             + "' is already registered at location '"
             + getLocationString()
             + "'");
   }
 }
 @Override
 public void registerOperationHandler(
     final String operationName,
     final OperationStepHandler handler,
     final DescriptionProvider descriptionProvider,
     final boolean inherited,
     EntryType entryType) {
   if (operationsUpdater.putIfAbsent(
           this,
           operationName,
           new OperationEntry(handler, descriptionProvider, inherited, entryType))
       != null) {
     throw new IllegalArgumentException(
         "A handler named '"
             + operationName
             + "' is already registered at location '"
             + getLocationString()
             + "'");
   }
 }
 @Override
 public void registerReadOnlyAttribute(
     final String attributeName,
     final OperationStepHandler readHandler,
     EnumSet<AttributeAccess.Flag> flags) {
   AttributeAccess.Storage storage =
       (flags != null && flags.contains(AttributeAccess.Flag.STORAGE_RUNTIME))
           ? Storage.RUNTIME
           : Storage.CONFIGURATION;
   if (attributesUpdater.putIfAbsent(
           this,
           attributeName,
           new AttributeAccess(AccessType.READ_ONLY, storage, readHandler, null, null))
       != null) {
     throw new IllegalArgumentException(
         "An attribute named '"
             + attributeName
             + "' is already registered at location '"
             + getLocationString()
             + "'");
   }
 }