01: package org.garret.rdf;
02:
03: import java.util.*;
04: import org.garret.perst.*;
05:
06: /**
07: * Class representing object (collection of its verions)
08: */
09: public class VersionHistory extends Persistent {
10: /**
11: * Object URI
12: */
13: public String uri;
14:
15: /**
16: * Vector of object versions (the latest version is the last element of the vector)
17: */
18: public Link versions;
19:
20: /**
21: * Type of this object
22: */
23: public VersionHistory type;
24:
25: /**
26: * Get latest version in version history
27: */
28: public Thing getLatest() {
29: return (Thing) versions.get(versions.size() - 1);
30: }
31:
32: /**
33: * Get latest version in version history prior to the specified timestamp
34: *
35: * @param timestamp timestamp
36: * @return The latest version in version history prior to the specified timestamp
37: * or null if no such version is found
38: */
39: public Thing getLatestBefore(Date timestamp) {
40: for (int i = versions.size(); --i >= 0;) {
41: Thing v = (Thing) versions.get(i);
42: if (v.timestamp.compareTo(timestamp) <= 0) {
43: return v;
44: }
45: }
46: return null;
47: }
48:
49: /**
50: * Get oldest version in version history released after the specified timestamp
51: *
52: * @param timestamp timestamp
53: * @return The oldest version in version history released after the specified timestamp
54: */
55: public Thing getOldestAfter(Date timestamp) {
56: for (int i = 0; i < versions.size(); i++) {
57: Thing v = (Thing) versions.get(i);
58: if (v.timestamp.compareTo(timestamp) >= 0) {
59: return v;
60: }
61: }
62: return null;
63: }
64:
65: /**
66: * Get version correponding to the specified search kind and timestamp
67: *
68: * @param kind One of SearchKind.LAtestVersion, SearchKind.LatestBefore and SearchKind.OldestAfter
69: * @param timestamp
70: * @return Version natching time criteria or null if not found
71: */
72: public Thing getVersion(SearchKind kind, Date timestamp) {
73: if (kind == SearchKind.LatestVersion) {
74: return getLatest();
75: } else if (kind == SearchKind.LatestBefore) {
76: return getLatestBefore(timestamp);
77: } else if (kind == SearchKind.OldestAfter) {
78: return getOldestAfter(timestamp);
79: } else {
80: throw new IllegalArgumentException("Invalid search kind "
81: + kind + " for VersionHistory.GetVersion");
82: }
83: }
84: }
|