/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000-2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "Ant" and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
*
Basically this prints the XML declaration, defines some * entities and the project element.
*/ private void printHead(PrintWriter out, Enumeration tasks, Enumeration types) { out.println(""); out.println(""); out.print(""); out.print(""); out.println(""); out.print(""); out.println(""); out.println(""); } /** * Prints the definition for the target element. */ private void printTargetDecl(PrintWriter out) { out.print(""); out.println(""); out.println(""); out.println(""); } /** * Print the definition for a given element. */ private void printElementDecl(PrintWriter out, String name, Class element) throws BuildException { if (visited.containsKey(name)) { return; } visited.put(name, ""); IntrospectionHelper ih = null; try { ih = IntrospectionHelper.getHelper(element); } catch (Throwable t) { /* * XXX - failed to load the class properly. * * should we print a warning here? */ return; } StringBuffer sb = new StringBuffer("").append(lSep); sb.append("").append(lSep); out.println(sb); return; } Vector v = new Vector(); if (ih.supportsCharacters()) { v.addElement("#PCDATA"); } if (TaskContainer.class.isAssignableFrom(element)) { v.addElement(TASKS); } Enumeration enum = ih.getNestedElements(); while (enum.hasMoreElements()) { v.addElement(enum.nextElement()); } if (v.isEmpty()) { sb.append("EMPTY"); } else { sb.append("("); final int count = v.size(); for (int i = 0; i < count; i++) { if (i != 0) { sb.append(" | "); } sb.append(v.elementAt(i)); } sb.append(")"); if (count > 1 || !v.elementAt(0).equals("#PCDATA")) { sb.append("*"); } } sb.append(">"); out.println(sb); sb = new StringBuffer("").append(lSep); out.println(sb); final int count = v.size(); for (int i = 0; i < count; i++) { String nestedName = (String) v.elementAt(i); if (!"#PCDATA".equals(nestedName) && !TASKS.equals(nestedName) && !TYPES.equals(nestedName)) { printElementDecl(out, nestedName, ih.getElementType(nestedName)); } } } /** * Does this String match the XML-NMTOKEN production? */ protected boolean isNmtoken(String s) { final int length = s.length(); for (int i = 0; i < length; i++) { char c = s.charAt(i); // XXX - we are ommitting CombiningChar and Extender here if (!Character.isLetterOrDigit(c) && c != '.' && c != '-' && c != '_' && c != ':') { return false; } } return true; } /** * Do the Strings all match the XML-NMTOKEN production? * *Otherwise they are not suitable as an enumerated attribute, * for example.
*/ protected boolean areNmtokens(String[] s) { for (int i = 0; i < s.length; i++) { if (!isNmtoken(s[i])) { return false; } } return true; } }