1 /*
2 Copyright (c) 2011 James Ahlborn
3
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15 */
16
17 package com.healthmarketscience.jackcess.complex;
18
19 import java.io.IOException;
20 import java.io.ObjectStreamException;
21
22 import com.healthmarketscience.jackcess.Column;
23 import com.healthmarketscience.jackcess.RowId;
24 import com.healthmarketscience.jackcess.impl.complex.ComplexColumnInfoImpl;
25
26 /**
27 * Base interface for a value in a complex column (where there may be multiple
28 * values for a single row in the main table).
29 *
30 * @author James Ahlborn
31 */
32 public interface ComplexValue
33 {
34 /**
35 * Returns the unique identifier of this complex value (this value is unique
36 * among all values in all rows of the main table).
37 *
38 * @return the current id or {@link ComplexColumnInfoImpl#INVALID_ID} for a new,
39 * unsaved value.
40 */
41 public Id getId();
42
43 /**
44 * Called once when a new ComplexValue is saved to set the new unique
45 * identifier.
46 */
47 public void setId(Id newId);
48
49 /**
50 * Returns the foreign key identifier for this complex value (this value is
51 * the same for all values in the same row of the main table).
52 *
53 * @return the current id or {@link ComplexColumnInfoImpl#INVALID_FK}
54 * for a new, unsaved value.
55 */
56 public ComplexValueForeignKey getComplexValueForeignKey();
57
58 public void setComplexValueForeignKey(ComplexValueForeignKey complexValueFk);
59
60 /**
61 * @return the column in the main table with which this complex value is
62 * associated
63 */
64 public Column getColumn();
65
66 /**
67 * Writes any updated data for this complex value to the database.
68 */
69 public void update() throws IOException;
70
71 /**
72 * Deletes the data for this complex value from the database.
73 */
74 public void delete() throws IOException;
75
76
77 /**
78 * Identifier for a ComplexValue. Only valid for comparing complex values
79 * for the same column.
80 */
81 public abstract class Id extends Number
82 {
83 private static final long serialVersionUID = 20130318L;
84
85 @Override
86 public byte byteValue() {
87 return (byte)get();
88 }
89
90 @Override
91 public short shortValue() {
92 return (short)get();
93 }
94
95 @Override
96 public int intValue() {
97 return get();
98 }
99
100 @Override
101 public long longValue() {
102 return get();
103 }
104
105 @Override
106 public float floatValue() {
107 return get();
108 }
109
110 @Override
111 public double doubleValue() {
112 return get();
113 }
114
115 @Override
116 public int hashCode() {
117 return get();
118 }
119
120 @Override
121 public boolean equals(Object o) {
122 return ((this == o) ||
123 ((o != null) && (getClass() == o.getClass()) &&
124 (get() == ((Id)o).get())));
125 }
126
127 @Override
128 public String toString() {
129 return String.valueOf(get());
130 }
131
132 protected final Object writeReplace() throws ObjectStreamException {
133 // if we are going to serialize this ComplexValue.Id, convert it back to
134 // a normal Integer (in case it is restored outside of the context of
135 // jackcess)
136 return Integer.valueOf(get());
137 }
138
139 /**
140 * Returns the unique identifier of this complex value (this value is unique
141 * among all values in all rows of the main table for the complex column).
142 */
143 public abstract int get();
144
145 /**
146 * Returns the rowId of this ComplexValue within the secondary table.
147 */
148 public abstract RowId getRowId();
149 }
150 }