View Javadoc
1   package de.fhdw.wtf.persistence.facade;
2   
3   import java.util.Collection;
4   import java.util.List;
5   
6   import de.fhdw.wtf.persistence.exception.ClassFacadeUninitializedException;
7   import de.fhdw.wtf.persistence.exception.DuplicateUserTypeException;
8   import de.fhdw.wtf.persistence.exception.PersistenceException;
9   import de.fhdw.wtf.persistence.meta.Association;
10  import de.fhdw.wtf.persistence.meta.MapAssociation;
11  import de.fhdw.wtf.persistence.meta.Type;
12  import de.fhdw.wtf.persistence.meta.UnidirectionalAssociation;
13  import de.fhdw.wtf.persistence.meta.UserType;
14  
15  /**
16   * A facade to access objects in the database which represent types and associations.
17   * 
18   */
19  public interface ClassFacade {
20  	
21  	/**
22  	 * Constructor for a new User Type.
23  	 * 
24  	 * @param name
25  	 *            The name of the {@link de.fhdw.wtf.persistence.meta.UserType User Type}.
26  	 * @param abs
27  	 *            A boolean flag indicating whether this {@link de.fhdw.wtf.persistence.meta.UserType User Type} is
28  	 *            abstract or not
29  	 * @param transaction
30  	 *            A boolean flag indicating whether this {@link de.fhdw.wtf.persistence.meta.UserType User Type} is also
31  	 *            an Transaction or not.
32  	 * @return Provides a new {@link de.fhdw.wtf.persistence.meta.UserType} with the given attributes and the next
33  	 *         possible id.
34  	 * @throws PersistenceException
35  	 *             A persistence Exception is thrown if any Error contacting the database occurs.
36  	 * @throws DuplicateUserTypeException
37  	 *             can be thrown if the attempt is made to create an {@link de.fhdw.wtf.persistence.meta.UserType} with
38  	 *             an already existing name.
39  	 */
40  	UserType createUserType(String name, boolean abs, boolean transaction) throws PersistenceException,
41  			DuplicateUserTypeException;
42  	
43  	/**
44  	 * Constructor for a new {@link de.fhdw.wtf.persistence.meta.UnidirectionalAssociation}.
45  	 * 
46  	 * @param name
47  	 *            The name of the new {@link de.fhdw.wtf.persistence.meta.UnidirectionalAssociation}.
48  	 * @param essential
49  	 *            A boolean flag indicating whether there is an existing object necessary.
50  	 * @param unique
51  	 *            A boolean flag indicating whether the association is set-valued.
52  	 * @param owner
53  	 *            The owning side of the {@link de.fhdw.wtf.persistence.meta.UnidirectionalAssociation}
54  	 * @param target
55  	 *            The targeting side of the {@link de.fhdw.wtf.persistence.meta.UnidirectionalAssociation}.
56  	 * @return Provides a new {@link de.fhdw.wtf.persistence.meta.UnidirectionalAssociation} with the given attributes
57  	 *         and the next possible ID.
58  	 * @throws PersistenceException
59  	 *             A {@link de.fhdw.wtf.persistence.exception.PersistenceException persistence exception} is thrown if
60  	 *             any error contacting the database occurs.
61  	 */
62  	UnidirectionalAssociation createUnidirectionalAssociation(String name,
63  			boolean essential,
64  			boolean unique,
65  			UserType owner,
66  			Type target) throws PersistenceException;
67  	
68  	/**
69  	 * Constructor for a new MapAssociation.
70  	 * 
71  	 * @param name
72  	 *            The name of the new MapAssociation.
73  	 * @param essential
74  	 *            A boolean flag indicating whether there is an existing object necessary.
75  	 * @param owner
76  	 *            The owner side of the MapAssociation.
77  	 * @param target
78  	 *            The targeting side of the MapAssociation.
79  	 * @param keyType
80  	 *            The map-key type of the MapAssociation, when the MapAssociation is a map.
81  	 * @return Provides a new MapAssociation with the given attributes and the next possible ID.
82  	 * @throws PersistenceException
83  	 *             A persistence Exception is thrown if any Error contacting the database occurs.
84  	 */
85  	MapAssociation createMapAssociation(String name, boolean essential, UserType owner, Type target, Type keyType)
86  			throws PersistenceException;
87  	
88  	/**
89  	 * Creates a specialization-relationship between two user types.
90  	 * 
91  	 * @param ancestor
92  	 *            The Ancestor which means the super type in the specialization
93  	 * @param descendant
94  	 *            The descendant which means the sub type in the specialization
95  	 * @throws PersistenceException
96  	 *             A persistence Exception is thrown if any Error contacting the database occurs.
97  	 */
98  	void createSpecializationBetween(UserType ancestor, Type descendant) throws PersistenceException;
99  	
100 	/**
101 	 * Checks if one Type is Superior to another.
102 	 * 
103 	 * @param ancestor
104 	 *            The given super type.
105 	 * @param descendant
106 	 *            The given sub type.
107 	 * @return Provides true if the ancestor is a supertype to descendant.
108 	 * @throws PersistenceException
109 	 *             A persistence Exception is thrown if any Error contacting the database occurs.
110 	 */
111 	boolean isSuperClassTo(Type ancestor, Type descendant) throws PersistenceException;
112 	
113 	/**
114 	 * When creating specializations, they will be stored in a normalized manner inside the database, which means that
115 	 * the Facade can only determine if direct specializations exist. Reflexive and transitive Specializations could not
116 	 * be detected. This Method creates the reflexive, transitive closure.
117 	 * 
118 	 * @throws PersistenceException
119 	 *             A persistence Exception is thrown if any Error contacting the database occurs.
120 	 */
121 	void finalizeSpecialization() throws PersistenceException;
122 	
123 	/**
124 	 * Attention !!! This Method deletes every Type, UnidirectionalAssociation an specialization in the database. This
125 	 * means it should be used very carefully.
126 	 * 
127 	 * @throws PersistenceException
128 	 *             A persistence Exception is thrown if any Error contacting the database occurs.
129 	 */
130 	void clear() throws PersistenceException;
131 	
132 	/**
133 	 * Renaming the given Type discarding the old name.
134 	 * 
135 	 * @param typeId
136 	 *            the id of the Type which should renamed
137 	 * @param newName
138 	 *            the new name of the type
139 	 * @throws PersistenceException
140 	 *             A persistence Exception is thrown if any Error contacting the database occurs.
141 	 */
142 	void renameType(Long typeId, String newName) throws PersistenceException;
143 	
144 	/**
145 	 * Renaming the given Association discarding the old name.
146 	 * 
147 	 * @param assoId
148 	 *            the id of the Association which should renamed
149 	 * @param newName
150 	 *            the new name of the association
151 	 * @throws PersistenceException
152 	 *             A persistence Exception is thrown if any Error contacting the database occurs.
153 	 */
154 	void renameAssociation(Long assoId, String newName) throws PersistenceException;
155 	
156 	/**
157 	 * Removes this association permanently. Attention: This function must only be called on associations that have no
158 	 * links!
159 	 * 
160 	 * @param associationId
161 	 *            to be removed
162 	 * @throws PersistenceException
163 	 *             A persistence Exception is thrown if any Error contacting the database occurs.
164 	 */
165 	void deleteAssociation(Long associationId) throws PersistenceException;
166 	
167 	/**
168 	 * Removes this user type and corresponding specializations permanently. Attention: This function must only be
169 	 * called on types that have no direct objects!
170 	 * 
171 	 * @param typeId
172 	 *            to be removed
173 	 * @throws PersistenceException
174 	 *             A persistence Exception is thrown if any Error contacting the database occurs.
175 	 */
176 	void deleteUserType(Long typeId) throws PersistenceException;
177 	
178 	/**
179 	 * Updates the instance-of relation of all links of 'association' to a matching new association in
180 	 * 'newAssociations'.
181 	 * 
182 	 * @param associationId
183 	 *            to be removed
184 	 * @param newAssociationIds
185 	 *            new associations that links might have as new 'instance-of'
186 	 * @throws PersistenceException
187 	 *             A persistence Exception is thrown if any Error contacting the database occurs.
188 	 */
189 	void updateLinksToNewAssociation(Long associationId, Collection<Long> newAssociationIds)
190 			throws PersistenceException;
191 	
192 	/**
193 	 * Updates all existing links and adds objects and links to perform the move from the old associations to the new
194 	 * associations, that have moved to the new type.
195 	 * 
196 	 * @param oldAssoIds
197 	 * @param newAsso
198 	 * @param newType
199 	 * @param newAssoIds
200 	 * @throws PersistenceException
201 	 */
202 	void moveLinksAndCreateObjects(List<Long> oldAssoIds, Association newAsso, UserType newType, List<Long> newAssoIds)
203 			throws PersistenceException;
204 	
205 	/**
206 	 * 
207 	 * This Method creates the Base Types in the Database and makes it possible to fill the model layer with content.
208 	 * This Method has to be called if there are no Model Items present in the Database and you want to create a new
209 	 * pool of data.
210 	 * 
211 	 * @throws PersistenceException
212 	 *             A persistence Exception is thrown if any Error contacting the database occurs.
213 	 */
214 	void initialize() throws PersistenceException;
215 	
216 	/**
217 	 * This method initializes the classfacade when there is already a model present in the database and the persistence
218 	 * facade has to be set up for Runtime. It reads the Type Information from the Database and store it into the
219 	 * TypeManager.
220 	 * 
221 	 * @throws PersistenceException
222 	 *             A persistence exception is thrown if there are any errors contacting the database.
223 	 */
224 	void initializeForRuntime() throws PersistenceException;
225 	
226 	/**
227 	 * A Method to determine if the classfacade has been initialized with at least Base type Informations. It is
228 	 * necessary that this methods provides true before executing other Database operations.
229 	 * 
230 	 * @return Provides true if initialize or initializeWithExistingData had been invoked.
231 	 */
232 	boolean hasBeenInitialized();
233 	
234 	/**
235 	 * Provides the Type Manager, which represents a Dictionary for all created Classes and Associations, so it can be
236 	 * used to lookup Classes. This Method could only be used if initialize or initializeWithExistingData are invoked.
237 	 * 
238 	 * @return The Type Manager, which stores Information about all Types and Associatons
239 	 * @throws ClassFacadeUninitializedException
240 	 *             this exception were thrown when the classfacase isn't initialized
241 	 */
242 	TypeManager getTypeManager() throws ClassFacadeUninitializedException;
243 	
244 }