/* * StringAttributeRule.java * * Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard * * This file is part of BEAST. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership and licensing. * * BEAST 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 2 * of the License, or (at your option) any later version. * * BEAST 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 BEAST; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301 USA */ package dr.xml; import java.util.ArrayList; import java.util.List; import java.util.Random; public class StringAttributeRule extends AttributeRule { /** * Creates a required String attribute rule. */ public StringAttributeRule(String name, String description) { this(name, description, (String) null, false); } /** * Creates a required String attribute rule. */ public StringAttributeRule(String name, String description, String example) { this(name, description, example, false); } /** * Creates a String attribute rule. */ public StringAttributeRule(String name, String description, boolean optional) { this(name, description, null, optional, 0, Integer.MAX_VALUE); } /** * Creates a String attribute rule. */ public StringAttributeRule(String name, String description, String example, boolean optional) { this(name, description, example, optional, 0, Integer.MAX_VALUE); } /** * Creates a String attribute rule. * * @param valid a list of valid tokens for this attribute */ public StringAttributeRule(String name, String description, String[] valid, boolean optional) { this(name, description, null, optional, 0, Integer.MAX_VALUE); validValues = new ArrayList<String>(); for (String aValid : valid) { validValues.add(aValid); } this.example = null; } /** * Creates a String attribute rule. * * @param valid a list of valid tokens for this attribute */ public StringAttributeRule(String name, String description, Enum[] valid, boolean optional) { this(name, description, null, optional, 0, Integer.MAX_VALUE); validValues = new ArrayList<String>(); for (Enum aValid : valid) { validValues.add(aValid.name()); } this.example = null; } /** * Creates a String attribute rule. * * @param valid a list of valid tokens for this attribute */ public StringAttributeRule(String name, String description, String[][] valid, boolean optional) { this(name, description, null, optional, 0, Integer.MAX_VALUE); validValues = new ArrayList<String>(); for (String[] aValid : valid) { for (String anAValid : aValid) { validValues.add(anAValid); } } this.example = null; } /** * Creates a String attribute rule. */ private StringAttributeRule(String name, String description, String example, boolean optional, int minLength, int maxLength) { setName(name); setAttributeClass(String.class); setOptional(optional); setDescription(description); this.example = example; this.minLength = minLength; this.maxLength = maxLength; } /** * @return true if the required attribute of the correct type is present. */ public boolean isSatisfied(XMLObject xo) { if (super.isSatisfied(xo)) { if (!getOptional()) { try { final String str = (String) getAttribute(xo); if (validValues != null) { for (Object validValue : validValues) { if (str.equals(validValue)) return true; } return false; } else { return (str.length() >= minLength || str.length() <= maxLength); } } catch (XMLParseException xpe) { // } } return true; } return false; } /** * @return a string describing the rule. */ public String ruleString() { StringBuffer rule = new StringBuffer(super.ruleString()); if (validValues != null && validValues.size() > 0) { rule.append(" from {"); rule.append(validValues.get(0)); for (int i = 1; i < validValues.size(); i++) { rule.append(", "); rule.append(validValues.get(i)); } } return rule.toString(); } /** * @return a string describing the rule. */ public String htmlRuleString(XMLDocumentationHandler handler) { String rule = "<div class=\"" + (getOptional() ? "optional" : "required") + "rule\"> Attribute " + " <span class=\"attrname\">" + getName() + "</span>"; if (validValues != null) { rule += " ∈ {<tt>" + validValues.get(0) + "</tt>"; for (int i = 1; i < validValues.size(); i++) { rule += ", <tt>" + validValues.get(i) + "</tt>"; } rule += "}"; } else { rule += " is string"; } rule += " <div class=\"description\">" + getDescription() + "</div>"; rule += "</div>"; return rule; } public String getExample() { Random random = new Random(); if (validValues != null) { return validValues.get(random.nextInt(validValues.size())); } else return example; } public boolean hasExample() { return (validValues != null || example != null); } private int minLength = 0, maxLength = Integer.MAX_VALUE; private List<String> validValues = null; private String example = null; }