/* * Copyright (c) 2002 Cunningham & Cunningham, Inc. * Copyright (c) 2009-2015 by Jochen Wierum & Cologne Intelligence * * This file is part of FitGoodies. * * FitGoodies is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * FitGoodies is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with FitGoodies. If not, see <http://www.gnu.org/licenses/>. */ package de.cologneintelligence.fitgoodies; import de.cologneintelligence.fitgoodies.checker.Checker; import de.cologneintelligence.fitgoodies.checker.EqualityChecker; import de.cologneintelligence.fitgoodies.htmlparser.FitCell; import de.cologneintelligence.fitgoodies.references.CellProcessor; import de.cologneintelligence.fitgoodies.references.CellProcessorProvider; import de.cologneintelligence.fitgoodies.references.CellProcessorProviderHelper; import de.cologneintelligence.fitgoodies.typehandler.TypeHandler; import de.cologneintelligence.fitgoodies.typehandler.TypeHandlerFactory; import de.cologneintelligence.fitgoodies.util.DependencyManager; import de.cologneintelligence.fitgoodies.valuereceivers.ValueReceiver; import java.util.LinkedList; import java.util.List; public class Validator { private final List<CellProcessorProvider> cellProcessorProviders; public Validator() { cellProcessorProviders = DependencyManager.getOrCreate(CellProcessorProviderHelper.class) .getProviders(); } public String preProcess(FitCell cell) { return preProcess(cell.getFitValue().trim()); } public String preProcess(String cellText) { return new PreProcessorStep().run(cellText).getProcessedText(); } public void process(FitCell cell, ValueReceiver valueReceiver, String cellParameter, TypeHandlerFactory typeHandlerFactory) { PreProcessorStep preProcessorStep = new PreProcessorStep().run(cell.getFitValue().trim()); ComparatorStep comparatorStep = new ComparatorStep().run(preProcessorStep, cell, valueReceiver, typeHandlerFactory, cellParameter); new PostProcessorStep().run(preProcessorStep, comparatorStep); } private class PreProcessorStep { private Checker checkRoutine; private List<CellProcessor> applicableProcessors; private String processedText; public PreProcessorStep run(String cellText) { checkRoutine = null; applicableProcessors = new LinkedList<>(); processedText = cellText; for (CellProcessorProvider provider : cellProcessorProviders) { if (provider.canProcess(processedText)) { CellProcessor processor = provider.create(processedText); processedText = processor.preprocess(); if (checkRoutine == null && processor.replacesCheckRoutine()) { checkRoutine = processor.getChecker(); } applicableProcessors.add(processor); } } return this; } public Checker getCheckRoutine() { return checkRoutine; } public List<CellProcessor> getApplicableProcessors() { return applicableProcessors; } public String getProcessedText() { return processedText; } } private static class ComparatorStep { private TypeHandler handler; private Object result; public ComparatorStep run(PreProcessorStep preProcessorStep, FitCell cell, ValueReceiver valueReceiver, TypeHandlerFactory typeHandlerFactory, String cellParameter) { Checker checkRoutine = preProcessorStep.getCheckRoutine(); String cellText = preProcessorStep.getProcessedText(); if (checkRoutine == null) { checkRoutine = new EqualityChecker(); } handler = typeHandlerFactory.getHandler(valueReceiver.getType(), cellParameter); result = checkRoutine.check(cell, cellText, valueReceiver, handler); return this; } public TypeHandler getHandler() { return handler; } public Object getResult() { return result; } } private static class PostProcessorStep { public void run(PreProcessorStep preProcessorStep, ComparatorStep comparatorStep) { List<CellProcessor> applicableProcessors = preProcessorStep.getApplicableProcessors(); for (int i = applicableProcessors.size() - 1; i >= 0; i--) { CellProcessor applicableProcessor = applicableProcessors.get(i); applicableProcessor.postprocess(comparatorStep.getResult(), comparatorStep.getHandler()); } } } }