/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 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 acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Xerces" 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 name, without prior written
* permission of the Apache Software Foundation.
*
* 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.
* ====================================================================
*
*/
package com.sun.org.apache.xerces.internal.impl.xs.models;
import com.sun.org.apache.xerces.internal.impl.Constants;
import com.sun.org.apache.xerces.internal.impl.XMLErrorReporter;
import com.sun.org.apache.xerces.internal.impl.dtd.models.CMNode;
import com.sun.org.apache.xerces.internal.xni.parser.XMLComponentManager;
/**
* <p>Creates nodes.</p>
*
* @author Neeraj Bajaj
* @version $Revision: 1.2 $, $Date: 2004/01/22 20:36:54 $
*/
public class CMNodeFactory {
/**
* Property identifier: error reporter.
*/
private static final String ERROR_REPORTER =
Constants.XERCES_PROPERTY_PREFIX + Constants.ERROR_REPORTER_PROPERTY;
/**
* <p>Output extra debugging messages to {@link System.err}.</p>
*/
private static final boolean DEBUG = false;
/**
* <p>Count of number of nodes created.</p>
*/
private int nodeCount = 0;
/**
* Error reporter. This property identifier is:
* http://apache.org/xml/properties/internal/error-reporter
*/
private XMLErrorReporter fErrorReporter = null;
/**
* Default constructor.
*/
public CMNodeFactory() {
if (DEBUG) {
System.err.println("CMNodeFactory()");
}
}
/**
* <p>Reset internal state using <code>componentManager</code> provided values.</p>
*
* @param componentManager {@link XMLComponentManager} to provide new values for internal state.
*/
public void reset(XMLComponentManager componentManager) {
if (DEBUG) {
System.err.println("CMNodeFactory#reset("
+ "componentManager[" + componentManager.toString() + "])");
}
// error reporter
fErrorReporter = (XMLErrorReporter) componentManager.getProperty(ERROR_REPORTER);
} //reset()
/**
* <p>Create a new leaf node as defined by the params.</p>
*
* @param type Type of leaf node to return.
* @param leaf Leaf <code>Object</code>
* @param id ID of leaf to return.
* @param position Position of leaf to return.
*
* @return New node as defined by the params.
*/
public CMNode getCMLeafNode(int type, Object leaf, int id, int position) {
// this is a new node
nodeCount++;
if (DEBUG) {
System.err.println("CMNodeFactory#getCMLeafNode("
+ "type[" + type + "], "
+ "leaf[" + leaf.toString() + "], "
+ "id[" + id + "], "
+ "position[" + position + "])\n"
+ "\tnodeCount=" + nodeCount);
}
// create new node as defined by the params
return new XSCMLeaf(type, leaf, id, position);
}
/**
* <p>Create a leaf node as defined by the params.</p>
*
* @param type Type of node to create.
* @param childNode Child node.
*
* @return New node as defined by the params.
*/
public CMNode getCMUniOpNode(int type, CMNode childNode) {
// this is a new node
nodeCount++;
if (DEBUG) {
System.err.println("CMNodeFactory#getCMUniOpNode("
+ "type[" + type + "], "
+ "childNode[" + childNode.toString() + "])\n"
+ "\tnodeCount=" + nodeCount);
}
// create new node as defined by the params
return new XSCMUniOp(type, childNode);
}
/**
* <p>Create a leaf node as defined by the params.</p>
*
* @param type Type of node to create.
* @param leftNode Left node.
* @param rightNode Right node.
*
* @return New node as defined by the params.
*/
public CMNode getCMBinOpNode(int type, CMNode leftNode, CMNode rightNode) {
// this is a new node
nodeCount++;
if (DEBUG) {
System.err.println("CMNodeFactory#getCMBinOpNode("
+ "type[" + type + "], "
+ "leftNode[" + leftNode.toString() + "], "
+ "rightNode[" + rightNode.toString() + "])\n"
+ "\tnodeCount=" + nodeCount);
}
// create new node as defined by the params
return new XSCMBinOp(type, leftNode, rightNode);
}
/**
* <p>Reset the internal node count to 0.</p>
*/
public void resetNodeCount() {
nodeCount = 0;
if (DEBUG) {
System.err.println("CMNodeFactory#resetNodeCount: "
+ "nodeCount=" + nodeCount + " (after reset)");
}
}
/**
* <p>Sets the value of a property. This method is called by the component
* manager any time after reset when a property changes value.</p>
*
* <p> <strong>Note:</strong> Components should silently ignore properties
* that do not affect the operation of the component.</p>
*
* @param propertyId The property identifier.
* @param value The value of the property.
*/
public void setProperty(String propertyId, Object value) {
if (DEBUG) {
System.err.println("CMNodeFactory#setProperty("
+ "propertyId[" + propertyId + "], "
+ "value[" + value.toString() + "])");
}
// Xerces properties?
if (propertyId.startsWith(Constants.XERCES_PROPERTY_PREFIX)) {
String property = propertyId.substring(Constants.XERCES_PROPERTY_PREFIX.length());
// error reporter?
if (property.equals(Constants.ERROR_REPORTER_PROPERTY)) {
fErrorReporter = (XMLErrorReporter) value;
return;
}
// silently ignore unknown Xerces property
return;
} else {
// silently ignore unknown non-Xerces property
return;
}
} // setProperty(String,Object)
} // CMNodeFactory()
|