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