/*
* Copyright 2004-2012 the Seasar Foundation and the Others.
*
* 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.seasar.mayaa.impl.builder.library;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.seasar.mayaa.builder.library.LibraryDefinition;
import org.seasar.mayaa.builder.library.ProcessorDefinition;
import org.seasar.mayaa.builder.library.TemplateAttributeReader;
import org.seasar.mayaa.builder.library.converter.PropertyConverter;
import org.seasar.mayaa.engine.processor.ProcessorProperty;
import org.seasar.mayaa.engine.processor.TemplateProcessor;
import org.seasar.mayaa.engine.specification.NodeAttribute;
import org.seasar.mayaa.engine.specification.PrefixAwareName;
import org.seasar.mayaa.engine.specification.QName;
import org.seasar.mayaa.engine.specification.SpecificationNode;
import org.seasar.mayaa.impl.engine.processor.ProcessorPropertyLiteral;
import org.seasar.mayaa.impl.engine.specification.NodeAttributeImpl;
import org.seasar.mayaa.impl.engine.specification.SpecificationUtil;
import org.seasar.mayaa.impl.provider.ProviderUtil;
import org.seasar.mayaa.impl.util.StringUtil;
/**
* @author Masataka Kurihara (Gluegent, Inc.)
* @author Hisayoshi Sasaki (Gluegent, Inc.)
*/
public class TLDPropertyDefinition extends PropertyDefinitionImpl {
private static final long serialVersionUID = -2999228650173085084L;
private static final Log LOG =
LogFactory.getLog(TLDPropertyDefinition.class);
private boolean _rtexprvalue;
protected PropertyConverter getConverterForProcessorProperty() {
LibraryDefinition library = getPropertySet().getLibraryDefinition();
PropertyConverter converter =
library.getPropertyConverter(ProcessorProperty.class);
if (converter == null) {
throw new IllegalStateException();
}
return converter;
}
protected NodeAttribute getTemplateAttribute(
SpecificationNode original, SpecificationNode injected) {
TemplateAttributeReader reader = ProviderUtil.getTemplateAttributeReader();
String value = reader.getValue(injected.getQName(), getName(), original);
if (value != null) {
return new NodeAttributeImpl(getQName(injected), value);
}
return null;
}
public Object createProcessorProperty(ProcessorDefinition processorDef,
TemplateProcessor processor,
SpecificationNode original, SpecificationNode injected) {
if (injected == null) {
throw new IllegalArgumentException();
}
Class propertyClass = getPropertyClass(processorDef, processor);
if (propertyClass == null) {
// real property not found on the tag.
String processorName = processorDef.getName();
if (LOG.isWarnEnabled()) {
String msg = StringUtil.getMessage(TLDPropertyDefinition.class,
0, processorName, getName());
LOG.warn(msg);
}
return null;
}
QName qName = getQName(injected);
NodeAttribute attribute = injected.getAttribute(qName);
if (attribute == null) {
attribute = getTemplateAttribute(original, injected);
}
if (attribute != null) {
if (isRtexprvalue()) {
// 動的値を許可
PropertyConverter converter = getConverterForProcessorProperty();
return converter.convert(attribute, attribute.getValue(), propertyClass);
}
// 動的値は不許可
PrefixAwareName prefixAwareName =
SpecificationUtil.createPrefixAwareName(
attribute.getQName(), attribute.getPrefix());
return new ProcessorPropertyLiteral(prefixAwareName, attribute.getValue());
} else if (isRequired()) {
String processorName = processorDef.getName();
throw new NoRequiredPropertyException(processorName, qName);
}
return null;
}
public boolean isRtexprvalue() {
return _rtexprvalue;
}
public void setRtexprvalue(boolean rtexprvalue) {
this._rtexprvalue = rtexprvalue;
}
}