This project has retired. For details please refer to its Attic page.
TModelInstanceDetailsComparator.java

TModelInstanceDetailsComparator.java

/*
 * Copyright 2013 The Apache Software Foundation.
 *
 * Licensed 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 org.apache.juddi.v3.client.compare;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeConstants;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.Duration;
import javax.xml.datatype.XMLGregorianCalendar;
import org.uddi.api_v3.InstanceDetails;
import org.uddi.api_v3.TModelInstanceDetails;

/**
 * Compares two UDDI TModelInstanceDetails, searching for a specific tModel key,
 * then parsing to the selected data type, then comparing.
 *
 * @author Alex O'Ree
 */
public class TModelInstanceDetailsComparator {

    /**
     *
     * @param TModelKey for TModelInstanceInfo to use for comparison
     * @param number if true, the InstanceDetails.InstanceParms will be treated
     * like a number
     * @param XMLdate if true, the InstanceDetails.InstanceParms will be treated
     * like a XML Date
     * @param XMLduration if true, the InstanceDetails.InstanceParms will be
     * treated like a XML Gregorian Calendar
     * @see Duration
     * @see XMLGregorianCalendar
     * @throws DatatypeConfigurationException
     */
    public TModelInstanceDetailsComparator(String TModelKey, boolean number, boolean XMLdate, boolean XMLduration) throws DatatypeConfigurationException, IllegalArgumentException {
        if (TModelKey == null || TModelKey.length() == 0) {
            throw new IllegalArgumentException();
        }
        compareField = TModelKey;
        if (!number && !XMLdate && !XMLduration) {
            throw new IllegalArgumentException("only one data type can be selected");
        }
        if (number && XMLdate && !XMLduration) {
            throw new IllegalArgumentException("only one data type can be selected");
        }
        if (number && !XMLdate && XMLduration) {
            throw new IllegalArgumentException("only one data type can be selected");
        }
        if (!number && XMLdate && XMLduration) {
            throw new IllegalArgumentException("only one data type can be selected");
        }
        if (number && XMLdate && XMLduration) {
            throw new IllegalArgumentException("only one data type can be selected");
        }
        fac = DatatypeFactory.newInstance();
        isNumber = number;
        isDate = XMLdate;
        isDuration = XMLduration;
    }
    DatatypeFactory fac = null;
    String compareField = null;
    boolean isNumber = false;
    boolean isDate = false;
    boolean isDuration = false;

    /**
     * Compares two non-null instances of TModelInstanceDetails by only
     * comparing the field designated from the constructor. It will also cast or
     * parse TModelInstanceDetails[i].InstanceDetails[k].InstanceParms to the
     * selected data type double, XMLGregorgian or Duration, using that as a
     * basis for comparison. If a parsing error occurs, an exception will be
     * thrown.
     *
     * @param lhs
     * @param rhs
     * @return less than 0 if lhs < rhs, greater than 0 if lhs > rhs.
     * @throws IllegalArgumentException if the tModel key to search for is
     * missing, if either sides are null
     * @throws ArrayIndexOutOfBoundsException if the values were found but could
     * not be compared
     */
    public int compare(TModelInstanceDetails lhs, TModelInstanceDetails rhs) throws IllegalArgumentException, NumberFormatException, NullPointerException, ArrayIndexOutOfBoundsException {
        if (lhs == null) {
            throw new IllegalArgumentException("lhs");
        }
        if (rhs == null) {
            throw new IllegalArgumentException("rhs");
        }
        if (lhs.getTModelInstanceInfo().isEmpty() || rhs.getTModelInstanceInfo().isEmpty()) {
            throw new IllegalArgumentException("no data to compare");
        }
        InstanceDetails lhsc = null;
        InstanceDetails rhsc = null;
        for (int i = 0; i < lhs.getTModelInstanceInfo().size(); i++) {
            if (lhs.getTModelInstanceInfo().get(i).getTModelKey().equalsIgnoreCase(compareField)) {
                lhsc = lhs.getTModelInstanceInfo().get(i).getInstanceDetails();
            }
        }
        for (int i = 0; i < rhs.getTModelInstanceInfo().size(); i++) {
            if (rhs.getTModelInstanceInfo().get(i).getTModelKey().equalsIgnoreCase(compareField)) {
                rhsc = rhs.getTModelInstanceInfo().get(i).getInstanceDetails();
            }
        }

        if (lhsc == null) {
            throw new IllegalArgumentException(compareField + " not found for lhs");
        }
        if (rhsc == null) {
            throw new IllegalArgumentException(compareField + " not found for rhs");
        }
        if (lhsc.getInstanceParms() == null) {
            throw new IllegalArgumentException(compareField + " found lhs, but no data");
        }
        if (rhsc.getInstanceParms() == null) {
            throw new IllegalArgumentException(compareField + " found rhs, but no data");
        }
        if (isNumber) {
            Double l = Double.parseDouble(lhsc.getInstanceParms());
            Double r = Double.parseDouble(rhsc.getInstanceParms());
            return l.compareTo(r);
        }

        if (isDate) {
            XMLGregorianCalendar l = fac.newXMLGregorianCalendar(lhsc.getInstanceParms());
            XMLGregorianCalendar r = fac.newXMLGregorianCalendar(rhsc.getInstanceParms());
            //System.out.println(l.toXMLFormat() + " " + r.toXMLFormat());
            int x = l.compare(r);

            if (x == DatatypeConstants.LESSER) {
                return -1;
            }

            if (x == DatatypeConstants.GREATER) {
                return 1;
            }
            if (x == DatatypeConstants.EQUAL) {
                return 0;
            }
            throw new ArrayIndexOutOfBoundsException("cannot compare, result was " + x);
        }

        if (isDuration) {
            Duration l = fac.newDuration(lhsc.getInstanceParms());
            Duration r = fac.newDuration(rhsc.getInstanceParms());
          //  System.out.println(l.toString() + " " + r.toString());
            int x = l.compare(r);

            if (x == DatatypeConstants.LESSER) {
                return -1;
            }

            if (x == DatatypeConstants.GREATER) {
                return 1;
            }
            if (x == DatatypeConstants.EQUAL) {
                return 0;
            }
            throw new ArrayIndexOutOfBoundsException("cannot compare, result was " + x);
        }

        return 0;
    }
}