/**
* Copyright 2011-2017 Asakusa Framework Team.
*
* 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 com.asakusafw.dmdl.directio.text.tabular;
import static com.asakusafw.dmdl.directio.text.TextFormatConstants.*;
import java.util.Optional;
import com.asakusafw.dmdl.Diagnostic;
import com.asakusafw.dmdl.directio.text.AttributeAnalyzer;
import com.asakusafw.dmdl.directio.text.EscapeSettings;
import com.asakusafw.dmdl.directio.text.TextFieldSettings;
import com.asakusafw.dmdl.directio.text.TextFormatSettings;
import com.asakusafw.dmdl.model.AstAttribute;
import com.asakusafw.dmdl.semantics.DmdlSemantics;
import com.asakusafw.dmdl.semantics.ModelDeclaration;
import com.asakusafw.dmdl.semantics.Trait;
import com.asakusafw.runtime.io.text.tabular.TabularTextFormat;
/**
* Attributes of tabular text models.
* @since 0.9.1
*/
public class TabularTextTrait implements Trait<TabularTextTrait> {
static final char DEFAULT_FIELD_SEPARATOR = TabularTextFormat.DEFAULT_FIELD_SEPARATOR;
private final AstAttribute attribute;
private final TextFormatSettings formatSettings;
private final EscapeSettings escapeSettings;
private final TextFieldSettings fieldSettings;
/**
* Creates a new instance.
* @param attribute the original attribute
* @param formatSettings the format settings
* @param escapeSettings the escape settings
* @param fieldSettings the field settings
*/
public TabularTextTrait(
AstAttribute attribute,
TextFormatSettings formatSettings,
EscapeSettings escapeSettings,
TextFieldSettings fieldSettings) {
this.attribute = attribute;
this.formatSettings = formatSettings;
this.escapeSettings = escapeSettings;
this.fieldSettings = fieldSettings;
}
static Optional<TabularTextTrait> find(ModelDeclaration declaration) {
return Optional.ofNullable(declaration.getTrait(TabularTextTrait.class));
}
static TabularTextTrait get(ModelDeclaration declaration) {
return Optional.ofNullable(declaration.getTrait(TabularTextTrait.class))
.orElseThrow(IllegalStateException::new);
}
static void register(DmdlSemantics environment, ModelDeclaration declaration, TabularTextTrait trait) {
if (find(declaration).isPresent()) {
environment.report(new Diagnostic(
Diagnostic.Level.ERROR, trait.attribute.name,
Messages.getString("TabularTextTrait.diagnosticDuplicateAttribute"), //$NON-NLS-1$
trait.attribute.name,
declaration.getName().identifier));
} else {
declaration.putTrait(TabularTextTrait.class, trait);
}
}
@Override
public AstAttribute getOriginalAst() {
return attribute;
}
/**
* Returns the format settings.
* @return the format settings
*/
public TextFormatSettings getFormatSettings() {
return formatSettings;
}
/**
* Returns the escape settings.
* @return the escape settings
*/
public EscapeSettings getEscapeSettings() {
return escapeSettings;
}
/**
* Returns the field settings.
* @return the field settings
*/
public TextFieldSettings getFieldSettings() {
return fieldSettings;
}
boolean verify(DmdlSemantics environment, ModelDeclaration declaration) {
boolean valid = true;
valid &= formatSettings.verify(environment, attribute);
valid &= escapeSettings.verify(environment, attribute);
valid &= fieldSettings.verify(environment, attribute);
if (valid == false) {
return false;
}
AttributeAnalyzer analyzer = new AttributeAnalyzer(environment, attribute);
if (escapeSettings.getCharacter().isPresent()) {
char fieldSeparator = formatSettings.getFieldSeparator().orElse(DEFAULT_FIELD_SEPARATOR);
char escapeCharacter = escapeSettings.getCharacter().getEntity();
if (fieldSeparator == escapeCharacter) {
analyzer.error(
escapeSettings.getCharacter().getDeclaration(),
Messages.getString("TabularTextTrait.diagnosticConflictCharacter"), //$NON-NLS-1$
ELEMENT_FIELD_SEPARATOR);
}
}
return analyzer.hasError() == false;
}
}