/*
* ModeShape (http://www.modeshape.org)
*
* Licensed 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.modeshape.jboss.subsystem;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.jboss.as.controller.ListAttributeDefinition;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.SimpleAttributeDefinition;
import org.jboss.as.controller.SimpleListAttributeDefinition;
import org.jboss.as.controller.access.management.AccessConstraintDefinition;
import org.jboss.as.controller.registry.AttributeAccess;
import org.jboss.dmr.ModelNode;
/**
* An extension to ListAttributeDefinition that contains a mapped field.
*/
public class MappedListAttributeDefinition extends SimpleListAttributeDefinition implements MappedAttributeDefinition {
private final List<String> pathToFieldInConfiguration;
private final List<String> pathToContainerOfFieldInConfiguration;
protected MappedListAttributeDefinition( SimpleListAttributeDefinition.Builder builder,
SimpleAttributeDefinition valueType,
List<String> pathToFieldInConfiguration ) {
super(builder, valueType);
assert pathToFieldInConfiguration != null;
assert pathToFieldInConfiguration.size() > 0;
this.pathToFieldInConfiguration = pathToFieldInConfiguration;
this.pathToContainerOfFieldInConfiguration = this.pathToFieldInConfiguration.size() > 1 ?
this.pathToFieldInConfiguration.subList(0, this.pathToFieldInConfiguration.size() - 1)
:
Collections.<String>emptyList();
}
@Override
public List<String> getPathToField() {
return pathToFieldInConfiguration;
}
@Override
public List<String> getPathToContainerOfField() {
return pathToContainerOfFieldInConfiguration;
}
@Override
public String getFieldName() {
return pathToFieldInConfiguration.get(pathToFieldInConfiguration.size() - 1);
}
@Override
public Object getTypedValue( ModelNode node ) throws OperationFailedException {
return MappedSimpleAttributeDefinition.getTypedValue(node, this);
}
@Override
public ModelNode getDefaultValue() {
ModelNode listDefault = super.getDefaultValue();
if (listDefault != null) {
return listDefault;
}
//attempt to resolve the default against the value type (not that this is a bit of hack because SimpleListAttributeDefinition
//simply do not support default values (because of its builder)
ModelNode valueTypeDefault = getValueType().getDefaultValue();
if (valueTypeDefault == null) {
return null;
}
switch (valueTypeDefault.getType()) {
case LIST: {
return valueTypeDefault;
}
default: {
ModelNode result = new ModelNode();
String[] segments = valueTypeDefault.asString().split(" ");
for (String segment : segments) {
result.add(segment);
}
return result;
}
}
}
public static class Builder {
private final SimpleAttributeDefinition valueType;
private final SimpleListAttributeDefinition.Builder builder;
private List<String> configPath;
protected Builder( final String name,
final SimpleAttributeDefinition valueType ) {
this.valueType = valueType;
this.builder = new SimpleListAttributeDefinition.Builder(name, valueType);
}
protected static Builder of( final String name,
final SimpleAttributeDefinition valueType ) {
return new Builder(name, valueType);
}
protected ListAttributeDefinition build() {
if (configPath == null) {
return builder.build();
} else {
return new MappedListAttributeDefinition(builder, valueType, configPath);
}
}
protected Builder setAllowNull( final boolean allowNull ) {
builder.setAllowNull(allowNull);
return this;
}
protected Builder setFlags( final AttributeAccess.Flag... flags ) {
builder.setFlags(flags);
return this;
}
protected Builder setMaxSize( final int maxSize ) {
builder.setMaxSize(maxSize);
return this;
}
protected Builder setMinSize( final int minSize ) {
builder.setMinSize(minSize);
return this;
}
protected Builder setAllowExpression( final boolean allowExpression ) {
builder.setAllowExpression(allowExpression);
return this;
}
protected Builder setFieldPathInRepositoryConfiguration( String... pathToField ) {
configPath = Collections.unmodifiableList(Arrays.asList(pathToField));
return this;
}
protected Builder setAccessConstraints(AccessConstraintDefinition...constraints) {
builder.setAccessConstraints(constraints);
return this;
}
}
}