/*- * Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart * * This file is part of CityDoctor2. * * CityDoctor2 is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * CityDoctor2 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with CityDoctor2. If not, see . */ package de.hft.stuttgart.citydoctor2.checks; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckResult; import de.hft.stuttgart.citydoctor2.check.Checkable; import de.hft.stuttgart.citydoctor2.check.Requirement; import de.hft.stuttgart.citydoctor2.check.RequirementType; import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError; import de.hft.stuttgart.citydoctor2.datastructure.AbstractBuilding; import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface; import de.hft.stuttgart.citydoctor2.datastructure.BridgeObject; import de.hft.stuttgart.citydoctor2.datastructure.Building; import de.hft.stuttgart.citydoctor2.datastructure.BuildingInstallation; import de.hft.stuttgart.citydoctor2.datastructure.BuildingPart; import de.hft.stuttgart.citydoctor2.datastructure.CityObject; import de.hft.stuttgart.citydoctor2.datastructure.Geometry; import de.hft.stuttgart.citydoctor2.datastructure.LandObject; import de.hft.stuttgart.citydoctor2.datastructure.LinearRing; import de.hft.stuttgart.citydoctor2.datastructure.Opening; import de.hft.stuttgart.citydoctor2.datastructure.Polygon; import de.hft.stuttgart.citydoctor2.datastructure.TransportationObject; import de.hft.stuttgart.citydoctor2.datastructure.Vegetation; import de.hft.stuttgart.citydoctor2.datastructure.WaterObject; import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration; import de.hft.stuttgart.citydoctor2.utils.Localization; /** * A check according to the decorator pattern for handling unexpected exceptions * while performing the containing check. This will generate an error object for * writing the the reports, and will not cause the checking process to halt. * * @author Matthias Betz * */ public class CheckContainer extends Check { private static final Logger logger = LogManager.getLogger(CheckContainer.class); private final Check check; public CheckContainer(Check check) { this.check = check; } @Override public Set appliesToRequirements() { return check.appliesToRequirements(); } @Override public void init(Map parameters, ParserConfiguration config) { check.init(parameters, config); } @Override public CheckId getCheckId() { return check.getCheckId(); } @Override public List> getApplicableToClasses() { return check.getApplicableToClasses(); } @Override public boolean canExecute(Checkable c) { return check.canExecute(c); } private void handleException(Exception e, Checkable c) { if (logger.isErrorEnabled()) { logger.error(Localization.getText("CheckContainer.error"), check.getCheckId(), e); } CheckError err = new UnknownCheckError(c, e, this); CheckResult cr = new CheckResult(check.getCheckId(), ResultStatus.ERROR, err); c.addCheckResult(cr); } @Override public List getDependencies() { return check.getDependencies(); } @Override public void check(AbstractBuilding ab) { try { check.check(ab); } catch (Exception e) { handleException(e, ab); } } @Override public void check(BoundarySurface bs) { try { check.check(bs); } catch (Exception e) { handleException(e, bs); } } @Override public void check(BridgeObject b) { try { check.check(b); } catch (Exception e) { handleException(e, b); } } @Override public void check(Building b) { try { check.check(b); } catch (Exception e) { handleException(e, b); } } @Override public void check(BuildingInstallation bi) { try { check.check(bi); } catch (Exception e) { handleException(e, bi); } } @Override public void check(BuildingPart bp) { try { check.check(bp); } catch (Exception e) { handleException(e, bp); } } @Override public void check(CityObject co) { try { check.check(co); } catch (Exception e) { handleException(e, co); } } @Override public void check(Geometry g) { try { check.check(g); } catch (Exception e) { handleException(e, g); } } @Override public void check(LandObject lo) { try { check.check(lo); } catch (Exception e) { handleException(e, lo); } } @Override public void check(LinearRing lr) { try { check.check(lr); } catch (Exception e) { handleException(e, lr); } } @Override public void check(Opening o) { try { check.check(o); } catch (Exception e) { handleException(e, o); } } @Override public void check(Polygon p) { try { check.check(p); } catch (Exception e) { handleException(e, p); } } @Override public void check(TransportationObject to) { try { check.check(to); } catch (Exception e) { handleException(e, to); } } @Override public void check(Vegetation veg) { try { check.check(veg); } catch (Exception e) { handleException(e, veg); } } @Override public void check(WaterObject wo) { try { check.check(wo); } catch (Exception e) { handleException(e, wo); } } @Override public RequirementType getType() { return check.getType(); } @Override public Check createNewInstance() { return check.createNewInstance(); } }