/* * Copyright 2014 Bernd Vogt and 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.sourcepit.b2.validation; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; import javax.inject.Inject; import javax.inject.Named; import org.eclipse.emf.ecore.EObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sourcepit.b2.directory.parser.module.IModuleParsingRequest; import org.sourcepit.b2.directory.parser.module.ModuleParserLifecycleParticipant; import org.sourcepit.b2.model.builder.util.ModuleWalker; import org.sourcepit.b2.model.module.AbstractModule; import org.sourcepit.common.utils.lang.ThrowablePipe; import org.sourcepit.common.utils.props.PropertiesSource; /** * @author Bernd Vogt <bernd.vogt@sourcepit.org> */ @Named public class ModuleValidation implements ModuleParserLifecycleParticipant { private static final Logger LOGGER = LoggerFactory.getLogger(ModuleValidation.class); @Inject private Map<String, ModuleValidationConstraint> constraintMap; public void preParse(IModuleParsingRequest request) { // noop } public void postParse(IModuleParsingRequest request, AbstractModule module, ThrowablePipe errors) { LOGGER.info("Validating " + module.getId() + "."); if (module != null && errors.isEmpty()) { final PropertiesSource properties = request.getModuleProperties(); final Map<String, ModuleValidationConstraint> enabledConstraintsMap = getEnabledConstraints(properties); validate(enabledConstraintsMap, module, properties); } } private Map<String, ModuleValidationConstraint> getEnabledConstraints(final PropertiesSource properties) { final Map<String, ModuleValidationConstraint> enabledConstraintsMap = new LinkedHashMap<String, ModuleValidationConstraint>(); for (Entry<String, ModuleValidationConstraint> entry : constraintMap.entrySet()) { final String constraintId = entry.getKey(); if (isConstraintEnabled(properties, constraintId)) { enabledConstraintsMap.put(constraintId, entry.getValue()); } } return enabledConstraintsMap; } private void validate(final Map<String, ModuleValidationConstraint> enabledConstraintsMap, AbstractModule module, final PropertiesSource properties) { final boolean quickFixesEnabled = properties.getBoolean("b2.validation.quickFixes.enabled", false); if (quickFixesEnabled) { LOGGER.info("Quick fixes are enabled."); } else { LOGGER.info( "Quick fixes are disabled. You can enable it by setting the propety b2.validation.quickFixes.enabled=true."); } final ModuleWalker walker = new ModuleWalker(false, true) { @Override protected boolean doVisit(EObject eObject) { for (Entry<String, ModuleValidationConstraint> entry : enabledConstraintsMap.entrySet()) { final String constraintId = entry.getKey(); final ModuleValidationConstraint constraint = entry.getValue(); constraint.validate(eObject, properties, quickFixesEnabled ? isQuickFixesEnabled(properties, constraintId) : false); } return true; } }; walker.walk(module); } private boolean isConstraintEnabled(PropertiesSource properties, String constraintId) { return properties.getBoolean("b2.validation.constraints." + constraintId + ".enabled", true); } private boolean isQuickFixesEnabled(PropertiesSource properties, String constraintId) { return properties.getBoolean("b2.validation.quickFixes." + constraintId + ".enabled", true); } }