/*******************************************************************************
* Copyright (c) 2007, 2010 Spring IDE Developers
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Spring IDE Developers - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.beans.core.internal.model.validation.rules;
import org.eclipse.core.runtime.IProgressMonitor;
import org.springframework.ide.eclipse.beans.core.internal.model.BeansModelUtils;
import org.springframework.ide.eclipse.beans.core.model.IBeanAlias;
import org.springframework.ide.eclipse.beans.core.model.IBeansConfig;
import org.springframework.ide.eclipse.beans.core.model.IBeansConfigSet;
import org.springframework.ide.eclipse.beans.core.model.validation.AbstractNonInfrastructureBeanValidationRule;
import org.springframework.ide.eclipse.beans.core.model.validation.IBeansValidationContext;
import org.springframework.ide.eclipse.core.model.IModelElement;
import org.springframework.ide.eclipse.core.model.validation.IValidationRule;
/**
* Validates a given {@link IBeanAlias}'s alias and associated bean name.
* @author Torsten Juergeleit
* @author Christian Dupuis
* @since 2.0
*/
public class BeanAliasRule extends AbstractNonInfrastructureBeanValidationRule implements
IValidationRule<IBeanAlias, IBeansValidationContext> {
@Override
protected boolean supportsModelElementForNonInfrastructureBean(IModelElement element,
IBeansValidationContext context) {
return element instanceof IBeanAlias;
}
public void validate(IBeanAlias alias, IBeansValidationContext context, IProgressMonitor monitor) {
IBeansConfigSet configSet = (context.getContextElement() instanceof IBeansConfigSet ? (IBeansConfigSet) context
.getContextElement() : null);
// Validate bean overriding
if (context.getIncompleteRegistry().containsBeanDefinition(alias.getElementName())) {
if (configSet == null || BeansModelUtils.getConfig(alias).getBean(alias.getElementName()) != null) {
context.error(alias, "BEAN_OVERRIDE", "Overrides another bean in the same config file");
}
else if (!configSet.isAllowBeanDefinitionOverriding()) {
context.error(alias, "BEAN_OVERRIDE", "Overrides another bean in config set '"
+ configSet.getElementName() + "'");
}
}
// Validate alias overriding within config
for (IBeanAlias al : BeansModelUtils.getConfig(alias).getAliases()) {
if (al == alias) {
continue;
}
else if (al.getElementName().equals(alias.getElementName())) {
context.error(alias, "ALIAS_OVERRIDE", "Overrides another alias in the same config file");
break;
}
}
// Validate alias within config set
if (configSet != null) {
// Validate alias overriding
if (!configSet.isAllowAliasOverriding()) {
for (IBeansConfig config : configSet.getConfigs()) {
if (config == BeansModelUtils.getConfig(alias)) {
break;
}
if (config.getAlias(alias.getElementName()) != null) {
context.error(alias, "ALIAS_OVERRIDE", "Overrides another alias in config set '"
+ configSet.getElementName() + "'");
break;
}
}
}
// Check if corresponding bean exists
if (!configSet.isIncomplete() && !context.getCompleteRegistry().containsBeanDefinition(alias.getBeanName())) {
context.warning(alias, "UNDEFINED_REFERENCED_BEAN", "Referenced bean '" + alias.getBeanName()
+ "' not found in config set '" + configSet.getElementName() + "'");
}
}
}
}