| /* 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 org.apache.xmlbeans.samples.cursor; |
| |
| import statement.StatementDocument; |
| import statement.StatementDocument.Statement; |
| import statement.Transaction; |
| import java.io.File; |
| |
| import org.apache.xmlbeans.XmlCursor; |
| |
| import javax.xml.namespace.QName; |
| |
| public class OrderMatters |
| { |
| private static QName deposit = new QName( "http://statement", "deposit" ); |
| |
| public static void main ( String[] args ) throws Exception |
| { |
| // load the xml instance into the store and return a |
| // strongly typed instance of StatementDocument |
| StatementDocument stmtDoc = StatementDocument.Factory.parse( new File( args[ 0 ] ) ); |
| |
| System.out.println( "Valid statement instance? " + stmtDoc.validate() ); |
| |
| float balance = balanceOutOfOrder(stmtDoc); |
| |
| System.out.println( "Ending balance: $" + balance ); |
| |
| balance = balanceInOrder(stmtDoc); |
| |
| System.out.println( "Ending balance: $" + balance ); |
| } |
| |
| /** |
| * Out of order balance: the ease of stronly-typed XmlObjects! |
| */ |
| public static float balanceOutOfOrder(StatementDocument stmtDoc) |
| { |
| Statement stmt = stmtDoc.getStatement(); |
| |
| float balance = 0; |
| |
| Transaction[] deposits = stmt.getDepositArray(); |
| Transaction[] withdrawals = stmt.getWithdrawalArray(); |
| |
| for ( int i = 0 ; i < deposits.length ; i++ ) |
| balance += deposits[ i ].getAmount(); |
| |
| for ( int i = 0 ; i < withdrawals.length ; i++ ) |
| balance -= withdrawals[ i ].getAmount(); |
| |
| return balance; |
| } |
| |
| /** |
| * In order balance: the power of XmlCursor! |
| */ |
| public static float balanceInOrder(StatementDocument stmtDoc) |
| { |
| float balance = 0; |
| |
| XmlCursor cursor = stmtDoc.newCursor(); |
| |
| // use xpath to select elements |
| cursor.selectPath( "*/*" ); |
| |
| // iterate over the selection |
| while ( cursor.toNextSelection() ) |
| { |
| // two views of the same data: |
| // move back and forth between XmlObject <-> XmlCursor |
| Transaction trans = (Transaction) cursor.getObject(); |
| |
| float amount = trans.getAmount(); |
| |
| if (cursor.getName().equals( deposit )) |
| balance += amount; |
| else if ((balance -= amount) < 0) |
| { |
| // doh! |
| System.out.println( "Negative balance: $" + balance ); |
| balance -= 50; |
| } |
| } |
| |
| return balance; |
| } |
| |
| } |