/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2013 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * 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.pentaho.di.trans.steps.xmlinput; import java.util.List; import org.pentaho.di.core.Const; import org.pentaho.di.core.exception.KettleValueException; import org.pentaho.di.i18n.BaseMessages; public class XMLInputFieldPosition implements Cloneable { private static Class<?> PKG = XMLInputMeta.class; // for i18n purposes, needed by Translator2!! public static final int XML_ELEMENT = 1; public static final int XML_ATTRIBUTE = 2; public static final int XML_ROOT = 3; public static final String NR_MARKER = "/"; private String name; private int type; private int elementNr; /** * Create a new XML Input Field position. * * @param name * the name of the element or attribute * @param type * Element or Attribute (XML_ELEMENT, XML_ATTRIBUTE) */ public XMLInputFieldPosition( String name, int type ) { this.name = name; this.type = type; this.elementNr = 1; } /** * Create a new XML Input Field position. * * @param name * the name of the element or attribute * @param type * Element or Attribute (XML_ELEMENT, XML_ATTRIBUTE) * @param elementNr * the element number to pick. */ public XMLInputFieldPosition( String name, int type, int elementNr ) { this.name = name; this.type = type; this.elementNr = elementNr; } public String toString() { String enc = ""; switch ( type ) { case XML_ELEMENT: enc += "E"; break; case XML_ATTRIBUTE: enc += "A"; break; case XML_ROOT: enc += "R"; break; default: enc += "?"; break; } enc += "="; enc += name; enc += NR_MARKER + ( elementNr <= 0 ? 1 : elementNr ); return enc; } /** * Construnct a new XMLFieldPosition based on an a code: E=Elementame, A=Attributename * * @param encoded */ public XMLInputFieldPosition( String encoded ) throws KettleValueException { int equalIndex = encoded.indexOf( '=' ); if ( equalIndex < 0 ) { throw new KettleValueException( BaseMessages.getString( PKG, "XMLInputFieldPosition.Exception.InvalidXMLFieldPosition", encoded ) ); } String positionType = Const.trim( encoded.substring( 0, equalIndex ) ); String nameAndNumber = Const.trim( encoded.substring( equalIndex + 1 ) ); String positionName = nameAndNumber; // Is there an element number? int semiIndex = nameAndNumber.indexOf( NR_MARKER ); if ( semiIndex >= 0 ) { this.elementNr = Const.toInt( nameAndNumber.substring( semiIndex + 1 ), 1 ); // Unreadable: default to 1 positionName = nameAndNumber.substring( 0, semiIndex ); } else { this.elementNr = 1; } if ( positionType.equalsIgnoreCase( "E" ) ) { // Element this.type = XML_ELEMENT; this.name = positionName; } else if ( positionType.equalsIgnoreCase( "A" ) ) { // Attribute this.type = XML_ATTRIBUTE; this.name = positionName; } else if ( positionType.equalsIgnoreCase( "R" ) ) { // Root of the repeating element. There is only one this.type = XML_ROOT; this.name = positionName; } else { throw new KettleValueException( BaseMessages.getString( PKG, "XMLInputFieldPosition.Exception.WrongPositionType", positionType ) ); } // Get the element nr } /** * @return Returns the name. */ public String getName() { return name; } /** * @param name * The name to set. */ public void setName( String name ) { this.name = name; } /** * @return Returns the type. */ public int getType() { return type; } /** * @param type * The type to set. */ public void setType( int type ) { this.type = type; } public Object clone() { try { Object retval = super.clone(); return retval; } catch ( CloneNotSupportedException e ) { return null; } } /** * @return Returns the elementNr. */ public int getElementNr() { return elementNr; } /** * @param elementNr * The elementNr to set. */ public void setElementNr( int elementNr ) { this.elementNr = elementNr; } /** * Encode the path to an XML element or attribute * * @param path * An ArrayList of XMLInputFieldPosition * @return the path encoded */ public static final String encodePath( List<XMLInputFieldPosition> path ) { String encoded = ""; for ( int p = 0; p < path.size(); p++ ) { XMLInputFieldPosition pos = path.get( p ); String elementName = pos.toString(); if ( p > 0 ) { encoded += XMLInputField.POSITION_MARKER; } encoded += elementName; } return encoded; } }