// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= package com.adobe.xmp.impl.xpath; import java.util.ArrayList; import java.util.List; /** * Representates an XMP XMPPath with segment accessor methods. * * @since 28.02.2006 */ public class XMPPath { // Bits for XPathStepInfo options. /** Marks a struct field step , also for top level nodes (schema "fields"). */ public static final int STRUCT_FIELD_STEP = 0x01; /** Marks a qualifier step. * Note: Order is significant to separate struct/qual from array kinds! */ public static final int QUALIFIER_STEP = 0x02; // /** Marks an array index step */ public static final int ARRAY_INDEX_STEP = 0x03; /** */ public static final int ARRAY_LAST_STEP = 0x04; /** */ public static final int QUAL_SELECTOR_STEP = 0x05; /** */ public static final int FIELD_SELECTOR_STEP = 0x06; /** */ public static final int SCHEMA_NODE = 0x80000000; /** */ public static final int STEP_SCHEMA = 0; /** */ public static final int STEP_ROOT_PROP = 1; /** stores the segments of an XMPPath */ private List segments = new ArrayList(5); /** * Append a path segment * * @param segment the segment to add */ public void add(XMPPathSegment segment) { segments.add(segment); } /** * @param index the index of the segment to return * @return Returns a path segment. */ public XMPPathSegment getSegment(int index) { return (XMPPathSegment) segments.get(index); } /** * @return Returns the size of the xmp path. */ public int size() { return segments.size(); } /** * Serializes the normalized XMP-path. * @see Object#toString() */ public String toString() { StringBuffer result = new StringBuffer(); int index = 1; while (index < size()) { result.append(getSegment(index)); if (index < size() - 1) { int kind = getSegment(index + 1).getKind(); if (kind == STRUCT_FIELD_STEP || kind == QUALIFIER_STEP) { // all but last and array indices result.append('/'); } } index++; } return result.toString(); } }