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}