/* | 
|
 * reserved comment block | 
|
 * DO NOT REMOVE OR ALTER! | 
|
*/  | 
|
/** | 
|
 * Licensed to the Apache Software Foundation (ASF) under one | 
|
 * or more contributor license agreements. See the NOTICE file | 
|
 * distributed with this work for additional information | 
|
 * regarding copyright ownership. The ASF licenses this file | 
|
 * to you under the Apache License, Version 2.0 (the | 
|
 * "License"); you may not use this file except in compliance | 
|
 * with the License. You may obtain a copy of the License at | 
|
 * | 
|
 * http://www.apache.org/licenses/LICENSE-2.0 | 
|
 * | 
|
 * Unless required by applicable law or agreed to in writing, | 
|
 * software distributed under the License is distributed on an | 
|
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|
 * KIND, either express or implied. See the License for the | 
|
 * specific language governing permissions and limitations | 
|
 * under the License. | 
|
*/  | 
|
package com.sun.org.apache.xml.internal.security.c14n.helper;  | 
|
import com.sun.org.apache.xml.internal.security.utils.Constants;  | 
|
import org.w3c.dom.Attr;  | 
|
import java.io.Serializable;  | 
|
import java.util.Comparator;  | 
|
/** | 
|
 * Compares two attributes based on the C14n specification. | 
|
 * | 
|
 * <UL> | 
|
 * <LI>Namespace nodes have a lesser document order position than attribute | 
|
 *   nodes. | 
|
 * <LI> An element's namespace nodes are sorted lexicographically by | 
|
 *   local name (the default namespace node, if one exists, has no | 
|
 *   local name and is therefore lexicographically least). | 
|
 * <LI> An element's attribute nodes are sorted lexicographically with | 
|
 *   namespace URI as the primary key and local name as the secondary | 
|
 *   key (an empty namespace URI is lexicographically least). | 
|
 * </UL> | 
|
 * | 
|
*/  | 
|
public class AttrCompare implements Comparator<Attr>, Serializable {  | 
|
private static final long serialVersionUID = -7113259629930576230L;  | 
|
private static final int ATTR0_BEFORE_ATTR1 = -1;  | 
|
private static final int ATTR1_BEFORE_ATTR0 = 1;  | 
|
private static final String XMLNS = Constants.NamespaceSpecNS;  | 
|
    /** | 
|
     * Compares two attributes based on the C14n specification. | 
|
     * | 
|
     * <UL> | 
|
     * <LI>Namespace nodes have a lesser document order position than | 
|
     *   attribute nodes. | 
|
     * <LI> An element's namespace nodes are sorted lexicographically by | 
|
     *   local name (the default namespace node, if one exists, has no | 
|
     *   local name and is therefore lexicographically least). | 
|
     * <LI> An element's attribute nodes are sorted lexicographically with | 
|
     *   namespace URI as the primary key and local name as the secondary | 
|
     *   key (an empty namespace URI is lexicographically least). | 
|
     * </UL> | 
|
     * | 
|
     * @param attr0 | 
|
     * @param attr1 | 
|
     * @return returns a negative integer, zero, or a positive integer as | 
|
     *   obj0 is less than, equal to, or greater than obj1 | 
|
     * | 
|
*/  | 
|
    public int compare(Attr attr0, Attr attr1) { | 
|
String namespaceURI0 = attr0.getNamespaceURI();  | 
|
String namespaceURI1 = attr1.getNamespaceURI();  | 
|
boolean isNamespaceAttr0 = XMLNS.equals(namespaceURI0);  | 
|
boolean isNamespaceAttr1 = XMLNS.equals(namespaceURI1);  | 
|
if (isNamespaceAttr0) {  | 
|
if (isNamespaceAttr1) {  | 
|
                // both are namespaces | 
|
String localname0 = attr0.getLocalName();  | 
|
String localname1 = attr1.getLocalName();  | 
|
if ("xmlns".equals(localname0)) {  | 
|
localname0 = "";  | 
|
}  | 
|
if ("xmlns".equals(localname1)) {  | 
|
localname1 = "";  | 
|
}  | 
|
return localname0.compareTo(localname1);  | 
|
}  | 
|
            // attr0 is a namespace, attr1 is not | 
|
return ATTR0_BEFORE_ATTR1;  | 
|
} else if (isNamespaceAttr1) {  | 
|
            // attr1 is a namespace, attr0 is not | 
|
return ATTR1_BEFORE_ATTR0;  | 
|
}  | 
|
        // none is a namespace | 
|
if (namespaceURI0 == null) {  | 
|
if (namespaceURI1 == null) {  | 
|
String name0 = attr0.getName();  | 
|
String name1 = attr1.getName();  | 
|
return name0.compareTo(name1);  | 
|
}  | 
|
return ATTR0_BEFORE_ATTR1;  | 
|
} else if (namespaceURI1 == null) {  | 
|
return ATTR1_BEFORE_ATTR0;  | 
|
}  | 
|
int a = namespaceURI0.compareTo(namespaceURI1);  | 
|
if (a != 0) {  | 
|
return a;  | 
|
}  | 
|
return attr0.getLocalName().compareTo(attr1.getLocalName());  | 
|
}  | 
|
}  |