1f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// ================================================================================================= 2f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// ADOBE SYSTEMS INCORPORATED 3f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// Copyright 2006 Adobe Systems Incorporated 4f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// All Rights Reserved 5f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// 6f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms 7f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// of the Adobe license agreement accompanying it. 8f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// ================================================================================================= 9f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 10f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingpackage com.adobe.xmp.impl.xpath; 11f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 12f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport java.util.ArrayList; 13f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport java.util.List; 14f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 15f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 16f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling/** 17f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Representates an XMP XMPPath with segment accessor methods. 18f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * 19f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @since 28.02.2006 20f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 21f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingpublic class XMPPath 22f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling{ 23f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling // Bits for XPathStepInfo options. 24f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 25f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** Marks a struct field step , also for top level nodes (schema "fields"). */ 26f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public static final int STRUCT_FIELD_STEP = 0x01; 27f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** Marks a qualifier step. 28f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Note: Order is significant to separate struct/qual from array kinds! */ 29f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public static final int QUALIFIER_STEP = 0x02; // 30f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** Marks an array index step */ 31f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public static final int ARRAY_INDEX_STEP = 0x03; 32f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** */ 33f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public static final int ARRAY_LAST_STEP = 0x04; 34f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** */ 35f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public static final int QUAL_SELECTOR_STEP = 0x05; 36f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** */ 37f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public static final int FIELD_SELECTOR_STEP = 0x06; 38f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** */ 39f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public static final int SCHEMA_NODE = 0x80000000; 40f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** */ 41f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public static final int STEP_SCHEMA = 0; 42f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** */ 43f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public static final int STEP_ROOT_PROP = 1; 44f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 45f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 46f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** stores the segments of an XMPPath */ 47f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling private List segments = new ArrayList(5); 48f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 49f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 50f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 51f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Append a path segment 52f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * 53f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param segment the segment to add 54f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 55f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public void add(XMPPathSegment segment) 56f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 57f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling segments.add(segment); 58f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 59f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 60f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 61f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 62f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @param index the index of the segment to return 63f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns a path segment. 64f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 65f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public XMPPathSegment getSegment(int index) 66f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 67f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return (XMPPathSegment) segments.get(index); 68f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 69f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 70f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 71f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 72f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @return Returns the size of the xmp path. 73f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 74f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public int size() 75f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 76f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return segments.size(); 77f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 78f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 79f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 80f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling /** 81f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * Serializes the normalized XMP-path. 82f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @see Object#toString() 83f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */ 84f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling public String toString() 85f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 86f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling StringBuffer result = new StringBuffer(); 87f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling int index = 1; 88f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling while (index < size()) 89f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 90f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling result.append(getSegment(index)); 91f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (index < size() - 1) 92f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 93f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling int kind = getSegment(index + 1).getKind(); 94f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling if (kind == STRUCT_FIELD_STEP || 95f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling kind == QUALIFIER_STEP) 96f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling { 97f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling // all but last and array indices 98f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling result.append('/'); 99f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 100f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 101f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling index++; 102f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 103f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling 104f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling return result.toString(); 105f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling } 106f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling}