001 package com.oxygenxml.validate.nvdl;
002
003 import java.util.ArrayList;
004 import java.util.List;
005 import java.util.StringTokenizer;
006
007 import org.apache.xerces.util.XMLChar;
008
009 /**
010 * Strores trigger information and checks trigger activation.
011 * @author george
012 */
013 public class Trigger {
014 /**
015 * The namespace name for the local element names.
016 */
017 String namespace;
018 /**
019 * List with local names.
020 */
021 List elementNames;
022
023 /**
024 * Stores the invalid local names if any, otherwise null.
025 */
026 String errors;
027
028 /**
029 * Creates a trigger to store the elements that break sections
030 * for a given namespace.
031 * @param namespace The namespace
032 * @param nameList A space separated list of local names.
033 */
034 Trigger(String namespace, String nameList) {
035 StringTokenizer st = new StringTokenizer(nameList);
036 elementNames = new ArrayList(st.countTokens());
037 while (st.hasMoreTokens()) {
038 String name = st.nextToken();
039 elementNames.add(name);
040 if (!XMLChar.isValidNCName(name)) {
041 if (errors == null) {
042 errors = name;
043 } else {
044 errors += (" " + name);
045 }
046 }
047 }
048 this.namespace = namespace;
049 }
050
051 /**
052 * Checks trigger activation given an element name and its parent,
053 * both from the same namespace.
054 * @param ns The namespace for the elements.
055 * @param name The current element local name.
056 * @param parent The parent element local name.
057 * @return true if we should brake the section.
058 */
059 boolean trigger(String ns, String name, String parent) {
060 if ((ns==null && namespace==null) || (ns!=null && ns.equals(namespace))) {
061 if (elementNames.contains(name)) {
062 return (!elementNames.contains(parent));
063 }
064 }
065 return false;
066 }
067 }