--- /dev/null
+package tim.prune.jpeg.drew;\r
+\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+\r
+/**\r
+ * Class to hold a collection of Jpeg data segments\r
+ * Each marker represents a list of multiple byte arrays\r
+ * Based on Drew Noakes' Metadata extractor at http://drewnoakes.com\r
+ */\r
+public class JpegSegmentData\r
+{\r
+ /** A map of byte[], keyed by the segment marker */\r
+ private final HashMap<Byte, List<byte[]>> _segmentDataMap = new HashMap<Byte, List<byte[]>>(10);\r
+\r
+\r
+ /**\r
+ * Add a segment to the collection\r
+ * @param inSegmentMarker marker byte\r
+ * @param inSegmentBytes data of segment\r
+ */\r
+ public void addSegment(byte inSegmentMarker, byte[] inSegmentBytes)\r
+ {\r
+ List<byte[]> segmentList = getOrCreateSegmentList(inSegmentMarker);\r
+ segmentList.add(inSegmentBytes);\r
+ }\r
+\r
+\r
+ /**\r
+ * Get the first segment with the given marker\r
+ * @param inSegmentMarker marker byte\r
+ * @return first segment with that marker\r
+ */\r
+ public byte[] getSegment(byte inSegmentMarker)\r
+ {\r
+ return getSegment(inSegmentMarker, 0);\r
+ }\r
+\r
+\r
+ /**\r
+ * Get the nth segment with the given marker\r
+ * @param inSegmentMarker marker byte\r
+ * @param inOccurrence occurrence to get, starting at 0\r
+ * @return byte array from specified segment\r
+ */\r
+ public byte[] getSegment(byte inSegmentMarker, int inOccurrence)\r
+ {\r
+ final List<byte[]> segmentList = getSegmentList(inSegmentMarker);\r
+\r
+ if (segmentList==null || segmentList.size()<=inOccurrence)\r
+ return null;\r
+ else\r
+ return segmentList.get(inOccurrence);\r
+ }\r
+\r
+\r
+ /**\r
+ * Get the number of segments with the given marker\r
+ * @param inSegmentMarker marker byte\r
+ * @return number of segments\r
+ */\r
+ public int getSegmentCount(byte inSegmentMarker)\r
+ {\r
+ final List<byte[]> segmentList = getSegmentList(inSegmentMarker);\r
+ if (segmentList == null)\r
+ return 0;\r
+ else\r
+ return segmentList.size();\r
+ }\r
+\r
+\r
+ /**\r
+ * Get the list of segments with the given marker\r
+ * @param inSegmentMarker marker byte\r
+ * @return list of segments\r
+ */\r
+ private List<byte[]> getSegmentList(byte inSegmentMarker)\r
+ {\r
+ return _segmentDataMap.get(Byte.valueOf(inSegmentMarker));\r
+ }\r
+\r
+\r
+ /**\r
+ * Get the specified segment if it exists, otherwise create new one\r
+ * @param inSegmentMarker marker byte\r
+ * @return list of segments\r
+ */\r
+ private List<byte[]> getOrCreateSegmentList(byte inSegmentMarker)\r
+ {\r
+ List<byte[]> segmentList = null;\r
+ Byte key = Byte.valueOf(inSegmentMarker);\r
+ if (_segmentDataMap.containsKey(key))\r
+ {\r
+ // list already exists\r
+ segmentList = _segmentDataMap.get(key);\r
+ }\r
+ else\r
+ {\r
+ // create new list and add it\r
+ segmentList = new ArrayList<byte[]>();\r
+ _segmentDataMap.put(key, segmentList);\r
+ }\r
+ return segmentList;\r
+ }\r
+}\r