/*
* JBoss, Home of Professional Open Source
* Copyright 2011, Red Hat, Inc. and/or its affiliates, and individual
* contributors by the @authors tag. See the copyright.txt in the
* distribution for a full listing of individual contributors.
*
* 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.jboss.solder.config.xml.model;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.enterprise.context.Dependent;
import javax.enterprise.inject.spi.BeanManager;
import org.jboss.solder.config.xml.core.BeanResult;
import org.jboss.solder.config.xml.fieldset.ConstantFieldValue;
import org.jboss.solder.config.xml.fieldset.ELFieldValue;
import org.jboss.solder.config.xml.fieldset.FieldValue;
import org.jboss.solder.config.xml.fieldset.InlineBeanFieldValue;
import org.jboss.solder.config.xml.fieldset.InlineBeanIdCreator;
import org.jboss.solder.config.xml.fieldset.InlineBeanQualifier;
import org.jboss.solder.config.xml.util.TypeOccuranceInformation;
import org.jboss.solder.config.xml.util.XmlConfigurationException;
public abstract class AbstractValueXmlItem extends AbstractXmlItem {
private int syntheticQualifierId;
private BeanResult<?> inlineBean;
public AbstractValueXmlItem(XmlItemType type, XmlItem parent, Class<?> javaClass, String innerText, Map<String, String> attributes, String document, int lineno) {
super(type, parent, javaClass, innerText, attributes, document, lineno);
}
public Set<TypeOccuranceInformation> getAllowedItem() {
return Collections.singleton(TypeOccuranceInformation.of(XmlItemType.CLASS, null, 1));
}
public BeanResult<?> getBeanResult(BeanManager manager) {
List<ClassXmlItem> inlineBeans = getChildrenOfType(ClassXmlItem.class);
if (!inlineBeans.isEmpty()) {
ClassXmlItem inline = inlineBeans.get(0);
for (AnnotationXmlItem i : inline.getChildrenOfType(AnnotationXmlItem.class)) {
Class annotation = (Class) i.getJavaClass();
if (manager.isQualifier(annotation)) {
throw new XmlConfigurationException("Cannot define qualifiers on inline beans, Qualifier: " + annotation.getName(), i.getDocument(), i.getLineno());
} else if (manager.isScope(annotation) && annotation != Dependent.class) {
throw new XmlConfigurationException("Inline beans must have @Dependent scope, Scope: " + annotation.getName(), i.getDocument(), i.getLineno());
}
}
syntheticQualifierId = InlineBeanIdCreator.getId();
AnnotationXmlItem syntheticQualifier = new AnnotationXmlItem(this, InlineBeanQualifier.class, "" + syntheticQualifierId, Collections.EMPTY_MAP, getDocument(), getLineno());
inline.addChild(syntheticQualifier);
inlineBean = inline.createBeanResult(manager);
return inlineBean;
}
inlineBean = null;
return null;
}
public int getSyntheticQualifierId() {
return syntheticQualifierId;
}
public FieldValue getValue() {
if (inlineBean == null) {
if (innerText.matches("^#\\{.*\\}$")) {
return new ELFieldValue(innerText);
}
return new ConstantFieldValue(innerText);
} else {
return new InlineBeanFieldValue(syntheticQualifierId);
}
}
}