KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectstyle > cayenne > pref > PreferenceDetail


1 /* ====================================================================
2  *
3  * The ObjectStyle Group Software License, version 1.1
4  * ObjectStyle Group - http://objectstyle.org/
5  *
6  * Copyright (c) 2002-2005, Andrei (Andrus) Adamchik and individual authors
7  * of the software. All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  *
16  * 2. Redistributions in binary form must reproduce the above copyright
17  * notice, this list of conditions and the following disclaimer in
18  * the documentation and/or other materials provided with the
19  * distribution.
20  *
21  * 3. The end-user documentation included with the redistribution, if any,
22  * must include the following acknowlegement:
23  * "This product includes software developed by independent contributors
24  * and hosted on ObjectStyle Group web site (http://objectstyle.org/)."
25  * Alternately, this acknowlegement may appear in the software itself,
26  * if and wherever such third-party acknowlegements normally appear.
27  *
28  * 4. The names "ObjectStyle Group" and "Cayenne" must not be used to endorse
29  * or promote products derived from this software without prior written
30  * permission. For written permission, email
31  * "andrus at objectstyle dot org".
32  *
33  * 5. Products derived from this software may not be called "ObjectStyle"
34  * or "Cayenne", nor may "ObjectStyle" or "Cayenne" appear in their
35  * names without prior written permission.
36  *
37  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
38  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40  * DISCLAIMED. IN NO EVENT SHALL THE OBJECTSTYLE GROUP OR
41  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
44  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
46  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
47  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48  * SUCH DAMAGE.
49  * ====================================================================
50  *
51  * This software consists of voluntary contributions made by many
52  * individuals and hosted on ObjectStyle Group web site. For more
53  * information on the ObjectStyle Group, please see
54  * <http://objectstyle.org/>.
55  */

56 package org.objectstyle.cayenne.pref;
57
58 import java.util.Properties JavaDoc;
59
60 import org.objectstyle.cayenne.CayenneDataObject;
61 import org.objectstyle.cayenne.DataObjectUtils;
62 import org.objectstyle.cayenne.ObjectId;
63 import org.objectstyle.cayenne.access.DataContext;
64 import org.objectstyle.cayenne.access.DataNode;
65 import org.objectstyle.cayenne.map.DbEntity;
66 import org.objectstyle.cayenne.util.Util;
67
68 /**
69  * A superclass of concrete preference classes.
70  * <p>
71  * Complete preference descriptor is composed out of two classes - DomainPreference that
72  * defines how the preference is located with in domain, and a GenericPreference.
73  * GenericPreference API is designed for the application use, while internal
74  * DomainPreference is managed behind the scenes. Note that there is no real Cayenne
75  * relationship from concrete preference entity to the preference framework entities, so
76  * this class handles all needed wiring...
77  *
78  * @author Andrei Adamchik
79  */

80 public class PreferenceDetail extends CayenneDataObject {
81
82     protected DomainPreference domainPreference;
83
84     /**
85      * Changes the key of this preference. If there is a sibling prefrence with same key,
86      * such sibling is renamed using generated unique name. This operation essentially
87      * substitutes one prefrence entry with another.
88      */

89     public void rename(String JavaDoc newKey) {
90         if (Util.nullSafeEquals(getKey(), newKey)) {
91             return;
92         }
93
94         DomainPreference domainPrefrence = getDomainPreference();
95         Domain parent = domainPrefrence.getDomain();
96
97         if (parent == null) {
98             domainPrefrence.setKey(newKey);
99             return;
100         }
101
102         DomainPreference other = parent.getDomainPreference(newKey);
103         if (other != null && other != domainPrefrence) {
104             String JavaDoc otherName = null;
105             for (int i = 1; i < 1000; i++) {
106                 if (parent.getDomainPreference(newKey + i) == null) {
107                     otherName = newKey + i;
108                     break;
109                 }
110             }
111
112             if (otherName == null) {
113                 throw new PreferenceException("Can't rename an existing preference '"
114                         + newKey
115                         + "'.");
116             }
117
118             other.setKey(otherName);
119         }
120
121         domainPrefrence.setKey(newKey);
122     }
123
124     public int getIntProperty(String JavaDoc key, int defaultValue) {
125         String JavaDoc value = getProperty(key);
126
127         if (value == null) {
128             return defaultValue;
129         }
130
131         try {
132             return Integer.parseInt(value);
133         }
134         catch (NumberFormatException JavaDoc ex) {
135             throw new PreferenceException("Error converting to int: " + value);
136         }
137     }
138
139     public String JavaDoc getKey() {
140         if (getDomainPreference() == null) {
141             throw new PreferenceException(
142                     "Preference not initialized, can't work with properties.");
143         }
144
145         return domainPreference.getKey();
146     }
147
148     public void setIntProperty(String JavaDoc key, int value) {
149         setProperty(key, String.valueOf(value));
150     }
151
152     /**
153      * Returns a named property for a given key.
154      */

155     public String JavaDoc getProperty(String JavaDoc key) {
156         return getProperties().getProperty(key);
157     }
158
159     public void setProperty(String JavaDoc key, String JavaDoc value) {
160         getProperties().setProperty(key, value);
161     }
162
163     public DomainPreference getDomainPreference() {
164         if (domainPreference == null) {
165             // try to fetch..
166

167             DataContext context = getDataContext();
168
169             if (context != null && getObjectId() != null) {
170                 int pk = DataObjectUtils.intPKForObject(this);
171
172                 domainPreference = (DomainPreference) DataObjectUtils.objectForPK(
173                         context,
174                         DomainPreference.class,
175                         pk);
176
177             }
178         }
179
180         return domainPreference;
181     }
182
183     /**
184      * Initializes internal DomainPreference object.
185      */

186     public void setDomainPreference(DomainPreference domainPreference) {
187         if (this.domainPreference != domainPreference) {
188             this.domainPreference = domainPreference;
189
190             ObjectId oid = getObjectId();
191             if (oid != null && oid.isTemporary()) {
192                 oid.getReplacementIdMap().put("id", new Integer JavaDoc(buildPermanentId()));
193             }
194         }
195     }
196
197     /**
198      * Returns initialized non-null properties map.
199      */

200     protected Properties JavaDoc getProperties() {
201         if (getDomainPreference() == null) {
202             throw new PreferenceException(
203                     "Preference not initialized, can't work with properties.");
204         }
205
206         return domainPreference.getProperties();
207     }
208
209     /**
210      * Creates permanent ID based on DomainPreference id.
211      */

212     protected int buildPermanentId() {
213         ObjectId otherId = getDomainPreference().getObjectId();
214         if (otherId == null) {
215             throw new PreferenceException(
216                     "Can't persist preference. DomainPreference has no ObjectId");
217         }
218
219         // force creation of otherId
220
if (otherId.isTemporary() && !otherId.isReplacementIdAttached()) {
221             DbEntity entity = getDataContext().getEntityResolver().lookupDbEntity(
222                     domainPreference);
223
224             DataNode node = getDataContext().lookupDataNode(entity.getDataMap());
225
226             try {
227                 Object JavaDoc pk = node.getAdapter().getPkGenerator().generatePkForDbEntity(
228                         node,
229                         entity);
230                 otherId.getReplacementIdMap().put(DomainPreference.ID_PK_COLUMN, pk);
231             }
232             catch (Throwable JavaDoc th) {
233                 throw new PreferenceException("Error creating primary key", Util
234                         .unwindException(th));
235             }
236         }
237
238         return DataObjectUtils.intPKForObject(domainPreference);
239     }
240 }
Popular Tags