KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > teamkonzept > field > TKFieldGroup


1 package com.teamkonzept.field;
2
3 import java.util.Enumeration JavaDoc;
4 import com.teamkonzept.lib.*;
5 import com.teamkonzept.publishing.markups.*;
6 import com.teamkonzept.web.*;
7 import com.teamkonzept.field.db.*;
8 import org.w3c.dom.*;
9 import com.teamkonzept.international.LanguageManager;
10 import org.apache.log4j.Category;
11
12 /**
13  * The field group control.
14  *
15  * @author $Author: uli $
16  * @version $Revision: 1.24 $
17  */

18 public class TKFieldGroup
19     extends TKBaseField
20 {
21     // $Id: TKFieldGroup.java,v 1.24 2002/02/27 11:07:04 uli Exp $
22

23     /**
24      * The class identifier.
25      */

26     public static final String JavaDoc CLASS_ID = "FIELDGROUP";
27     public static final String JavaDoc SUB_FIELD_KEY = "SUBFIELD";
28     public static final String JavaDoc IGNORES_NAME_KEY = "IGNORESNAME";
29
30     // hack fuer die Strukturanzeige - alex
31
private boolean noName = false;
32
33     TKVector fieldList;
34     TKHashtable fields;
35     boolean ignoresOwnName;
36
37     /**
38      * Creates an empty field group control.
39      */

40     public TKFieldGroup() {};
41
42     public TKFieldGroup( String JavaDoc name, TKVector fields )
43     {
44         this( name, fields, null );
45     }
46
47     public TKFieldGroup( String JavaDoc name, TKVector fields, String JavaDoc showName )
48     {
49         this( name, fields, true, showName );
50     }
51
52     public TKFieldGroup( String JavaDoc name, TKVector fields, boolean ignoresOwnName, String JavaDoc showName )
53     {
54         initFieldGroup( "FIELDGROUP", name, fields, ignoresOwnName, showName );
55     }
56
57     /**
58         ueberschrieben, damit der NAME und SHOWNAME ausgegeben wird
59     */

60     public String JavaDoc getInternationalName()
61     {
62         if (noName)
63             return TKUploadField.toFilename(LanguageManager.getText(LANGUAGE_CONTEXT, fieldName));
64         else
65             return super.getInternationalName();
66     }
67
68     public final void initFieldGroup( String JavaDoc fieldType, String JavaDoc name, TKVector fields, boolean ignoresOwnName, String JavaDoc showName )
69     {
70         initBaseField( fieldType, name, showName );
71         this.fieldList = fields;
72         this.fields = getFieldHashFromList( fields );
73         this.ignoresOwnName = ignoresOwnName;
74         noName = true;
75     }
76
77     public void init( String JavaDoc fieldType, Object JavaDoc data )
78         throws
79             TKUnregisteredClassException,
80             ClassNotFoundException JavaDoc,
81             InstantiationException JavaDoc,
82             IllegalAccessException JavaDoc
83     {
84         super.init( fieldType, data );
85         TKHashtable groupData = (TKHashtable) data;
86
87         String JavaDoc sIgnores = ((String JavaDoc)groupData.get(IGNORES_NAME_KEY));
88         this.ignoresOwnName = sIgnores == null ? true : sIgnores.equals("YES");
89
90         this.fieldList = getListOfFields(
91             (TKFieldSwitchListData) groupData.get( SUB_LIST_KEY )
92         );
93         this.fields = getFieldHashFromList( fieldList );
94     }
95
96     /**
97      * Methode zur Definition von Gruppen von verschiedenen Eingabe-Objekte
98      */

99     public TKFieldGroup getDefGroup(TKFieldSwitch allSwitch, TKFieldSwitchList allSwitchList)
100     {
101         TKVector ignoresNameOptions = new TKVector(2);
102         ignoresNameOptions.addElement( new TKOptionFieldEntry( LanguageManager.getText(LanguageManager.GENERAL, "YES"), "YES" ) );
103         ignoresNameOptions.addElement( new TKOptionFieldEntry( LanguageManager.getText(LanguageManager.GENERAL, "NO"), "NO" ) );
104         TKBaseField [] groupArray =
105         {
106             new TKInputField(TKFieldGroup.NAME_KEY, TKInputField.SMALL_DEFAULT_SIZE, TKInputField.SMALL_DEFAULT_LENGTH, LanguageManager.getText(LANGUAGE_CONTEXT, "GROUP_NAME"), TKInputField.CHECK_STRING),
107             new TKInputField(TKFieldGroup.SHOW_NAME_KEY, TKInputField.LARGE_DEFAULT_SIZE, TKInputField.LARGE_DEFAULT_LENGTH, LanguageManager.getText(LANGUAGE_CONTEXT, "GROUP_SHOWNAME"), TKInputField.CHECK_STRING),
108             new TKCheckField(TKFieldGroup.IGNORES_NAME_KEY, LanguageManager.getText(LANGUAGE_CONTEXT, "GROUP_IGNORES_NAME"), ignoresNameOptions, false),
109             allSwitchList
110         };
111         TKFieldGroup groupGroup =
112             new TKFieldGroup( TKFieldGroup.CLASS_ID, new TKVector( groupArray ), LanguageManager.getText(LANGUAGE_CONTEXT, TKFieldGroup.CLASS_ID) );
113
114         return groupGroup;
115     }
116
117     public Object JavaDoc toData()
118     {
119         TKHashtable result = (TKHashtable) super.toData();
120         result.put( TKFieldGroup.IGNORES_NAME_KEY, ( ignoresOwnName ? "YES" : "NO" ) );
121         result.put( SUB_LIST_KEY, getDataOfAlternatives( fieldList ) );
122         return result;
123     }
124
125     public final String JavaDoc subPrefix( String JavaDoc prefix )
126     {
127         return prefix+fieldName+".";
128     }
129
130     public Object JavaDoc compileData( String JavaDoc prefix, TKHashtable data, TKHashtable context )
131     {
132         int nameCount = fieldList.size();
133         if( nameCount == 0 ) return new TKHashtable();
134
135         TKHashtable result = new TKHashtable( nameCount );
136
137         prefix = subPrefix( prefix );
138
139         for( int i=0; i<nameCount; i++ ) {
140             TKBaseField field = (TKBaseField) fieldList.get( i );
141             String JavaDoc name = field.getName();
142             result.put( name, field.compileData( prefix, data, context ) );
143         }
144
145         return result;
146     }
147
148     public Object JavaDoc compileData( String JavaDoc prefix, TKMarkupNode data, TKHashtable context )
149     {
150
151         TKXmlMarkup markup = data == null ? null : (TKXmlMarkup) data.markup;
152         if (markup == null) { return null;}
153
154         if (!markup.name.equals (getName())) {
155             return null;
156         }
157
158         TKXmlTree tree = (TKXmlTree) data.tree;
159         if (tree == null) { return null;}
160
161         TKHashtable subs = new TKHashtable (tree.size());
162
163         for (int i = 0; i < tree.size(); i++) {
164
165             Object JavaDoc obj = tree.getSub(i);
166             if (obj == null) continue;
167
168             TKMarkupNode subNode = null;
169             TKXmlMarkup subMarkup = null;
170
171             if (obj instanceof TKXmlMarkup) { // Atomares Markup
172

173                 subMarkup = (TKXmlMarkup) obj;
174                 subNode = new TKMarkupNode (subMarkup,null);
175             } else {
176                 subNode = (TKMarkupNode) obj;
177                 subMarkup = (TKXmlMarkup) subNode.markup;
178             }
179
180             subs.put (subMarkup.name,subNode);
181         }
182
183         int nameCount = fieldList.size();
184         if( nameCount == 0 ) return new TKHashtable();
185
186         TKHashtable result = new TKHashtable( nameCount );
187         prefix = subPrefix( prefix );
188
189         for( int i=0; i<nameCount; i++ ) {
190
191             TKBaseField field = (TKBaseField) fieldList.get( i );
192             String JavaDoc name = field.getName();
193
194             TKMarkupNode subNode = (TKMarkupNode) subs.get (name);
195             if (subNode == null) continue;
196
197             Object JavaDoc obj = field.compileData( prefix, subNode, context );
198             if (obj != null) result.put( name, obj );
199         }
200
201         return result;
202     }
203
204     public void fillIntoTemplate( TKHTMLTemplate t, Object JavaDoc data, String JavaDoc prefix )
205     {
206         TKHashtable dataHash = (TKHashtable) data;
207         super.fillIntoTemplate( t, data, prefix );
208
209         t.setListIterator( new TKFieldGroupIterator(
210             dataHash,
211             fieldList,
212             subPrefix( prefix ),
213             t.getListIterator(),
214             "FIELDGROUP"
215         ) );
216         t.set( "FIELDGROUP", Boolean.TRUE );
217     }
218
219     public void fillAttributesIntoNode(Element node, Object JavaDoc data) throws DOMException
220     {
221         super.fillAttributesIntoNode(node, data);
222         node.setAttribute (IGNORES_NAME_KEY, new Boolean JavaDoc(ignoresOwnName).toString());
223     }
224     /**
225         Feldklassen repraesentieren sich als DOM Baum
226         @param doc Documentroot zum Erzeugen weiterer Elemente
227         @param node Vaterknoten, an den weitere Knoten rangehaengt werden
228     */

229     public void fillIntoDOM(Document doc, Element node, Object JavaDoc data) throws DOMException
230     {
231         Element me = doc.createElement(getInternationalName());
232         node.appendChild(me);
233         fillAttributesIntoNode(me, data);
234         TKHashtable dataHash = (TKHashtable) data;
235         for (int i = 0; i < fieldList.size(); i++)
236         {
237             TKBaseField field = (TKBaseField) fieldList.get( i );
238             Object JavaDoc data2 = dataHash.get( field.getName() );
239             field.fillIntoDOM(doc, me, data2);
240         }
241     }
242
243     public void fillIntoPresentation( TKHTMLTemplate t, Object JavaDoc value, String JavaDoc scope )
244     {
245         TKHashtable dataHash = (TKHashtable) value;
246
247         if( !ignoresOwnName ) {
248             scope += "."+getName();
249         }
250         Enumeration JavaDoc e = fieldList.elements();
251         while( e.hasMoreElements() ) {
252             TKBaseField field = (TKBaseField) e.nextElement();
253             field.fillIntoPresentation( t, dataHash.get( field.getName() ), scope );
254         }
255     }
256
257     public Object JavaDoc getDefault()
258     {
259         int nameCount = fieldList.size();
260         if( nameCount == 0 ) return new TKHashtable();
261
262         TKHashtable result = new TKHashtable( nameCount );
263
264         for( int i=0; i<nameCount; i++ ) {
265             TKBaseField field = (TKBaseField) fieldList.get( i );
266             String JavaDoc name = field.getName();
267             result.put( name, field.getDefault() );
268         }
269
270         return result;
271     }
272
273     public Object JavaDoc modify( String JavaDoc action, String JavaDoc fieldPath, Object JavaDoc data, String JavaDoc prefix, StringBuffer JavaDoc destination )
274     {
275         TKHashtable dataHash = (TKHashtable) data;
276         int pLength = prefix.length()+fieldName.length();
277
278         if (fieldPath.length() != pLength)
279         {
280             // action betrifft Sub-ELement
281
int subNameEnd = fieldPath.indexOf('.',pLength+1);
282             String JavaDoc subName = ( subNameEnd < 0
283                 ? fieldPath.substring( pLength+1 )
284                 : fieldPath.substring( pLength+1, subNameEnd )
285             );
286             TKBaseField field = (TKBaseField) fields.get( subName );
287             dataHash.put( subName, field.modify(
288                 action, fieldPath, dataHash.get( subName ),
289                 prefix+fieldName+'.', destination
290             ) );
291         }
292         return data;
293     }
294
295     public TKBaseField getTarget(String JavaDoc fieldPath, String JavaDoc prefix)
296     {
297
298         TKBaseField field = null;
299         TKBaseField targetField = null;
300         int pLength = prefix.length()+fieldName.length();
301
302         if (fieldPath.length() != pLength)
303         {
304             // action betrifft Sub-ELement
305
int subNameEnd = fieldPath.indexOf('.',pLength+1);
306             String JavaDoc subName = ( subNameEnd < 0
307                 ? fieldPath.substring( pLength+1 )
308                 : fieldPath.substring( pLength+1, subNameEnd )
309             );
310             field = (TKBaseField) fields.get( subName );
311
312             targetField = field.getTarget(fieldPath, prefix+fieldName+'.');
313         }
314
315         return targetField;
316     }
317
318
319     public int insertDataIntoDB( TKContentDBData db, Object JavaDoc data, int contentId, int leftNr )
320     {
321         int nameCount = fieldList.size();
322         if( nameCount == 0 ) return leftNr;
323
324         TKContentNodeTableData node = insertNewContentNode( db, contentId, leftNr );
325         //int newNodeId = node.content_node_id;
326
TKHashtable dataHash = (TKHashtable) data;
327
328         leftNr++;
329         for( int i=0; i<nameCount; i++ ) {
330             TKBaseField field = (TKBaseField) fieldList.get( i );
331             leftNr = field.insertDataIntoDB( db, dataHash.get( field.getName() ), contentId, leftNr+1 );
332             leftNr++;
333         }
334         node.right_nr = leftNr;
335         return leftNr;
336     }
337
338     public Object JavaDoc getDataFromDB( TKContentDBData db )
339     {
340         int nameCount = fieldList.size();
341         if( nameCount == 0 ) return new TKHashtable();
342
343         TKHashtable result = new TKHashtable( nameCount );
344         TKContentNodeTableData node = getContentNodeFromDB( db );
345         TKContentNodeTableData subNode = peekNextContentNode( db );
346         while( subNode != null && subNode.left_nr > node.left_nr && subNode.right_nr < node.right_nr ) {
347             TKBaseField field = (TKBaseField) fields.get( subNode.name );
348             if( field != null ) {
349                 result.put( subNode.name, field.getDataFromDB( db ) );
350             }
351             else {
352                 removeNextContentNode( db );
353             }
354             subNode = peekNextContentNode( db );
355         }
356
357         for( int i=0; i<nameCount; i++ ) {
358             TKBaseField field = (TKBaseField) fieldList.get( i );
359             if( !result.containsKey( field.getName() ) ) {
360                 result.put( field.getName(), field.getDefault() );
361             }
362         }
363
364         return result;
365     }
366
367     public void clearId()
368     {
369         if( fieldId == -1 ) return;
370
371         fieldId = -1;
372         Enumeration JavaDoc e = fieldList.elements();
373         while( e.hasMoreElements() ) {
374             ((TKBaseField) e.nextElement()).clearId();
375         }
376     }
377
378     public int realInsertIntoDB( TKFormDBData db, int formId )
379     {
380         if( super.realInsertIntoDB( db, formId ) == -1 ) return -1;
381         insertNewFieldAttribute( db, formId, IGNORES_NAME_KEY, 0, String.valueOf( ignoresOwnName ) );
382         insertNewSubFieldList( db, formId, SUB_FIELD_KEY, fieldList );
383         return fieldId;
384     }
385
386     public void initFromDB( String JavaDoc classId, TKFormDBData db, TKVector otherFields )
387         throws
388             TKUnregisteredClassException,
389             ClassNotFoundException JavaDoc,
390             InstantiationException JavaDoc,
391             IllegalAccessException JavaDoc
392     {
393         super.initFromDB( classId, db, otherFields );
394         if( hasFieldAttribute( db, IGNORES_NAME_KEY, 0 ) ) {
395             ignoresOwnName = (new Boolean JavaDoc( getFieldAttribute( db, IGNORES_NAME_KEY, 0 ) )).booleanValue();
396         }
397         else {
398             ignoresOwnName = true;
399         }
400         fieldList = getSubFieldList( db, SUB_FIELD_KEY, otherFields );
401         fields = getFieldHashFromList( fieldList );
402     }
403
404     /**
405      * Checks wether this object and the specified object
406      * may be treated as equal.
407      *
408      * @param object the object to checked for equality.
409      * @return <CODE>true</CODE> if this object and the
410      * specified object may be treated as equal, otherwise
411      * <CODE>false</CODE>.
412      */

413     public boolean equals (Object JavaDoc object)
414     {
415         if (! super.equals(object))
416         {
417             return false;
418         }
419
420         TKFieldGroup field = (TKFieldGroup) object;
421
422         return (this.ignoresOwnName == field.ignoresOwnName) &&
423                (this.fieldList == null ? field.fieldList == null : this.fieldList.equals(field.fieldList));
424     }
425
426     /**
427      * Returns the hash code for this object.
428      *
429      * @return the hash code for this object.
430      */

431     public int hashCode ()
432     {
433         // Implementation for JTest only ;-(
434
return super.hashCode();
435     }
436
437 }
438
Popular Tags