/*   Copyright 2004 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 xmlobject.extensions.interfaceFeature.averageCase.existing;



import interfaceFeature.xbean.averageCase.purchaseOrder.PurchaseOrderDocument ;
import interfaceFeature.xbean.averageCase.purchaseOrder.PurchaseOrderType;
import interfaceFeature.xbean.averageCase.purchaseOrder.Items.Item;
import org.apache.xmlbeans.XmlObject;

public class FooHandler
{
    public static int getTotal(XmlObject xo)
    {
	PurchaseOrderDocument poDoc= (PurchaseOrderDocument)xo;
	int sum=0;
	Item[] items=poDoc.getPurchaseOrder().getItems().getItemArray();

         for (int i=0; i<items.length; i++)
		sum+=items[i].getUSPrice().intValue();
	 return sum;
    }

    // The following methods are being added to test JIRA isssue XMLBEANS-206
    public static String getName(XmlObject xo, String s) {
        return "getName-1arg-" + s;
    }

    public static String getName(XmlObject xo, String s, int i) {
        return "getName-2arg-" + s + "-" + i;
    }


}