KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > nightlabs > ipanema > person > PersonStruct


1 /*
2  * Created on Nov 24, 2004
3  * by alex
4  *
5  */

6 package com.nightlabs.ipanema.person;
7
8 import java.io.Serializable JavaDoc;
9 import java.util.ArrayList JavaDoc;
10 import java.util.Collection JavaDoc;
11 import java.util.HashMap JavaDoc;
12 import java.util.Iterator JavaDoc;
13 import java.util.List JavaDoc;
14 import java.util.Map JavaDoc;
15
16 import javax.jdo.PersistenceManager;
17
18 import com.nightlabs.ipanema.base.DuplicateKeyException;
19 import com.nightlabs.ipanema.organisation.Organisation;
20 import com.nightlabs.ipanema.person.id.PersonStructBlockID;
21 import com.nightlabs.ipanema.person.id.PersonStructFieldID;
22
23 /**
24  * PersonStruct knows the structure of persons
25  * within one organisation. It is more a helper
26  * class for editing the person data.
27  *
28  * @author Alexander Bieber <alex[AT]nightlabs[DOT]de>
29  */

30
31 /**
32  * @jdo.persistence-capable
33  * identity-type = "datastore"
34  * detachable = "true"
35  *
36  * @jdo.inheritance strategy = "new-table"
37  *
38  * @jdo.fetch-group name="PersonStruct_personStructBlocks" field-names="personStructBlocks"
39  */

