package gnu.xml.transform;
import javax.xml.namespace.QName;
import javax.xml.transform.TransformerException;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.Node;
import gnu.xml.xpath.Expr;
final class SortKey
{
static final int DEFAULT = 0;
static final int UPPER_FIRST = 1;
static final int LOWER_FIRST = 2;
final Expr select;
final TemplateNode langTemplate;
final TemplateNode dataTypeTemplate;
final TemplateNode orderTemplate;
final TemplateNode caseOrderTemplate;
transient String lang;
transient String dataType;
transient boolean descending;
transient int caseOrder;
SortKey(Expr select, TemplateNode lang, TemplateNode dataType,
TemplateNode order, TemplateNode caseOrder)
{
this.select = select;
this.langTemplate = lang;
this.dataTypeTemplate = dataType;
this.orderTemplate = order;
this.caseOrderTemplate = caseOrder;
}
String key(Node node)
{
Object ret = select.evaluate(node, 1, 1);
if (ret instanceof String)
{
return (String) ret;
}
else
{
return Expr._string(node, ret);
}
}
void init(Stylesheet stylesheet, QName mode,
Node context, int pos, int len,
Node parent, Node nextSibling)
throws TransformerException
{
Document doc = (context instanceof Document) ? (Document) context :
context.getOwnerDocument();
if (langTemplate == null)
{
lang = null;
}
else
{
DocumentFragment fragment = doc.createDocumentFragment();
langTemplate.apply(stylesheet, mode, context, pos, len,
fragment, null);
lang = Expr.stringValue(fragment);
}
if (dataTypeTemplate == null)
{
dataType = "text";
}
else
{
DocumentFragment fragment = doc.createDocumentFragment();
dataTypeTemplate.apply(stylesheet, mode, context, pos, len,
fragment, null);
dataType = Expr.stringValue(fragment);
}
if (orderTemplate == null)
{
descending = false;
}
else
{
DocumentFragment fragment = doc.createDocumentFragment();
orderTemplate.apply(stylesheet, mode, context, pos, len,
fragment, null);
String order = Expr.stringValue(fragment);
descending = "descending".equals(order);
}
if (caseOrderTemplate == null)
{
caseOrder = DEFAULT;
}
else
{
DocumentFragment fragment = doc.createDocumentFragment();
caseOrderTemplate.apply(stylesheet, mode, context, pos, len,
fragment, null);
String co = Expr.stringValue(fragment);
caseOrder = "upper-first".equals(co) ? UPPER_FIRST :
"lower-first".equals(co) ? LOWER_FIRST :
DEFAULT;
}
}
}