/* * Copyright (C) 2007-2010 JĂșlio Vilmar Gesser. * Copyright (C) 2011, 2013-2016 The JavaParser Team. * * This file is part of JavaParser. * * JavaParser can be used either under the terms of * a) 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. * b) the terms of the Apache License * * You should have received a copy of both licenses in LICENCE.LGPL and * LICENCE.APACHE. Please refer to those files for details. * * JavaParser 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. */ package com.github.javaparser.printer.concretesyntaxmodel; import com.github.javaparser.ast.Node; import com.github.javaparser.ast.NodeList; import com.github.javaparser.ast.observer.ObservableProperty; import com.github.javaparser.printer.SourcePrinter; import java.util.Arrays; import java.util.List; public class CsmConditional implements CsmElement { private final Condition condition; private final List properties; private final CsmElement thenElement; private final CsmElement elseElement; public Condition getCondition() { return condition; } public ObservableProperty getProperty() { if (properties.size() > 1) { throw new IllegalStateException(); } return properties.get(0); } public CsmElement getThenElement() { return thenElement; } public CsmElement getElseElement() { return elseElement; } public enum Condition { IS_EMPTY, IS_NOT_EMPTY, IS_PRESENT, FLAG; boolean evaluate(Node node, ObservableProperty property){ if (this == IS_PRESENT) { return !property.isNullOrNotPresent(node); } if (this == FLAG) { return property.getValueAsBooleanAttribute(node); } if (this == IS_EMPTY) { NodeList value = property.getValueAsMultipleReference(node); return value == null || value.isEmpty(); } if (this == IS_NOT_EMPTY) { NodeList value = property.getValueAsMultipleReference(node); return value != null && !value.isEmpty(); } throw new UnsupportedOperationException(name()); } } public CsmConditional(ObservableProperty property, Condition condition, CsmElement thenElement, CsmElement elseElement) { this.properties = Arrays.asList(property); this.condition = condition; this.thenElement = thenElement; this.elseElement = elseElement; } public CsmConditional(List properties, Condition condition, CsmElement thenElement, CsmElement elseElement) { if (properties.size() < 1) { throw new IllegalArgumentException(); } this.properties = properties; this.condition = condition; this.thenElement = thenElement; this.elseElement = elseElement; } public CsmConditional(ObservableProperty property, Condition condition, CsmElement thenElement) { this(property, condition, thenElement, new CsmNone()); } @Override public void prettyPrint(Node node, SourcePrinter printer) { boolean test = false; for (ObservableProperty prop : properties) { test = test || condition.evaluate(node, prop); } if (test) { thenElement.prettyPrint(node, printer); } else { elseElement.prettyPrint(node, printer); } } }