KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectstyle > cayenne > modeler > dialog > objentity > EntityRelationshipsModel


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.modeler.dialog.objentity;
57
58 import java.util.Arrays JavaDoc;
59 import java.util.Collection JavaDoc;
60 import java.util.Iterator JavaDoc;
61
62 import org.apache.oro.text.perl.Perl5Util;
63 import org.objectstyle.cayenne.map.DbRelationship;
64 import org.objectstyle.cayenne.map.Entity;
65 import org.objectstyle.cayenne.map.Relationship;
66 import org.objectstyle.cayenne.util.Util;
67 import org.scopemvc.core.ModelChangeEvent;
68 import org.scopemvc.core.Selector;
69 import org.scopemvc.model.basic.BasicModel;
70
71 /**
72  * A model representing an Entity with a set of Relationships, with zero or one
73  * selected Relationship.
74  *
75  * @since 1.1
76  * @author Andrei Adamchik
77  */

78 public class EntityRelationshipsModel extends BasicModel {
79     private static final Perl5Util regexUtil = new Perl5Util();
80
81     public static final Selector RELATIONSHIP_DISPLAY_NAME_SELECTOR =
82         Selector.fromString("relationshipDisplayName");
83
84     protected Entity sourceEntity;
85     protected String JavaDoc relationshipDisplayName;
86     protected String JavaDoc defaultTargetName;
87     protected Object JavaDoc[] relationshipNames;
88
89     static String JavaDoc nameFromDisplayName(String JavaDoc displayName) {
90         if (displayName == null) {
91             return null;
92         }
93
94         return regexUtil.match("/\\s\\[.+\\]$/", displayName)
95             ? regexUtil.substitute("s/\\s\\[.+\\]$//g", displayName)
96             : displayName;
97     }
98
99     static String JavaDoc displayName(Relationship relationship) {
100         if (relationship == null) {
101             return null;
102         }
103         return displayName(
104             relationship.getName(),
105             relationship.getSourceEntity(),
106             relationship.getTargetEntity());
107     }
108
109     static String JavaDoc displayName(String JavaDoc name, Entity source, Entity target) {
110         return name + " [" + source.getName() + " -> " + target.getName() + "]";
111     }
112
113     /**
114      * Creates EntityRelationshipsModel with two unconnected Entities.
115      */

116     public EntityRelationshipsModel(Entity sourceEntity, Entity targetEntity) {
117         this.sourceEntity = sourceEntity;
118         this.defaultTargetName = targetEntity.getName();
119         this.relationshipDisplayName = "";
120     }
121
122     /**
123      * Creates EntityRelationshipsModel over the relationship connecting
124      * two Entities.
125      */

126     public EntityRelationshipsModel(Relationship relationship) {
127         this.sourceEntity = relationship.getSourceEntity();
128         this.relationshipDisplayName = displayName(relationship);
129     }
130
131     public synchronized Object JavaDoc[] getRelationshipNames() {
132         // build an ordered list of available relationship names
133
// on demand
134
if (relationshipNames == null) {
135             Collection JavaDoc relationships = getSourceEntity().getRelationships();
136             int size = relationships.size();
137             Object JavaDoc[] names = new Object JavaDoc[size];
138
139             Iterator JavaDoc it = relationships.iterator();
140             for (int i = 0; i < size; i++) {
141                 DbRelationship next = (DbRelationship) it.next();
142                 names[i] = displayName(next);
143             }
144             Arrays.sort(names);
145             this.relationshipNames = names;
146         }
147
148         return relationshipNames;
149     }
150
151     /**
152      * Returns a root entity of this model.
153      * @return
154      */

155     public Entity getSourceEntity() {
156         return sourceEntity;
157     }
158
159     /**
160      * Returns a String describing currently selected relationship.
161      */

162     public String JavaDoc getRelationshipDisplayName() {
163         return relationshipDisplayName;
164     }
165
166     public void setRelationshipDisplayName(String JavaDoc relationshipDisplayName) {
167         if (!Util
168             .nullSafeEquals(relationshipDisplayName, this.relationshipDisplayName)) {
169             this.relationshipDisplayName = relationshipDisplayName;
170             relationshipNames = null;
171             fireModelChange(
172                 ModelChangeEvent.VALUE_CHANGED,
173                 RELATIONSHIP_DISPLAY_NAME_SELECTOR);
174         }
175     }
176
177     public void setRelationshipName(String JavaDoc relationshipName) {
178         setRelationshipDisplayName(
179             displayName(sourceEntity.getRelationship(relationshipName)));
180     }
181
182     public Relationship getSelectedRelationship() {
183         return sourceEntity.getRelationship(nameFromDisplayName(relationshipDisplayName));
184     }
185
186     public String JavaDoc getSourceEntityName() {
187         return sourceEntity.getName();
188     }
189
190     public String JavaDoc getTargetEntityName() {
191         Relationship selected = getSelectedRelationship();
192         return (selected != null) ? selected.getTargetEntityName() : defaultTargetName;
193     }
194 }
195
Popular Tags