1 package com.teamkonzept.field; 2 3 import java.util.Enumeration ; 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 18 public class TKFieldGroup 19 extends TKBaseField 20 { 21 23 26 public static final String CLASS_ID = "FIELDGROUP"; 27 public static final String SUB_FIELD_KEY = "SUBFIELD"; 28 public static final String IGNORES_NAME_KEY = "IGNORESNAME"; 29 30 private boolean noName = false; 32 33 TKVector fieldList; 34 TKHashtable fields; 35 boolean ignoresOwnName; 36 37 40 public TKFieldGroup() {}; 41 42 public TKFieldGroup( String name, TKVector fields ) 43 { 44 this( name, fields, null ); 45 } 46 47 public TKFieldGroup( String name, TKVector fields, String showName ) 48 { 49 this( name, fields, true, showName ); 50 } 51 52 public TKFieldGroup( String name, TKVector fields, boolean ignoresOwnName, String showName ) 53 { 54 initFieldGroup( "FIELDGROUP", name, fields, ignoresOwnName, showName ); 55 } 56 57 60 public String 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 fieldType, String name, TKVector fields, boolean ignoresOwnName, String 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 fieldType, Object data ) 78 throws 79 TKUnregisteredClassException, 80 ClassNotFoundException , 81 InstantiationException , 82 IllegalAccessException  83 { 84 super.init( fieldType, data ); 85 TKHashtable groupData = (TKHashtable) data; 86 87 String sIgnores = ((String )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 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 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 subPrefix( String prefix ) 126 { 127 return prefix+fieldName+"."; 128 } 129 130 public Object compileData( String 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 name = field.getName(); 142 result.put( name, field.compileData( prefix, data, context ) ); 143 } 144 145 return result; 146 } 147 148 public Object compileData( String 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 obj = tree.getSub(i); 166 if (obj == null) continue; 167 168 TKMarkupNode subNode = null; 169 TKXmlMarkup subMarkup = null; 170 171 if (obj instanceof TKXmlMarkup) { 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 name = field.getName(); 193 194 TKMarkupNode subNode = (TKMarkupNode) subs.get (name); 195 if (subNode == null) continue; 196 197 Object 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 data, String 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 data) throws DOMException 220 { 221 super.fillAttributesIntoNode(node, data); 222 node.setAttribute (IGNORES_NAME_KEY, new Boolean (ignoresOwnName).toString()); 223 } 224 229 public void fillIntoDOM(Document doc, Element node, Object 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 data2 = dataHash.get( field.getName() ); 239 field.fillIntoDOM(doc, me, data2); 240 } 241 } 242 243 public void fillIntoPresentation( TKHTMLTemplate t, Object value, String scope ) 244 { 245 TKHashtable dataHash = (TKHashtable) value; 246 247 if( !ignoresOwnName ) { 248 scope += "."+getName(); 249 } 250 Enumeration 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 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 name = field.getName(); 267 result.put( name, field.getDefault() ); 268 } 269 270 return result; 271 } 272 273 public Object modify( String action, String fieldPath, Object data, String prefix, StringBuffer destination ) 274 { 275 TKHashtable dataHash = (TKHashtable) data; 276 int pLength = prefix.length()+fieldName.length(); 277 278 if (fieldPath.length() != pLength) 279 { 280 int subNameEnd = fieldPath.indexOf('.',pLength+1); 282 String 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 fieldPath, String 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 int subNameEnd = fieldPath.indexOf('.',pLength+1); 306 String 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 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 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 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 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 classId, TKFormDBData db, TKVector otherFields ) 387 throws 388 TKUnregisteredClassException, 389 ClassNotFoundException , 390 InstantiationException , 391 IllegalAccessException  392 { 393 super.initFromDB( classId, db, otherFields ); 394 if( hasFieldAttribute( db, IGNORES_NAME_KEY, 0 ) ) { 395 ignoresOwnName = (new Boolean ( 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 413 public boolean equals (Object 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 431 public int hashCode () 432 { 433 return super.hashCode(); 435 } 436 437 } 438
| Popular Tags
|