KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > de > gulden > framework > amoda > generic > metadata > GenericMetadata


1 /*
2  * Project: AMODA - Abstract Modeled Application
3  * Class: de.gulden.framework.amoda.generic.metadata.GenericMetadata
4  * Version: snapshot-beautyj-1.1
5  *
6  * Date: 2004-09-29
7  *
8  * This is a snapshot version of the AMODA 0.2 development branch,
9  * it is not released as a seperate version.
10  * For AMODA, see http://amoda.berlios.de/.
11  *
12  * This is licensed under the GNU Lesser General Public License (LGPL)
13  * and comes with NO WARRANTY.
14  *
15  * Author: Jens Gulden
16  * Email: amoda@jensgulden.de
17  */

18
19 package de.gulden.framework.amoda.generic.metadata;
20
21 import de.gulden.framework.amoda.generic.data.*;
22 import de.gulden.framework.amoda.model.core.*;
23 import de.gulden.framework.amoda.model.metadata.*;
24 import de.gulden.framework.amoda.model.metadata.Metadata;
25 import de.gulden.util.Toolbox;
26 import de.gulden.util.xml.*;
27 import de.gulden.util.xml.XMLToolbox;
28 import de.gulden.util.xml.serializer.*;
29 import de.gulden.util.xml.serializer.XMLSerializableActive;
30 import java.lang.*;
31 import java.net.*;
32 import java.util.*;
33 import javax.swing.*;
34 import org.w3c.dom.*;
35
36 /**
37  * Class GenericMetadata.
38  *
39  * @author Jens Gulden
40  * @version snapshot-beautyj-1.1
41  */

