blob: 4d551756c516c926e490a21a27844b7f21fbf92e [file] [log] [blame]
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 1999 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 "Xalan" 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.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation and was
* originally based on software copyright (c) 1999, Lotus
* Development Corporation., http://www.lotus.com. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.xalan.templates;
import java.io.Serializable;
//import org.w3c.dom.Node;
import javax.xml.transform.TransformerException;
import org.apache.xpath.XPath;
import org.apache.xpath.XPathContext;
import org.apache.xpath.patterns.StepPattern;
import org.apache.xml.utils.QName;
/**
* A class to contain a match pattern and it's corresponding template.
* This class also defines a node in a match pattern linked list.
*/
class TemplateSubPatternAssociation implements Serializable, Cloneable
{
/** Step pattern */
StepPattern m_stepPattern;
/** Template pattern */
private String m_pattern;
/** The template element */
private ElemTemplate m_template;
/** Next pattern */
private TemplateSubPatternAssociation m_next = null;
/** Flag indicating whether this is wild card pattern */
private boolean m_wild;
/** Target string for this match pattern */
private String m_targetString;
/**
* Construct a match pattern from a pattern and template.
* @param template The node that contains the template for this pattern.
* @param pattern An executable XSLT StepPattern.
* @param pat For now a Nodelist that contains old-style element patterns.
*/
TemplateSubPatternAssociation(ElemTemplate template, StepPattern pattern, String pat)
{
m_pattern = pat;
m_template = template;
m_stepPattern = pattern;
m_targetString = m_stepPattern.getTargetString();
m_wild = m_targetString.equals("*");
}
/**
* Clone this object.
*
* @return The cloned object.
*
* @throws CloneNotSupportedException
*/
public Object clone() throws CloneNotSupportedException
{
TemplateSubPatternAssociation tspa =
(TemplateSubPatternAssociation) super.clone();
tspa.m_next = null;
return tspa;
}
/**
* Get the target string of the pattern. For instance, if the pattern is
* "foo/baz/boo[@daba]", this string will be "boo".
*
* @return The "target" string.
*/
public final String getTargetString()
{
return m_targetString;
}
/**
* Set Target String for this template pattern
*
*
* @param key Target string to set
*/
public void setTargetString(String key)
{
m_targetString = key;
}
/**
* Tell if two modes match according to the rules of XSLT.
*
* @param m1 mode to match
*
* @return True if the given mode matches this template's mode
*/
boolean matchMode(QName m1)
{
return matchModes(m1, m_template.getMode());
}
/**
* Tell if two modes match according to the rules of XSLT.
*
* @param m1 First mode to match
* @param m2 Second mode to match
*
* @return True if the two given modes match
*/
private boolean matchModes(QName m1, QName m2)
{
return (((null == m1) && (null == m2))
|| ((null != m1) && (null != m2) && m1.equals(m2)));
}
/**
* Return the mode associated with the template.
*
*
* @param xctxt XPath context to use with this template
* @param targetNode Target node
* @param mode reference, which may be null, to the <a href="http://www.w3.org/TR/xslt#modes">current mode</a>.
* @return The mode associated with the template.
*
* @throws TransformerException
*/
public boolean matches(XPathContext xctxt, int targetNode, QName mode)
throws TransformerException
{
double score = m_stepPattern.getMatchScore(xctxt, targetNode);
return (XPath.MATCH_SCORE_NONE != score)
&& matchModes(mode, m_template.getMode());
}
/**
* Tell if the pattern for this association is a wildcard.
*
* @return true if this pattern is considered to be a wild match.
*/
public final boolean isWild()
{
return m_wild;
}
/**
* Get associated XSLT StepPattern.
*
* @return An executable StepPattern object, never null.
*
*/
public final StepPattern getStepPattern()
{
return m_stepPattern;
}
/**
* Get the pattern string for diagnostic purposes.
*
* @return The pattern string for diagnostic purposes.
*
*/
public final String getPattern()
{
return m_pattern;
}
/**
* Return the position of the template in document
* order in the stylesheet.
*
* @return The position of the template in the overall template order.
*/
public int getDocOrderPos()
{
return m_template.getUid();
}
/**
* Return the import level associated with the stylesheet into which
* this template is composed.
*
* @return The import level of this template.
*/
public final int getImportLevel()
{
return m_template.getStylesheetComposed().getImportCountComposed();
}
/**
* Get the assocated xsl:template.
*
* @return An ElemTemplate, never null.
*
*/
public final ElemTemplate getTemplate()
{
return m_template;
}
/**
* Get the next association.
*
* @return A valid TemplateSubPatternAssociation, or null.
*/
public final TemplateSubPatternAssociation getNext()
{
return m_next;
}
/**
* Set the next element on this association
* list, which should be equal or less in priority to
* this association, and, if equal priority, should occur
* before this template in document order.
*
* @param mp The next association to score if this one fails.
*
*/
public void setNext(TemplateSubPatternAssociation mp)
{
m_next = mp;
}
}