/**
* 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.analyzer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.asakusafw.dmdl.model.AstAttribute;
import com.asakusafw.dmdl.semantics.Declaration;
import com.asakusafw.dmdl.semantics.DmdlSemantics;
import com.asakusafw.dmdl.semantics.ModelDeclaration;
import com.asakusafw.dmdl.semantics.PropertyDeclaration;
import com.asakusafw.dmdl.spi.AttributeDriver;
final class AttributeProcessor {
static final Logger LOG = LoggerFactory.getLogger(AttributeProcessor.class);
private final Context context;
private AttributeProcessor(Context context) {
this.context = context;
}
static void resolve(Context context, ModelDeclaration model) {
new AttributeProcessor(context).resolveAttributes(model);
}
static void verify(Context context, ModelDeclaration model) {
new AttributeProcessor(context).verifyAttributes(model);
}
private void resolveAttributes(ModelDeclaration model) {
LOG.debug("resolving attributes: {}", model.getName()); //$NON-NLS-1$
doResolveAttributes(model);
for (PropertyDeclaration property : model.getDeclaredProperties()) {
doResolveAttributes(property);
}
// NOTE: we never process attributes for property references
}
private void doResolveAttributes(Declaration declaration) {
assert declaration != null;
AttributeDriver.Context local = getDriverContext();
for (AstAttribute attribute : declaration.getAttributes()) {
String name = attribute.name.toString();
LOG.debug("resolving attribute: {} -> {}", declaration.getName(), name); //$NON-NLS-1$
AttributeDriver driver = context.findAttributeDriver(attribute);
if (driver == null) {
context.error(
attribute.name,
Messages.getString("DmdlAnalyzer.diagnosticUnknownAttribute"), //$NON-NLS-1$
name);
continue;
}
LOG.debug("processing attribute: {} -> {}", name, driver); //$NON-NLS-1$
driver.process(local, declaration, attribute);
}
}
private void verifyAttributes(ModelDeclaration model) {
LOG.debug("verifying attributes: {}", model.getName()); //$NON-NLS-1$
doVerifyAttributes(model);
for (PropertyDeclaration property : model.getDeclaredProperties()) {
doVerifyAttributes(property);
}
}
private void doVerifyAttributes(Declaration declaration) {
assert declaration != null;
AttributeDriver.Context local = getDriverContext();
for (AstAttribute attribute : declaration.getAttributes()) {
String name = attribute.name.toString();
AttributeDriver driver = context.findAttributeDriver(attribute);
if (driver == null) {
// may not occur
continue;
}
LOG.debug("verifying attribute: {} -> {}", name, driver); //$NON-NLS-1$
driver.verify(local, declaration, attribute);
}
}
private AttributeDriver.Context getDriverContext() {
DmdlSemantics environment = context.getWorld();
AttributeDriver.Context local = new AttributeDriver.Context() {
@Override
public DmdlSemantics getEnvironment() {
return environment;
}
};
return local;
}
}