42 public class GenericMetadata implements Metadata, XMLSerializableActive {
43
44     // ------------------------------------------------------------------------
45
// --- fields ---
46
// ------------------------------------------------------------------------
47

48     protected static Hashtable titlesCache = new Hashtable();
49
50     protected static Hashtable iconsCache = new Hashtable();
51
52     protected Hashtable metadataEntries;
53
54     protected GenericMetadataSchema genericMetadataSchema;
55
56     public Collection genericMetadataEntry = new ArrayList();
57
58
59     // ------------------------------------------------------------------------
60
// --- constructor ---
61
// ------------------------------------------------------------------------
62

63     public GenericMetadata() {
64         metadataEntries=new Hashtable();
65     }
66
67
68     // ------------------------------------------------------------------------
69
// --- methods ---
70
// ------------------------------------------------------------------------
71

72     public GenericMetadataSchema getGenericMetadataSchema() {
73         return genericMetadataSchema;
74     }
75
76     public void setGenericMetadataSchema(GenericMetadataSchema genericMetadataSchema) {
77         this.genericMetadataSchema = genericMetadataSchema;
78     }
79
80     public Collection getGenericMetadataEntrys() {
81         return genericMetadataEntry;
82     }
83
84     public void addGenericMetadataEntry(GenericMetadataEntry genericMetadataEntry) {
85         if (! this.genericMetadataEntry.contains(genericMetadataEntry)) {
86             this.genericMetadataEntry.add(genericMetadataEntry);
87             genericMetadataEntry.setGenericMetadata(this);
88         }
89     }
90
91     public void removeGenericMetadataEntry(GenericMetadataEntry genericMetadataEntry) {
92         boolean removed = this.genericMetadataEntry.remove(genericMetadataEntry);
93         if (removed) genericMetadataEntry.setGenericMetadata((GenericMetadata)null);
94     }
95
96     public String JavaDoc get(String JavaDoc name) {
97         return get(name,"");
98     }
99
100     public String JavaDoc get(String JavaDoc name, String JavaDoc def) {
101         // never returns null, if not found, returns ""
102
GenericMetadataEntry entry=(GenericMetadataEntry)getEntry(name);
103         if (entry!=null) {
104             String JavaDoc s=entry.getString();
105             if (s!=null) {
106                 s = s.trim();
107                 s = replaceMultipleBlanksWithLineBreaks(s);
108                 return s;
109             } else {
110                 return def;
111             }
112         } else {
113             return def;
114         }
115     }
116
117     public Collection getEntries() {
118         return getGenericMetadataEntrys();
119     }
120
121     public MetadataEntry getEntry(String JavaDoc name) {
122         return (MetadataEntry)metadataEntries.get(name);
123     }
124
125     public String JavaDoc toString() {
126         StringBuffer JavaDoc sb=new StringBuffer JavaDoc();
127         for (Iterator it=getEntries().iterator();it.hasNext();) {
128             MetadataEntry entry=(MetadataEntry)it.next();
129             sb.append(entry.toString()+de.gulden.framework.amoda.generic.core.GenericApplicationEnvironment.NL);
130         }
131         return sb.toString();
132     }
133
134     public void set(String JavaDoc name, Object JavaDoc value) {
135         GenericMetadataEntry m=new GenericMetadataEntry(name,value);
136         addEntry(m);
137     }
138
139     public Element xmlSerialize(Document document, XMLSerializer serializer) {
140         throw new Error JavaDoc("NOT IMPLEMENTED");
141     }
142
143     public void xmlDeserialize(Element element, XMLSerializer serializer) throws XMLException {
144         Element schemaTag=XMLToolbox.getChild(element,"metadata-schema");
145         if (schemaTag!=null) {
146             GenericMetadataSchema schema=new GenericMetadataSchema();
147             serializer.xmlDeserialize(schema,schemaTag);
148             setGenericMetadataSchema(schema);
149         }
150         // allow any tag as child, treating tag-name as key and tag-content as value
151
Element e=XMLToolbox.getFirstChild(element);
152         while (e!=null) {
153             String JavaDoc name=e.getTagName();
154             String JavaDoc source=e.getAttribute("source"); // may be null
155
String JavaDoc valueStr=XMLToolbox.getText(e);
156             if (Toolbox.empty(valueStr)) {
157                 valueStr=XMLToolbox.getLangstring(e);
158             }
159             if (!Toolbox.empty(valueStr)) {
160                 GenericMetadataEntry m=new GenericMetadataEntry();
161                 m.setName(name);
162                 m.setSource(source);
163                 m.parseString(valueStr);
164                 this.addEntry(m);
165             }
166             e=XMLToolbox.getNextSibling(e);
167         }
168     }
169
170     public MetadataSchema getSchema() {
171         return getGenericMetadataSchema();
172     }
173
174     protected void addEntry(GenericMetadataEntry entry) {
175         addGenericMetadataEntry(entry);
176         metadataEntries.put(entry.getName(),entry);
177     }
178
179
180     // ------------------------------------------------------------------------
181
// --- static methods ---
182
// ------------------------------------------------------------------------
183

184     public static String JavaDoc findTitle(ApplicationMember member) {
185         String JavaDoc title=(String JavaDoc)titlesCache.get(member);
186         if (title==null) { // not cached yet
187
// title given?
188
title=member.getMetadata().get("title");
189             if (Toolbox.isEmpty(title)) {
190                 // no: at least try to find via id
191
if (member instanceof de.gulden.framework.amoda.generic.core.GenericApplicationMemberAbstract) {
192                     de.gulden.framework.amoda.generic.core.GenericApplicationMemberAbstract m=(de.gulden.framework.amoda.generic.core.GenericApplicationMemberAbstract)member;
193                     String JavaDoc id = m.getId();
194                     de.gulden.framework.amoda.model.data.CompositeGroup parent = m.getParent();
195                     if (parent != null) {
196                         String JavaDoc parentId = parent.getId();
197                         if (id.startsWith(parentId + ".")) { // special: if parent's name is first part, remove
198
id = id.substring(parentId.length()+1);
199                         }
200                     }
201                     title=Toolbox.capitalize(id).replace('-',' ').replace('_',' ').replace('.',' ');
202                 }
203             }
204             titlesCache.put(member,title);
205         }
206         return title;
207     }
208
209     public static ImageIcon findIcon(ApplicationMember member) {
210         ImageIcon icon=(ImageIcon)iconsCache.get(member);
211         if (icon==null) { // not cached yet
212
java.net.URL JavaDoc url=findIconResource(member);
213             if (url!=null) {
214                 icon=new ImageIcon(url);
215                 iconsCache.put(member,icon);
216             }
217         }
218         return icon;
219     }
220
221     public static URL findIconResource(ApplicationMember member) {
222         java.net.URL JavaDoc url=null;
223         // icon-resource explicitly given?
224
String JavaDoc icon=member.getMetadata().get("icon").trim();
225         String JavaDoc base=member.getApplication().getOptions().getString("resource-base-icons");
226         if (!base.endsWith("/")) {
227             base+="/";
228         }
229         if (!Toolbox.empty(icon)) {
230             if (!icon.startsWith("/")) { // not absolute
231
icon=base+icon;
232             }
233             url=member.getClass().getResource(icon);
234         }
235         // no: at least try to find via id
236
if (member instanceof de.gulden.framework.amoda.generic.core.GenericApplicationMemberAbstract) {
237             de.gulden.framework.amoda.generic.core.GenericApplicationMemberAbstract m=(de.gulden.framework.amoda.generic.core.GenericApplicationMemberAbstract)member;
238             icon=base+m.getId()+".png";
239             url=member.getClass().getResource(icon);
240             if (url==null) {
241                 icon=base+m.getId()+".gif";
242                 url=member.getClass().getResource(icon);
243             }
244             if (url==null) {
245                 icon=base+m.getId()+".bmp";
246                 url=member.getClass().getResource(icon);
247             }
248             if (url==null) {
249                 icon=base+m.getId()+".jpg";
250                 url=member.getClass().getResource(icon);
251             }
252         }
253         return url;
254     }
255
256     protected static String JavaDoc replaceMultipleBlanksWithLineBreaks(String JavaDoc s) {
257         int pos = 0;
258         char prev = 'X';
259         int startblank = -1;
260         while (pos < s.length()) {
261             char c = s.charAt(pos);
262             if (Character.isWhitespace(c)) {
263                 if (!Character.isWhitespace(prev)) {
264                     startblank = pos;
265                 }
266             } else { // no whitespace
267
if (Character.isWhitespace(prev)) { // but prev was
268
if ((pos - startblank) > 1) { // more than one
269
return s.substring(0, startblank) + "\n" + replaceMultipleBlanksWithLineBreaks(s.substring(pos));
270                     }
271                 }
272             }
273             prev = c;
274             pos++;
275         }
276         if (Character.isWhitespace(prev)) { // last one still was whitespace
277
if ((pos - startblank) > 1) { // more than one
278
return s.substring(0, startblank) + "\n";
279             }
280         }
281         return s;
282     }
283
284 } // end GenericMetadata
285
Popular Tags