40 public class PersonStruct implements Serializable JavaDoc{
41     protected PersonStruct() { }
42     
43     /**
44      * key: String PersonStructBlock.getPrimaryKey(personStructBlockOrganisationID, personStructBlockID)<br/>
45      * value: PersonStructBlock personStructBlock
46      *
47      * @jdo.field
48      * persistence-modifier="persistent"
49      * collection-type="map"
50      * key-type="java.lang.String"
51      * value-type="com.nightlabs.ipanema.person.PersonStructBlock"
52      * mapped-by="personStruct"
53      * dependent="true"
54      *
55      * @jdo.map-vendor-extension vendor-name="jpox" key="key-field" value="primaryKey"
56      *
57      */

58     protected Map JavaDoc personStructBlocks = new HashMap JavaDoc();
59     
60     
61     public void addPersonStructBlock(PersonStructBlock personStructBlock)
62     throws DuplicateKeyException
63     {
64         String JavaDoc primaryKey = personStructBlock.getPrimaryKey();
65         if (personStructBlocks.containsKey(primaryKey))
66             throw new DuplicateKeyException("A personStructBlock with key "+primaryKey+" already exists for this PersonsStruct.");
67         personStructBlocks.put(primaryKey,personStructBlock);
68     }
69     
70     /**
71      * Returns all {@link PersonStructBlock}s for this PersonStruct.
72      * @return
73      */

74     public Collection JavaDoc getPersonStructBlocks() {
75         return personStructBlocks.values();
76     }
77
78     /**
79      * A shortcut to {@link #getPersonStructBlock(String, String)}.
80      *
81      * @param personStructBlockID
82      * @return
83      * @throws PersonStructBlockNotFoundException
84      */

85     public PersonStructBlock getPersonStructBlock(PersonStructBlockID personStructBlockID)
86     throws PersonStructBlockNotFoundException
87     {
88         return getPersonStructBlock(personStructBlockID.personStructBlockOrganisationID, personStructBlockID.personStructBlockID);
89     }
90     
91     /**
92      * Returns the {@link PersonStructBlock} for the given key.<br/>
93      * If no entry could be found for this key a {@link PersonStructBlockNotFoundException} is thrown
94      *
95      * @param personStructBlockOrganisationID
96      * @param personStructBlockID
97      * @return
98      * @throws PersonStructBlockNotFoundException
99      */

100     public PersonStructBlock getPersonStructBlock(String JavaDoc personStructBlockOrganisationID, String JavaDoc personStructBlockID)
101     throws PersonStructBlockNotFoundException
102     {
103         String JavaDoc primaryKey = PersonStructBlock.getPrimaryKey(personStructBlockOrganisationID,personStructBlockID);
104         PersonStructBlock psb = (PersonStructBlock)personStructBlocks.get(primaryKey);
105         if (psb == null)
106             throw new PersonStructBlockNotFoundException("No PersonStructBlock found with key "+primaryKey);
107         return psb;
108     }
109     
110     public AbstractPersonStructField getPersonStructField(
111             PersonStructBlock personStructBlock,
112             String JavaDoc personStructFieldOrganisationID,
113             String JavaDoc personStructFieldID
114         ) throws PersonStructFieldNotFoundException
115     {
116         return personStructBlock.getPersonStructField(personStructFieldOrganisationID,personStructFieldID);
117     }
118     
119     public AbstractPersonStructField getPersonStructField(
120             PersonStructBlockID personStructBlockID,
121             PersonStructFieldID personStructFieldID
122         )
123     throws PersonStructFieldNotFoundException, PersonStructBlockNotFoundException
124     {
125         return getPersonStructField(
126             personStructBlockID.personStructBlockOrganisationID,
127             personStructBlockID.personStructBlockID,
128             personStructFieldID.personStructFieldOrganisationID,
129             personStructFieldID.personStructFieldID
130         );
131     }
132     
133     public AbstractPersonStructField getPersonStructField(
134             String JavaDoc personStructBlockOrganisationID,
135             String JavaDoc personStructBlockID,
136             String JavaDoc personStructFieldOrganisationID,
137             String JavaDoc personStructFieldID
138         )
139     throws PersonStructFieldNotFoundException, PersonStructBlockNotFoundException
140     {
141         PersonStructBlock personStructBlock = getPersonStructBlock(personStructBlockOrganisationID,personStructBlockID);
142         return personStructBlock.getPersonStructField(personStructFieldOrganisationID,personStructFieldID);
143     }
144     
145     
146     /**
147      * value: String personType
148      *
149      * @jdo.field
150      * persistence-modifier="persistent"
151      * collection-type="collection"
152      * element-type="com.nightlabs.ipanema.person.PersonDisplayNamePart"
153      *
154      * @jdo.join
155      */

156     protected List JavaDoc personDisplayNameParts = new ArrayList JavaDoc();
157     
158     public Collection JavaDoc getPersonDisplayNameParts() {
159         return personDisplayNameParts;
160     }
161     
162     public void addPersonDisplayNamePart(PersonDisplayNamePart part) {
163         getPersonDisplayNameParts().add(part);
164     }
165     
166     public void removePersonDisplayNamePart(PersonDisplayNamePart part) {
167         getPersonDisplayNameParts().remove(part);
168     }
169     
170     private PersonStructBlock internalPersonStructBlock;
171     public PersonStructBlock getInternalPersonStructBlock() {
172         return internalPersonStructBlock;
173     }
174     
175     
176     /**
177      * Returns the {@link PersonStruct} for the datastore
178      * of the supplied {@link PersistenceManager}. If no
179      * PersonStruct is persistent in this datastore a new
180      * one is created.
181      * @param pm
182      * @return
183      */

184     public static PersonStruct getPersonStruct(PersistenceManager pm) {
185         Iterator JavaDoc it = pm.getExtent(PersonStruct.class).iterator();
186         if (it.hasNext()) {
187             return (PersonStruct)it.next();
188         }
189         else {
190             PersonStruct ps = new PersonStruct();
191             pm.makePersistent(ps);
192             createStandardStructure(ps);
193             return ps;
194         }
195     }
196     
197     /**
198      * Checks the persons data and adds DataBlocks to the person
199      * for all StructBlocks defined within this PersonStruct that
200      * do not have a representation within the given person.
201      *
202      * @param person
203      */

204     public void explodePerson(Person person) {
205         for (Iterator JavaDoc it = personStructBlocks.values().iterator(); it.hasNext(); ) {
206             // for all StructBlocks
207
PersonStructBlock structBlock = (PersonStructBlock)it.next();
208             if (!person.hasStructBlockRepresentation(structBlock.getPersonStructBlockOrganisationID(),structBlock.getPersonStructBlockID())) {
209                 // no representation found for this PersonStructBlock
210
try {
211                     // addDataBlockGroup adds first DataBlock to group
212
// and new DataBlock initializes its fields
213
PersonDataBlockGroup blockGroup = person.addDataBlockGroup(structBlock,this);
214                     blockGroup.explodeBlockGroup(this);
215                 } catch (DuplicateKeyException e) {
216                     IllegalStateException JavaDoc ill = new IllegalStateException JavaDoc("Added not represented structBlock but still caught DuplicateKeyException");
217                     e.initCause(e);
218                     throw ill;
219                 }
220             }
221             else {
222                 // DataBlockGroup existing, but might be incomplete
223
try {
224                     PersonDataBlockGroup blockGroup = (PersonDataBlockGroup)person.getPersonDataBlockGroup(structBlock.getPersonStructBlockOrganisationID(),structBlock.getPersonStructBlockID());
225                     blockGroup.explodeBlockGroup(this);
226                 } catch (PersonDataBlockGroupNotFoundException e) {
227                     // weird state, ignore
228
continue;
229                 }
230             }
231         }
232     }
233
234     /**
235      * Scans all DataBlockGroups, its containing DataBlocks and DataFields
236      * and removes all entries where isEmpty() retruns true.
237      * @param person
238      */

239     public void implodePerson(Person person) {
240         for (Iterator JavaDoc it = person.personDataBlockGroups.entrySet().iterator(); it.hasNext(); ) {
241             Map.Entry JavaDoc entry = (Map.Entry JavaDoc)it.next();
242             PersonDataBlockGroup blockGroup = (PersonDataBlockGroup)entry.getValue();
243             blockGroup.implodeBlockGroup();
244             if (blockGroup.isEmpty())
245                 it.remove();
246         }
247     }
248     
249     
250     
251     protected static void createStandardStructure(PersonStruct ps) {
252         try {
253             
254             PersonStructBlock psb = new PersonStructBlock(ps,INTERNALBLOCK);
255             psb.addPersonStructField(new InternalPersonStructField(psb,INTERNALBLOCK_DISPLAYNAME));
256             ps.internalPersonStructBlock = psb;
257             
258             psb = new PersonStructBlock(ps,PERSONALDATA);
259             psb.setUnique(true);
260             TextPersonStructField companyField = new TextPersonStructField(psb,PERSONALDATA_COMPANY);
261             TextPersonStructField nameField = new TextPersonStructField(psb,PERSONALDATA_NAME);
262             TextPersonStructField firstNameField = new TextPersonStructField(psb,PERSONALDATA_FIRSTNAME);
263             
264             psb.addPersonStructField(companyField);
265             psb.addPersonStructField(nameField);
266             psb.addPersonStructField(firstNameField);
267             psb.addPersonStructField(new TextPersonStructField(psb,PERSONALDATA_SALUTATION));
268             psb.addPersonStructField(new TextPersonStructField(psb,PERSONALDATA_TITLE));
269             psb.addPersonStructField(new TextPersonStructField(psb,PERSONALDATA_DATEOFBIRTH));
270             ps.addPersonStructBlock(psb);
271     
272             psb = new PersonStructBlock(ps,POSTADDRESS);
273             psb.addPersonStructField(new TextPersonStructField(psb,POSTADDRESS_ADDRESS));
274             psb.addPersonStructField(new TextPersonStructField(psb,POSTADDRESS_POSTCODE));
275             psb.addPersonStructField(new TextPersonStructField(psb,POSTADDRESS_CITY));
276             psb.addPersonStructField(new TextPersonStructField(psb,POSTADDRESS_REGION));
277             psb.addPersonStructField(new TextPersonStructField(psb,POSTADDRESS_COUNTRY));
278             ps.addPersonStructBlock(psb);
279             
280             psb = new PersonStructBlock(ps,PHONE);
281             psb.addPersonStructField(new TextPersonStructField(psb,PHONE_COUNTRYCODE));
282             psb.addPersonStructField(new TextPersonStructField(psb,PHONE_AREACODE));
283             psb.addPersonStructField(new TextPersonStructField(psb,PHONE_LOCALNUMBER));
284             ps.addPersonStructBlock(psb);
285
286             psb = new PersonStructBlock(ps,FAX);
287             psb.addPersonStructField(new TextPersonStructField(psb,FAX_COUNTRYCODE));
288             psb.addPersonStructField(new TextPersonStructField(psb,FAX_AREACODE));
289             psb.addPersonStructField(new TextPersonStructField(psb,FAX_LOCALNUMBER));
290             ps.addPersonStructBlock(psb);
291             
292             psb = new PersonStructBlock(ps,INTERNET);
293             psb.addPersonStructField(new TextPersonStructField(psb,INTERNET_EMAIL));
294             psb.addPersonStructField(new TextPersonStructField(psb,INTERNET_HOMEPAGE));
295             ps.addPersonStructBlock(psb);
296             
297             psb = new PersonStructBlock(ps,BANKDATA);
298             psb.addPersonStructField(new TextPersonStructField(psb,BANKDATA_ACCOUNTHOLDER));
299             psb.addPersonStructField(new TextPersonStructField(psb,BANKDATA_ACCOUNTNUMBER));
300             psb.addPersonStructField(new TextPersonStructField(psb,BANKDATA_BANKCODE));
301             psb.addPersonStructField(new TextPersonStructField(psb,BANKDATA_BANKNAME));
302             ps.addPersonStructBlock(psb);
303
304             psb = new PersonStructBlock(ps,CREDITCARD);
305             psb.addPersonStructField(new TextPersonStructField(psb,CREDITCARD_CREDITCARDHOLDER));
306             psb.addPersonStructField(new TextPersonStructField(psb,CREDITCARD_NUMBER));
307             psb.addPersonStructField(new TextPersonStructField(psb,CREDITCARD_EXPIRYYEAR));
308             psb.addPersonStructField(new TextPersonStructField(psb,CREDITCARD_EXPIRYMONTH));
309             ps.addPersonStructBlock(psb);
310
311             psb = new PersonStructBlock(ps,COMMENT);
312             psb.addPersonStructField(new TextPersonStructField(psb,COMMENT_COMMENT));
313             ps.addPersonStructBlock(psb);
314             
315             ps.addPersonDisplayNamePart(new PersonDisplayNamePart(companyField, ": "));
316             ps.addPersonDisplayNamePart(new PersonDisplayNamePart(nameField, ", "));
317             ps.addPersonDisplayNamePart(new PersonDisplayNamePart(firstNameField, ""));
318             
319         } catch (Throwable JavaDoc t) {
320             throw new RuntimeException JavaDoc(t);
321         }
322     }
323     
324     
325     // *************** STANDARD StructBlocks StructField IDs ***************************
326

327     public static final String JavaDoc ROOT_ORGANISATIONID = Organisation.ROOT_ORGANISATIONID;
328     
329     public static final PersonStructBlockID INTERNALBLOCK = PersonStructBlockID.create(ROOT_ORGANISATIONID,"InternalBlock");
330     public static final PersonStructFieldID INTERNALBLOCK_DISPLAYNAME = PersonStructFieldID.create(INTERNALBLOCK,"DisplayName");
331     
332     public static final PersonStructBlockID PERSONALDATA = PersonStructBlockID.create(ROOT_ORGANISATIONID,"PersonalData");
333     public static final PersonStructFieldID PERSONALDATA_COMPANY = PersonStructFieldID.create(PERSONALDATA,"Company");
334     public static final PersonStructFieldID PERSONALDATA_NAME = PersonStructFieldID.create(PERSONALDATA,"Name");
335     public static final PersonStructFieldID PERSONALDATA_FIRSTNAME = PersonStructFieldID.create(PERSONALDATA,"FirstName");
336     public static final PersonStructFieldID PERSONALDATA_SALUTATION = PersonStructFieldID.create(PERSONALDATA,"Salutation");
337     public static final PersonStructFieldID PERSONALDATA_TITLE = PersonStructFieldID.create(PERSONALDATA,"Title");
338     public static final PersonStructFieldID PERSONALDATA_DATEOFBIRTH = PersonStructFieldID.create(PERSONALDATA,"DateOfBirth");
339
340     public static final PersonStructBlockID POSTADDRESS = PersonStructBlockID.create(ROOT_ORGANISATIONID,"PostAddress");
341     public static final PersonStructFieldID POSTADDRESS_ADDRESS = PersonStructFieldID.create(POSTADDRESS,"Address");
342     public static final PersonStructFieldID POSTADDRESS_POSTCODE = PersonStructFieldID.create(POSTADDRESS,"PostCode");
343     public static final PersonStructFieldID POSTADDRESS_CITY = PersonStructFieldID.create(POSTADDRESS,"City");
344     public static final PersonStructFieldID POSTADDRESS_REGION = PersonStructFieldID.create(POSTADDRESS,"Region");
345     public static final PersonStructFieldID POSTADDRESS_COUNTRY = PersonStructFieldID.create(POSTADDRESS,"Country");
346
347     public static final PersonStructBlockID INTERNET = PersonStructBlockID.create(ROOT_ORGANISATIONID,"Internet");
348     public static final PersonStructFieldID INTERNET_EMAIL = PersonStructFieldID.create(INTERNET,"EMail");
349     public static final PersonStructFieldID INTERNET_HOMEPAGE = PersonStructFieldID.create(INTERNET,"Homepage");
350
351     public static final PersonStructBlockID PHONE = PersonStructBlockID.create(ROOT_ORGANISATIONID,"Phone");
352     public static final PersonStructFieldID PHONE_COUNTRYCODE = PersonStructFieldID.create(PHONE,"CountryCode");
353     public static final PersonStructFieldID PHONE_AREACODE = PersonStructFieldID.create(PHONE,"AreaCode");
354     public static final PersonStructFieldID PHONE_LOCALNUMBER = PersonStructFieldID.create(PHONE,"LocalNumber");
355
356     public static final PersonStructBlockID FAX = PersonStructBlockID.create(ROOT_ORGANISATIONID,"Fax");
357     public static final PersonStructFieldID FAX_COUNTRYCODE = PersonStructFieldID.create(FAX,"CountryCode");
358     public static final PersonStructFieldID FAX_AREACODE = PersonStructFieldID.create(FAX,"AreaCode");
359     public static final PersonStructFieldID FAX_LOCALNUMBER = PersonStructFieldID.create(FAX,"LocalNumber");
360
361     public static final PersonStructBlockID BANKDATA = PersonStructBlockID.create(ROOT_ORGANISATIONID,"BankData");
362     public static final PersonStructFieldID BANKDATA_ACCOUNTHOLDER = PersonStructFieldID.create(BANKDATA,"AccountHolder");
363     public static final PersonStructFieldID BANKDATA_BANKCODE = PersonStructFieldID.create(BANKDATA,"BankCode");
364     public static final PersonStructFieldID BANKDATA_BANKNAME = PersonStructFieldID.create(BANKDATA,"BankName");
365     public static final PersonStructFieldID BANKDATA_ACCOUNTNUMBER = PersonStructFieldID.create(BANKDATA,"AccountNumber");
366
367     public static final PersonStructBlockID CREDITCARD = PersonStructBlockID.create(ROOT_ORGANISATIONID,"CreditCard");
368     public static final PersonStructFieldID CREDITCARD_CREDITCARDHOLDER = PersonStructFieldID.create(CREDITCARD,"CreditCardHolder");
369     public static final PersonStructFieldID CREDITCARD_NUMBER = PersonStructFieldID.create(CREDITCARD,"Number");
370     public static final PersonStructFieldID CREDITCARD_EXPIRYYEAR = PersonStructFieldID.create(CREDITCARD,"ExpiryYear");
371     public static final PersonStructFieldID CREDITCARD_EXPIRYMONTH = PersonStructFieldID.create(CREDITCARD,"ExpiryMonth");
372
373     public static final PersonStructBlockID COMMENT = PersonStructBlockID.create(ROOT_ORGANISATIONID,"Comment");
374     public static final PersonStructFieldID COMMENT_COMMENT = PersonStructFieldID.create(COMMENT,"Comment");
375     
376     
377 }
378
Popular Tags