/* Milenia Grafter Server Copyright (c) 2007-2008 by Milan Toth. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package application; /** XmlParser class @mail milgra@milgra.com @author Milan Toth @version 20080316 Tasks of XmlParser - parse a simplified xml **/ import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.util.ArrayList; public class XmlParser { public ArrayList < String > nodes; public ArrayList < String > texts; /** * Creates a new ConfigReader instance, and loads the given file * @param fileNameX the xml's name */ public XmlParser ( String fileNameX ) { // System.out.println( System.currentTimeMillis() + " ConfigReader.construct " + fileNameX ); try { File file = new File( fileNameX ); FileReader fileReader = new FileReader( file ); BufferedReader reader = new BufferedReader( fileReader ); parseFile( reader ); } catch ( FileNotFoundException exception ) { exception.printStackTrace( ); } } /** * Parses the file * @param readerX BufferedReader */ public void parseFile ( BufferedReader readerX ) { // System.out.println( System.currentTimeMillis() + " ConfigReader.parseFile " + readerX ); texts = new ArrayList < String > ( ); nodes = new ArrayList < String > ( ); int code; String value = ""; try { do { code = readerX.read( ); switch ( code ) { // < // > case 60 : texts.add( value ); value = ""; break; case 62 : nodes.add( value ); value = ""; break; default : value += ( char ) code; break; } } while ( code != -1 ); } catch ( IOException exception ) { exception.printStackTrace( ); } texts.remove( 0 ); texts.add( null ); } /** * Returns the wanted node value * @param pathX path in xml * @param indexX index of the wanted node * @return String */ public String getValue ( String pathX , int indexX ) { // System.out.println( System.currentTimeMillis() + " ConfigReader.getValue " + pathX + " " + indexX ); int count = 0; int depth = 0; int index = 0; String [ ] parts = pathX.split( "\\." ); // going through nodes while ( count < nodes.size( ) ) { String node = nodes.get( count ); if ( node.equals( parts[depth ] ) ) { if ( depth == ( parts.length - 1 ) ) { if ( index == indexX ) return texts.get( count ); else ++index; } else ++depth; } ++count; } return null; } /** * Returns node count * @param pathX path in xml * @return count */ public int getCount ( String pathX ) { // System.out.println( System.currentTimeMillis() + " ConfigReader.getCount " + pathX ); int count = 0; int depth = 0; String [ ] parts = pathX.split( "\\." ); // going through nodes while ( count < nodes.size( ) ) { String node = nodes.get( count ); if ( node.equals( parts[depth ] ) ) { if ( depth == ( parts.length - 1 ) ) { return calculateCount( count ); } else ++depth; } ++count; } return 0; } /** * Calculates child count * @param indexX starting index * @return child count */ public int calculateCount ( int indexX ) { // System.out.println( System.currentTimeMillis() + " ConfigReader.calculateCount " + indexX ); int depth = 0; int count = indexX; int child = 0; do { String actNode = nodes.get( count ); if ( actNode.charAt( 0 ) == "/".charAt( 0 ) ) { --depth; } else if ( actNode.charAt( actNode.length() - 1 ) != "/".charAt( 0 ) ) { ++depth; ++child; } ++count; } while ( count < nodes.size( ) && depth > -1 ); return child; } }