package fr.acxio.tools.agia.alfresco.configuration;
/*
* Copyright 2014 Acxio
*
* 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.
*/
import java.util.List;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.ManagedList;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.util.StringUtils;
import org.springframework.util.xml.DomUtils;
import org.w3c.dom.Element;
/**
* <p>
* Abstract Spring configuration parser for
* {@link fr.acxio.tools.agia.alfresco.configuration.NodeDefinition
* NodeDefinition} .
* </p>
*
* @author pcollardez
*
*/
public abstract class NodeDefinitionParser extends AbstractSingleBeanDefinitionParser {
protected static final String NODEDEF_PROPERTY = "property";
protected static final String NODEDEF_ASPECT = "aspect";
protected static final String NODEDEF_ASSOC_REF = "ref";
protected static final String NODEDEF_ASSOC_QUERY = "query";
protected static final String PROPDEF_LOCALNAME = "localName";
protected static final String PROPDEF_CONVERTERREF = "converterRef";
protected static final String PROPDEF_VALUE = "value";
protected static final String PROPDEF_NODETYPE = "nodeType";
protected static final String PROPDEF_VERSIONOP = "versionOperation";
protected static final String PROPDEF_ASSOC_TARGET_ID = "assocTargetId";
protected static final String PROPDEF_TYPE = "type";
protected static final String PROPDEF_QUERY_LANGUAGE = "language";
@Override
protected void doParse(Element sElement, ParserContext sParserContext, BeanDefinitionBuilder sBuilder) {
sBuilder.addPropertyValue("nodeType", sElement.getAttribute(PROPDEF_NODETYPE));
sBuilder.addPropertyValue("versionOperation", sElement.getAttribute(PROPDEF_VERSIONOP));
sBuilder.addPropertyValue("assocTargetId", sElement.getAttribute(PROPDEF_ASSOC_TARGET_ID));
}
protected List<AspectDefinition> parseAspects(Element sElement) {
List<Element> childElements = DomUtils.getChildElementsByTagName(sElement, NODEDEF_ASPECT);
ManagedList<AspectDefinition> children = new ManagedList<AspectDefinition>(childElements.size());
for (Element element : childElements) {
children.add(new SimpleAspectDefinition(element.getAttribute(NAME_ATTRIBUTE)));
}
return children;
}
protected List<BeanDefinition> parseAssociations(Element sElement) {
List<Element> childRefElements = DomUtils.getChildElementsByTagName(sElement, NODEDEF_ASSOC_REF);
List<Element> childQueryElements = DomUtils.getChildElementsByTagName(sElement, NODEDEF_ASSOC_QUERY);
ManagedList<BeanDefinition> children = new ManagedList<BeanDefinition>(childRefElements.size() + childQueryElements.size());
for (Element element : childRefElements) {
BeanDefinitionBuilder aRefAssocBuilder = BeanDefinitionBuilder.genericBeanDefinition(RefAssociationDefinitionFactoryBean.class);
aRefAssocBuilder.addPropertyValue("type", element.getAttribute(PROPDEF_TYPE));
aRefAssocBuilder.addPropertyValue("reference", element.getTextContent());
children.add(aRefAssocBuilder.getBeanDefinition());
}
for (Element element : childQueryElements) {
BeanDefinitionBuilder aQueryAssocBuilder = BeanDefinitionBuilder.genericBeanDefinition(QueryAssociationDefinitionFactoryBean.class);
aQueryAssocBuilder.addPropertyValue("type", element.getAttribute(PROPDEF_TYPE));
aQueryAssocBuilder.addPropertyValue("queryLanguage", element.getAttribute(PROPDEF_QUERY_LANGUAGE));
aQueryAssocBuilder.addPropertyValue("query", element.getTextContent());
children.add(aQueryAssocBuilder.getBeanDefinition());
}
return children;
}
protected List<BeanDefinition> parseProperties(Element sElement, ParserContext sParserContext) {
List<Element> childElements = DomUtils.getChildElementsByTagName(sElement, NODEDEF_PROPERTY);
ManagedList<BeanDefinition> children = new ManagedList<BeanDefinition>(childElements.size());
for (Element element : childElements) {
children.add(parseProperty(element, sParserContext));
}
return children;
}
protected BeanDefinition parseProperty(Element sElement, ParserContext sParserContext) {
BeanDefinitionBuilder aBuilder = BeanDefinitionBuilder.genericBeanDefinition(PropertyDefinitionFactoryBean.class);
aBuilder.addPropertyValue("localName", sElement.getAttribute(PROPDEF_LOCALNAME));
String aConverterID = sElement.getAttribute(PROPDEF_CONVERTERREF);
if (StringUtils.hasText(aConverterID)) {
aBuilder.addPropertyReference("converter", aConverterID);
}
List<Element> aValuesElements = DomUtils.getChildElementsByTagName(sElement, PROPDEF_VALUE);
ManagedList<String> aValues = new ManagedList<String>(aValuesElements.size());
for (Element aElement : aValuesElements) {
aValues.add(aElement.getTextContent());
}
aBuilder.addPropertyValue("values", aValues);
return aBuilder.getBeanDefinition();
}
}