Subversion Repository Public Repository

litesoft

Diff Revisions 949 vs 950 for /trunk/Java/GWT/OldServer/src/org/litesoft/GWT/forms/server/support/TypeHelper.java

Diff revisions: vs.
  @@ -1,477 +1,477 @@
1 - // This Source Code is in the Public Domain per: http://unlicense.org
2 - package org.litesoft.GWT.forms.server.support;
3 -
4 - import org.litesoft.GWT.forms.server.*;
5 - import org.litesoft.GWT.forms.server.support.converters.*;
6 - import org.litesoft.GWT.forms.server.support.mdconstruction.*;
7 - import org.litesoft.GWT.forms.server.support.nonpublic.*;
8 - import org.litesoft.commonfoundation.typeutils.Objects;
9 - import org.litesoft.commonfoundation.typeutils.*;
10 - import org.litesoft.core.simpletypes.*;
11 - import org.litesoft.core.simpletypes.currency.*;
12 - import org.litesoft.core.simpletypes.temporal.*;
13 - import org.litesoft.ui.def.nonpublic.support.*;
14 - import org.litesoft.ui.support.*;
15 - import org.litesoft.ui_1_5.*;
16 - import org.litesoft.ui_1_5.def.*;
17 -
18 - import java.util.*;
19 - import java.util.concurrent.atomic.*;
20 -
21 - public abstract class TypeHelper implements UI.Hints {
22 - private AtomicBoolean mDisposed = new AtomicBoolean( false );
23 - private FSPTypeHelperBackDoor mBackDoor;
24 - protected ExternalizationInterface mExternalization;
25 - protected FormAccessControl mAccessControl;
26 - protected TypeHelper mParent;
27 - protected String mRelativeType;
28 - private Integer mFormUniqueID;
29 - private boolean mBaseForm;
30 - protected String mRelToThisSubForm = null;
31 - private Set<ActionMetaData> mActions = new HashSet<ActionMetaData>();
32 - protected Map<Integer, AMDconverterPair> mAMDconvertPairsByAttributeID =
33 - new HashMap<Integer, AMDconverterPair>();
34 - protected AMDconverterPair[] mAMDconvertPairs;
35 - protected Map<String, TypeHelper[]> mRelSubFormRefToTypes = new HashMap<String, TypeHelper[]>();
36 -
37 - protected TypeHelper( FSPTypeHelperBackDoor pBackDoor, //
38 - ExternalizationInterface pExternalization, //
39 - FormAccessControl pAccessControl, //
40 - TypeHelper pParent, String pRelativeType, FormUsage pUsage ) {
41 - Objects.assertNotNull( "BackDoor", mBackDoor = pBackDoor );
42 - mExternalization = pExternalization.addContext( pRelativeType );
43 - mAccessControl = pAccessControl.addContext( pRelativeType );
44 - mParent = pParent;
45 - mRelativeType = pRelativeType;
46 - mFormUniqueID = pUsage.getUniqueID();
47 - if ( !(mBaseForm = pUsage.isBaseForm()) ) {
48 - mRelToThisSubForm = pUsage.getRelAttributeRef();
49 - }
50 - }
51 -
52 - public ExternalizationInterface getExternalization() {
53 - return mExternalization;
54 - }
55 -
56 - public FormMetaData initializeAndCreateFormMetaData( FormUsage pUsage ) {
57 - FormMetaData zFMD = new FormMetaData( pUsage );
58 -
59 - LLprocess( zFMD, pUsage );
60 -
61 - Collection<AMDconverterPair> pairs = mAMDconvertPairsByAttributeID.values();
62 - mAMDconvertPairs = pairs.toArray( new AMDconverterPair[pairs.size()] );
63 -
64 - return zFMD;
65 - }
66 -
67 - public TypeHelper getParent() {
68 - return mParent;
69 - }
70 -
71 - public String getRelativeType() {
72 - return mRelativeType;
73 - }
74 -
75 - public String getRelToThisSubForm() {
76 - return mRelToThisSubForm;
77 - }
78 -
79 - public boolean isBaseForm() {
80 - return mBaseForm;
81 - }
82 -
83 - public ServicePeerToFormDataProxy getCollectorProxy() {
84 - return mBackDoor.getCollectorProxy();
85 - }
86 -
87 - public AMDconverterPair[] getAMDconvertPairs() {
88 - return mAMDconvertPairs;
89 - }
90 -
91 - public Map<String, TypeHelper[]> getRelSubFormRefToTypes() {
92 - return mRelSubFormRefToTypes;
93 - }
94 -
95 - public Integer getFormUniqueID() {
96 - return mFormUniqueID;
97 - }
98 -
99 - public String resolveError( String pErrorID ) {
100 - return mExternalization.resolveError( pErrorID );
101 - }
102 -
103 - public final boolean isDisposed() {
104 - return mDisposed.get();
105 - }
106 -
107 - public final void dispose() {
108 - if ( !mDisposed.getAndSet( true ) ) // set true and test for false
109 - {
110 - try {
111 - LLdispose();
112 - }
113 - catch ( RuntimeException e ) {
114 - FormServicePeer.LOGGER.error.log( e );
115 - }
116 - }
117 - }
118 -
119 - protected void LLdispose() {
120 - }
121 -
122 - public AMDconverterPair findAttribute( Integer uniqueId ) {
123 - return mAMDconvertPairsByAttributeID.get( uniqueId );
124 - }
125 -
126 - public List<AttributeUpdateFormData> findAttributeUpdateFormDataByName( String pName ) {
127 - List<AttributeUpdateFormData> zLocalList = new ArrayList<AttributeUpdateFormData>();
128 - for ( AMDconverterPair pair : mAMDconvertPairs ) {
129 - AttributeMetaData meta = pair.getAttributeMetaData();
130 - if ( pName.toLowerCase().equals(
131 - meta.getAttributeReference().toLowerCase() ) ) // todo: Use Case Insensitive Compare
132 - {
133 - zLocalList.add( new AttributeUpdateFormData( null, meta ) );
134 - }
135 - }
136 -
137 - return zLocalList;
138 - }
139 -
140 - public List<ActionMetaData> findActionUpdateFormDataByName( String pName ) {
141 - List<ActionMetaData> zLocalList = new ArrayList<ActionMetaData>();
142 - for ( ActionMetaData data : mActions ) {
143 - if ( data.getActionID().equals( pName ) ) {
144 - zLocalList.add( data );
145 - }
146 - }
147 -
148 - return zLocalList;
149 - }
150 -
151 - public List<String> getActionIDs() {
152 - List<String> result = new ArrayList<String>();
153 - for ( ActionMetaData data : mActions ) {
154 - result.add( data.getActionID() );
155 - }
156 - return result;
157 - }
158 -
159 - public List<String> getAttributeNames() {
160 - List<String> result = new ArrayList<String>();
161 - for ( AMDconverterPair ap : getAMDconvertPairs() ) {
162 - AttributeMetaData meta = ap.getAttributeMetaData();
163 - if ( meta != null ) {
164 - result.add( meta.getAttributeReference() );
165 - }
166 - }
167 - return result;
168 - }
169 -
170 - public boolean actionRequest( String pActionID, boolean pInputAction,
171 - InstanceHelper pParentInstanceHelper ) {
172 - return !mBaseForm && "AddRow".equals( pActionID ) && createNewRow( pParentInstanceHelper );
173 - }
174 -
175 - /**
176 - * Only called for Non-BaseForms
177 - *
178 - * @param pParentInstanceHelper
179 - *
180 - * @return true if successful
181 - */
182 - protected boolean createNewRow( InstanceHelper pParentInstanceHelper ) {
183 - return false;
184 - }
185 -
186 - private void LLprocess( FormMetaData pFMD, FormUsage pUsage ) {
187 - process( pFMD, pUsage.getLabels() );
188 - process( pFMD, pUsage.getActions() );
189 - process( pFMD, pUsage.getAttributes() );
190 - process( pFMD, pUsage.getRelSubForms() );
191 - }
192 -
193 - protected void process( FormMetaData pFMD, FormUsage[] pRelSubFormUsages ) {
194 - for ( FormUsage usage : pRelSubFormUsages ) {
195 - String zRelAttributeRef = usage.getRelAttributeRef();
196 - String zRelRootType = determineRelSubFormRootType( zRelAttributeRef );
197 - TypeHelper typeHelper = mBackDoor.createTypeHelper( mBackDoor, mExternalization, mAccessControl,
198 - this, zRelRootType, usage );
199 - mBackDoor.add( typeHelper );
200 - pFMD.addRelSubForm( typeHelper.initializeAndCreateFormMetaData( usage ) );
201 - TypeHelper[] zTypeHelpers = mRelSubFormRefToTypes.get( zRelAttributeRef );
202 - if ( zTypeHelpers == null ) {
203 - zTypeHelpers = new TypeHelper[]{typeHelper};
204 - } else {
205 - TypeHelper[] newHelpers = new TypeHelper[zTypeHelpers.length + 1];
206 - System.arraycopy( zTypeHelpers, 0, newHelpers, 0, zTypeHelpers.length );
207 - newHelpers[zTypeHelpers.length] = typeHelper;
208 - zTypeHelpers = newHelpers;
209 - }
210 - mRelSubFormRefToTypes.put( zRelAttributeRef, zTypeHelpers );
211 - }
212 - }
213 -
214 - abstract protected String determineRelSubFormRootType( String pRelAttributeRef );
215 -
216 - protected void process( FormMetaData pFMD, LabelUsage[] pUsages ) {
217 - for ( LabelUsage usage : pUsages ) {
218 - String zLabelID = usage.getLabelID();
219 - pFMD.addLabel( new LabelMetaData( usage, resolveLabel( zLabelID ) ) );
220 - }
221 - }
222 -
223 - protected void process( FormMetaData pFMD, ActionUsage[] pUsages ) {
224 - for ( ActionUsage usage : pUsages ) {
225 - String zExtLabelID = usage.getExtLabelID();
226 - ActionMetaData actionMetaData = new ActionMetaData( usage, //
227 - !allowAction( usage.getActionID() ), //
228 - resolveAction( zExtLabelID ), //
229 - resolveActionTooltip( zExtLabelID ) );
230 - mActions.add( actionMetaData );
231 - pFMD.addAction( actionMetaData );
232 - }
233 - if ( !mBaseForm ) {
234 - addSubFormManagementImageAction( pFMD, "AddRow", "AddNew" );
235 - addSubFormManagementImageAction( pFMD, "RemoveRow", "RemoveThis" );
236 - }
237 - }
238 -
239 - private void addSubFormManagementImageAction( FormMetaData pFMD, String pActionID, String pWhat ) {
240 - String zTooltip = resolveActionTooltip( pActionID );
241 - if ( Strings.isNullOrEmpty( zTooltip ) ) {
242 - zTooltip = resolveLabel( pWhat + cleanUpRelativeTypeForToolTip( mRelativeType ) );
243 - }
244 - pFMD.addAction( new ActionMetaData( pActionID, !allowAction( pActionID ), //
245 - pActionID, // // No need to Resolve - won't use!
246 - zTooltip ) );
247 - }
248 -
249 - protected String cleanUpRelativeTypeForToolTip( String pRelativeType ) {
250 - return pRelativeType;
251 - }
252 -
253 - protected boolean allowAction( String pActionID ) {
254 - return mAccessControl.allowAction( pActionID );
255 - }
256 -
257 - protected String resolveAction( String pActionID ) {
258 - return mExternalization.resolveAction( pActionID );
259 - }
260 -
261 - protected String resolveActionTooltip( String pActionID ) {
262 - return mExternalization.resolveActionTooltip( pActionID );
263 - }
264 -
265 - public String resolveLabel( String pLabelID ) {
266 - return mExternalization.resolveLabel( pLabelID );
267 - }
268 -
269 - protected void process( FormMetaData pFMD, AttributeUsage[] pUsages ) {
270 - for ( AttributeUsage usage : pUsages ) {
271 - process( pFMD, usage, usage.getAttributeReference() );
272 - }
273 - }
274 -
275 - protected void process( FormMetaData pFMD, AttributeUsage pUsage, String pReference ) {
276 - DottedReference.Parts parts = DottedReference.parse( pReference );
277 - String localReference = parts.getLocalReference();
278 - if ( !validAttributeReference( localReference ) ) {
279 - throw new IllegalArgumentException(
280 - this + " does Not Support an Attribute reference of: '" + localReference + "'" );
281 - }
282 - if ( parts.getRestOfReference() != null ) {
283 - throw new IllegalArgumentException(
284 - this + " does Not Support dotted references yet like: '" + pReference + "'" );
285 - }
286 - AMDconverterPair zAMDcvtr = //
287 - createAttributeMetaData( new CreateAMDParams( mExternalization, //
288 - localReference, //
289 - pUsage, //
290 - allowAttribute( localReference ) ) );
291 - mAMDconvertPairsByAttributeID.put( zAMDcvtr.getAttributeMetaData().getUniqueID(), zAMDcvtr );
292 - pFMD.addAttribute( zAMDcvtr.getAttributeMetaData() );
293 - }
294 -
295 - protected FormAccessControl.Field allowAttribute( String pAttributeLocalReference ) {
296 - return mAccessControl.getFieldControl( pAttributeLocalReference );
297 - }
298 -
299 - abstract protected boolean validAttributeReference( String pLocalReference );
300 -
301 - abstract protected AMDconverterPair createAttributeMetaData( CreateAMDParams pParams );
302 -
303 - protected AMDconverterPair createInvalidAttributeRef( CreateAMDParams pParams, String pLabelSuffix,
304 - String pTooltip ) {
305 - return createAttributeMetaData( new BadAttributeParamsPlus( pParams, pLabelSuffix, pTooltip ), //
306 - null, false, // options
307 - String.class ); // type
308 - }
309 -
310 - protected AMDconverterPair createAttributeMetaData( CreateAMDParamsPlus pParams, //
311 - // !Global & Not from Usage
312 - Object[] pValidOptions, //
313 - boolean pAssumeValidOptions, //
314 - Class pFieldType ) {
315 - FormAttributeMetaDataFactory zAMDFactory = mAMDFactoriesByFieldType.get( pFieldType );
316 - if ( (zAMDFactory == null) && !pFieldType.isEnum() ) {
317 - return new AMDconverterPair( SendableUnknownDataTypeConverter.INSTANCE,
318 - new UnknownDataTypeMetaData( pParams.getUsage() ) );
319 - }
320 - return createAttributeMetaData( pParams, //
321 - // !Global & Not from Usage
322 - pValidOptions, pAssumeValidOptions, //
323 - zAMDFactory, null );
324 - }
325 -
326 - protected AMDconverterPair createAttributeMetaData( CreateAMDParamsPlus pParams, //
327 - // !Global & Not from Usage
328 - Object[] pValidOptions, //
329 - boolean pAssumeValidOptions, //
330 - FormAttributeMetaDataFactory pAMDFactory, //
331 - FormSendableDataConverter pDataConverter ) {
332 - IntendedUse zIntendedUse = pParams.getUsage().getIntendedUse();
333 - if ( zIntendedUse.isJustData() ) {
334 - FormSendableDataConverter zFormSendableDataConverter = pParams.isHide() ?
335 - SendableHideDataStringConverter.INSTANCE :
336 - SendableStringConverter.INSTANCE;
337 - return new AMDconverterPair( zFormSendableDataConverter, //
338 - new ViewAsStringMetaData( pParams.getUsage() ) );
339 - }
340 - if ( pParams.isHide() ) {
341 - return PasswordFieldFormAMD.INSTANCE.create( pParams );
342 - }
343 - String zFormHint = pParams.getHintValue( COMPONENT_FORM );
344 - if ( CF_TEXT_FIELD.equals( zFormHint ) || CF_TEXT_FIELD_RIGHT_ALIGNED.equals( zFormHint ) ) {
345 - return TextFieldFormAMD.INSTANCE.create( pParams );
346 - }
347 - String[] zHintedValidOptions = parseHintValidOptions( pParams.getHintValue( VALID_OPTIONS ) );
348 - if ( pAssumeValidOptions || //
349 - Objects.isNotNullOrEmpty( pValidOptions ) || Objects.isNotNullOrEmpty( zHintedValidOptions ) ) {
350 - AbstractSendableKeyValuePairConverter converter = //
351 - (pDataConverter instanceof AbstractSendableKeyValuePairConverter) ? //
352 - (AbstractSendableKeyValuePairConverter) pDataConverter :
353 - new SendableExternalizedKeyValuePairConverter( mExternalization );
354 - SimpleKeyValuePair[] zMDoptions =
355 - converter.createValidOptions( pValidOptions, zHintedValidOptions );
356 -
357 - if ( pParams.getUsage() instanceof InputImageAttributeUsage ) {
358 - AttributeMetaData zMetaData;
359 - if ( Objects.isNullOrEmpty( zMDoptions ) ) {
360 - zMetaData = new InputImageMetaData( pParams.getUsage(), //
361 - pParams.isDisabled(), //
362 - pParams.getHints(), //
363 - pParams.getFieldLabel(), //
364 - pParams.getFieldTooltip(), //
365 - pParams.isRequired(), //
366 - pParams.getErrorTextForRequired() );
367 - } else {
368 - zMetaData = new InputImageValidOptionsAttributeMetaData( pParams.getUsage(), //
369 - pParams.isDisabled(), //
370 - pParams.getFieldLabel(), //
371 - pParams.getFieldTooltip(), //
372 - pParams.isRequired(), //
373 - pParams.getErrorTextForRequired(),
374 - //
375 - zMDoptions );
376 - }
377 - return new AMDconverterPair( converter, zMetaData );
378 - }
379 - if ( pParams.isEditRequired() && CF_RADIO_GROUP.equals( zFormHint ) ) {
380 - return RadioGroupFormAMD.INSTANCE.create( pParams, converter, zMDoptions );
381 - }
382 - return ComboBoxFormAMD.INSTANCE.create( pParams, converter, zMDoptions );
383 - }
384 - if ( pAMDFactory == null ) {
385 - throw new IllegalStateException( "No Factory & No ValidOptions?" );
386 - }
387 - return pAMDFactory.createAttributeMetaData( pParams );
388 - }
389 -
390 - protected String[] parseHintValidOptions( String pHintValue ) {
391 - return Strings.parseOptions( pHintValue );
392 - }
393 -
394 - public void removeInstanceHelper( String pRowKey ) {
395 - mBackDoor.removeInstanceHelper( new FormDataRowKey( getFormUniqueID(), pRowKey ) );
396 - }
397 -
398 - public InstanceHelper createRelSubInstanceHelper( InstanceHelper pParent, String pRowKey ) {
399 - InstanceHelper rv = LLcreateRelSubInstanceHelper( pParent, pRowKey );
400 - mBackDoor.add( rv );
401 - return rv;
402 - }
403 -
404 - abstract protected InstanceHelper LLcreateRelSubInstanceHelper( InstanceHelper pParent, String pRowKey );
405 -
406 - public AttributeResourceOptionsResponseData getResourceOptions( String pAttributeReference,
407 - FormSendableDataConverter pDataConverter ) {
408 - return new AttributeResourceOptionsResponseData( ResourceOptionsErrorType.ErrorNotImplemented );
409 - }
410 -
411 - private static class BadAttributeParamsPlus extends CreateAMDParamsPlus {
412 - private String mLabelSuffix;
413 - private String mTooltip;
414 -
415 - public BadAttributeParamsPlus( CreateAMDParams pParams, String pLabelSuffix, String pTooltip ) {
416 - super( pParams, null, // HintManager
417 - false, // Required
418 - true, // Disabled
419 - false, // Hide
420 - null, // MaxChars
421 - null, // DisplayLines
422 - null ); // DisplayCharsWidth
423 - mLabelSuffix = pLabelSuffix;
424 - mTooltip = pTooltip;
425 - }
426 -
427 - public String getFieldLabel() {
428 - return super.getFieldLabel() + mLabelSuffix;
429 - }
430 -
431 - public String getFieldTooltip() {
432 - return mTooltip;
433 - }
434 - }
435 -
436 - private static final Map<Class, FormAttributeMetaDataFactory> mAMDFactoriesByFieldType =
437 - new HashMap<Class, FormAttributeMetaDataFactory>();
438 -
439 - private static void add( Class pClass, FormAttributeMetaDataFactory pFactory ) {
440 - mAMDFactoriesByFieldType.put( pClass, pFactory );
441 - }
442 -
443 - static {
444 - add( String.class, FormAMDFactory_String.INSTANCE );
445 -
446 - add( FloatingPointLong.class, FormAMDFactory_SimpleFloatingPointLong.INSTANCE );
447 -
448 - add( FixedPointLong.class, FormAMDFactory_SimpleFixedPointLong.INSTANCE );
449 -
450 - add( Money.class, FormAMDFactory_SimpleMoney.INSTANCE );
451 -
452 - add( SimpleTime.class, FormAMDFactory_SimpleTime.INSTANCE );
453 - add( java.sql.Time.class, FormAMDFactory_SimpleTime.INSTANCE );
454 -
455 - add( SimpleTimestamp.class, FormAMDFactory_SimpleTimestamp.INSTANCE );
456 - add( java.sql.Timestamp.class, FormAMDFactory_SimpleTimestamp.INSTANCE );
457 -
458 - add( CalendarYMD.class, FormAMDFactory_CalendarYMD.INSTANCE );
459 - add( java.sql.Date.class, FormAMDFactory_CalendarYMD.INSTANCE );
460 -
461 - add( Boolean.class, FormAMDFactory_Boolean.INSTANCE );
462 - add( boolean.class, FormAMDFactory_Boolean.INSTANCE );
463 -
464 - add( double.class, FormAMDFactory_Double.INSTANCE );
465 - add( Double.class, FormAMDFactory_Double.INSTANCE );
466 -
467 - add( float.class, FormAMDFactory_Float.INSTANCE );
468 - add( Float.class, FormAMDFactory_Float.INSTANCE );
469 -
470 - add( short.class, FormAMDFactory_Long.SHORT );
471 - add( Short.class, FormAMDFactory_Long.SHORT );
472 - add( int.class, FormAMDFactory_Long.INTEGER );
473 - add( Integer.class, FormAMDFactory_Long.INTEGER );
474 - add( long.class, FormAMDFactory_Long.LONG );
475 - add( Long.class, FormAMDFactory_Long.LONG );
476 - }
477 - }
1 + // This Source Code is in the Public Domain per: http://unlicense.org
2 + package org.litesoft.GWT.forms.server.support;
3 +
4 + import org.litesoft.GWT.forms.server.*;
5 + import org.litesoft.GWT.forms.server.support.converters.*;
6 + import org.litesoft.GWT.forms.server.support.mdconstruction.*;
7 + import org.litesoft.GWT.forms.server.support.nonpublic.*;
8 + import org.litesoft.commonfoundation.base.*;
9 + import org.litesoft.commonfoundation.typeutils.*;
10 + import org.litesoft.core.simpletypes.*;
11 + import org.litesoft.core.simpletypes.currency.*;
12 + import org.litesoft.core.simpletypes.temporal.*;
13 + import org.litesoft.ui.def.nonpublic.support.*;
14 + import org.litesoft.ui.support.*;
15 + import org.litesoft.ui_1_5.*;
16 + import org.litesoft.ui_1_5.def.*;
17 +
18 + import java.util.*;
19 + import java.util.concurrent.atomic.*;
20 +
21 + public abstract class TypeHelper implements UI.Hints {
22 + private AtomicBoolean mDisposed = new AtomicBoolean( false );
23 + private FSPTypeHelperBackDoor mBackDoor;
24 + protected ExternalizationInterface mExternalization;
25 + protected FormAccessControl mAccessControl;
26 + protected TypeHelper mParent;
27 + protected String mRelativeType;
28 + private Integer mFormUniqueID;
29 + private boolean mBaseForm;
30 + protected String mRelToThisSubForm = null;
31 + private Set<ActionMetaData> mActions = new HashSet<ActionMetaData>();
32 + protected Map<Integer, AMDconverterPair> mAMDconvertPairsByAttributeID =
33 + new HashMap<Integer, AMDconverterPair>();
34 + protected AMDconverterPair[] mAMDconvertPairs;
35 + protected Map<String, TypeHelper[]> mRelSubFormRefToTypes = new HashMap<String, TypeHelper[]>();
36 +
37 + protected TypeHelper( FSPTypeHelperBackDoor pBackDoor, //
38 + ExternalizationInterface pExternalization, //
39 + FormAccessControl pAccessControl, //
40 + TypeHelper pParent, String pRelativeType, FormUsage pUsage ) {
41 + Confirm.isNotNull( "BackDoor", mBackDoor = pBackDoor );
42 + mExternalization = pExternalization.addContext( pRelativeType );
43 + mAccessControl = pAccessControl.addContext( pRelativeType );
44 + mParent = pParent;
45 + mRelativeType = pRelativeType;
46 + mFormUniqueID = pUsage.getUniqueID();
47 + if ( !(mBaseForm = pUsage.isBaseForm()) ) {
48 + mRelToThisSubForm = pUsage.getRelAttributeRef();
49 + }
50 + }
51 +
52 + public ExternalizationInterface getExternalization() {
53 + return mExternalization;
54 + }
55 +
56 + public FormMetaData initializeAndCreateFormMetaData( FormUsage pUsage ) {
57 + FormMetaData zFMD = new FormMetaData( pUsage );
58 +
59 + LLprocess( zFMD, pUsage );
60 +
61 + Collection<AMDconverterPair> pairs = mAMDconvertPairsByAttributeID.values();
62 + mAMDconvertPairs = pairs.toArray( new AMDconverterPair[pairs.size()] );
63 +
64 + return zFMD;
65 + }
66 +
67 + public TypeHelper getParent() {
68 + return mParent;
69 + }
70 +
71 + public String getRelativeType() {
72 + return mRelativeType;
73 + }
74 +
75 + public String getRelToThisSubForm() {
76 + return mRelToThisSubForm;
77 + }
78 +
79 + public boolean isBaseForm() {
80 + return mBaseForm;
81 + }
82 +
83 + public ServicePeerToFormDataProxy getCollectorProxy() {
84 + return mBackDoor.getCollectorProxy();
85 + }
86 +
87 + public AMDconverterPair[] getAMDconvertPairs() {
88 + return mAMDconvertPairs;
89 + }
90 +
91 + public Map<String, TypeHelper[]> getRelSubFormRefToTypes() {
92 + return mRelSubFormRefToTypes;
93 + }
94 +
95 + public Integer getFormUniqueID() {
96 + return mFormUniqueID;
97 + }
98 +
99 + public String resolveError( String pErrorID ) {
100 + return mExternalization.resolveError( pErrorID );
101 + }
102 +
103 + public final boolean isDisposed() {
104 + return mDisposed.get();
105 + }
106 +
107 + public final void dispose() {
108 + if ( !mDisposed.getAndSet( true ) ) // set true and test for false
109 + {
110 + try {
111 + LLdispose();
112 + }
113 + catch ( RuntimeException e ) {
114 + FormServicePeer.LOGGER.error.log( e );
115 + }
116 + }
117 + }
118 +
119 + protected void LLdispose() {
120 + }
121 +
122 + public AMDconverterPair findAttribute( Integer uniqueId ) {
123 + return mAMDconvertPairsByAttributeID.get( uniqueId );
124 + }
125 +
126 + public List<AttributeUpdateFormData> findAttributeUpdateFormDataByName( String pName ) {
127 + List<AttributeUpdateFormData> zLocalList = new ArrayList<AttributeUpdateFormData>();
128 + for ( AMDconverterPair pair : mAMDconvertPairs ) {
129 + AttributeMetaData meta = pair.getAttributeMetaData();
130 + if ( pName.toLowerCase().equals(
131 + meta.getAttributeReference().toLowerCase() ) ) // todo: Use Case Insensitive Compare
132 + {
133 + zLocalList.add( new AttributeUpdateFormData( null, meta ) );
134 + }
135 + }
136 +
137 + return zLocalList;
138 + }
139 +
140 + public List<ActionMetaData> findActionUpdateFormDataByName( String pName ) {
141 + List<ActionMetaData> zLocalList = new ArrayList<ActionMetaData>();
142 + for ( ActionMetaData data : mActions ) {
143 + if ( data.getActionID().equals( pName ) ) {
144 + zLocalList.add( data );
145 + }
146 + }
147 +
148 + return zLocalList;
149 + }
150 +
151 + public List<String> getActionIDs() {
152 + List<String> result = new ArrayList<String>();
153 + for ( ActionMetaData data : mActions ) {
154 + result.add( data.getActionID() );
155 + }
156 + return result;
157 + }
158 +
159 + public List<String> getAttributeNames() {
160 + List<String> result = new ArrayList<String>();
161 + for ( AMDconverterPair ap : getAMDconvertPairs() ) {
162 + AttributeMetaData meta = ap.getAttributeMetaData();
163 + if ( meta != null ) {
164 + result.add( meta.getAttributeReference() );
165 + }
166 + }
167 + return result;
168 + }
169 +
170 + public boolean actionRequest( String pActionID, boolean pInputAction,
171 + InstanceHelper pParentInstanceHelper ) {
172 + return !mBaseForm && "AddRow".equals( pActionID ) && createNewRow( pParentInstanceHelper );
173 + }
174 +
175 + /**
176 + * Only called for Non-BaseForms
177 + *
178 + * @param pParentInstanceHelper
179 + *
180 + * @return true if successful
181 + */
182 + protected boolean createNewRow( InstanceHelper pParentInstanceHelper ) {
183 + return false;
184 + }
185 +
186 + private void LLprocess( FormMetaData pFMD, FormUsage pUsage ) {
187 + process( pFMD, pUsage.getLabels() );
188 + process( pFMD, pUsage.getActions() );
189 + process( pFMD, pUsage.getAttributes() );
190 + process( pFMD, pUsage.getRelSubForms() );
191 + }
192 +
193 + protected void process( FormMetaData pFMD, FormUsage[] pRelSubFormUsages ) {
194 + for ( FormUsage usage : pRelSubFormUsages ) {
195 + String zRelAttributeRef = usage.getRelAttributeRef();
196 + String zRelRootType = determineRelSubFormRootType( zRelAttributeRef );
197 + TypeHelper typeHelper = mBackDoor.createTypeHelper( mBackDoor, mExternalization, mAccessControl,
198 + this, zRelRootType, usage );
199 + mBackDoor.add( typeHelper );
200 + pFMD.addRelSubForm( typeHelper.initializeAndCreateFormMetaData( usage ) );
201 + TypeHelper[] zTypeHelpers = mRelSubFormRefToTypes.get( zRelAttributeRef );
202 + if ( zTypeHelpers == null ) {
203 + zTypeHelpers = new TypeHelper[]{typeHelper};
204 + } else {
205 + TypeHelper[] newHelpers = new TypeHelper[zTypeHelpers.length + 1];
206 + System.arraycopy( zTypeHelpers, 0, newHelpers, 0, zTypeHelpers.length );
207 + newHelpers[zTypeHelpers.length] = typeHelper;
208 + zTypeHelpers = newHelpers;
209 + }
210 + mRelSubFormRefToTypes.put( zRelAttributeRef, zTypeHelpers );
211 + }
212 + }
213 +
214 + abstract protected String determineRelSubFormRootType( String pRelAttributeRef );
215 +
216 + protected void process( FormMetaData pFMD, LabelUsage[] pUsages ) {
217 + for ( LabelUsage usage : pUsages ) {
218 + String zLabelID = usage.getLabelID();
219 + pFMD.addLabel( new LabelMetaData( usage, resolveLabel( zLabelID ) ) );
220 + }
221 + }
222 +
223 + protected void process( FormMetaData pFMD, ActionUsage[] pUsages ) {
224 + for ( ActionUsage usage : pUsages ) {
225 + String zExtLabelID = usage.getExtLabelID();
226 + ActionMetaData actionMetaData = new ActionMetaData( usage, //
227 + !allowAction( usage.getActionID() ), //
228 + resolveAction( zExtLabelID ), //
229 + resolveActionTooltip( zExtLabelID ) );
230 + mActions.add( actionMetaData );
231 + pFMD.addAction( actionMetaData );
232 + }
233 + if ( !mBaseForm ) {
234 + addSubFormManagementImageAction( pFMD, "AddRow", "AddNew" );
235 + addSubFormManagementImageAction( pFMD, "RemoveRow", "RemoveThis" );
236 + }
237 + }
238 +
239 + private void addSubFormManagementImageAction( FormMetaData pFMD, String pActionID, String pWhat ) {
240 + String zTooltip = resolveActionTooltip( pActionID );
241 + if ( Currently.isNullOrEmpty( zTooltip ) ) {
242 + zTooltip = resolveLabel( pWhat + cleanUpRelativeTypeForToolTip( mRelativeType ) );
243 + }
244 + pFMD.addAction( new ActionMetaData( pActionID, !allowAction( pActionID ), //
245 + pActionID, // // No need to Resolve - won't use!
246 + zTooltip ) );
247 + }
248 +
249 + protected String cleanUpRelativeTypeForToolTip( String pRelativeType ) {
250 + return pRelativeType;
251 + }
252 +
253 + protected boolean allowAction( String pActionID ) {
254 + return mAccessControl.allowAction( pActionID );
255 + }
256 +
257 + protected String resolveAction( String pActionID ) {
258 + return mExternalization.resolveAction( pActionID );
259 + }
260 +
261 + protected String resolveActionTooltip( String pActionID ) {
262 + return mExternalization.resolveActionTooltip( pActionID );
263 + }
264 +
265 + public String resolveLabel( String pLabelID ) {
266 + return mExternalization.resolveLabel( pLabelID );
267 + }
268 +
269 + protected void process( FormMetaData pFMD, AttributeUsage[] pUsages ) {
270 + for ( AttributeUsage usage : pUsages ) {
271 + process( pFMD, usage, usage.getAttributeReference() );
272 + }
273 + }
274 +
275 + protected void process( FormMetaData pFMD, AttributeUsage pUsage, String pReference ) {
276 + DottedReference.Parts parts = DottedReference.parse( pReference );
277 + String localReference = parts.getLocalReference();
278 + if ( !validAttributeReference( localReference ) ) {
279 + throw new IllegalArgumentException(
280 + this + " does Not Support an Attribute reference of: '" + localReference + "'" );
281 + }
282 + if ( parts.getRestOfReference() != null ) {
283 + throw new IllegalArgumentException(
284 + this + " does Not Support dotted references yet like: '" + pReference + "'" );
285 + }
286 + AMDconverterPair zAMDcvtr = //
287 + createAttributeMetaData( new CreateAMDParams( mExternalization, //
288 + localReference, //
289 + pUsage, //
290 + allowAttribute( localReference ) ) );
291 + mAMDconvertPairsByAttributeID.put( zAMDcvtr.getAttributeMetaData().getUniqueID(), zAMDcvtr );
292 + pFMD.addAttribute( zAMDcvtr.getAttributeMetaData() );
293 + }
294 +
295 + protected FormAccessControl.Field allowAttribute( String pAttributeLocalReference ) {
296 + return mAccessControl.getFieldControl( pAttributeLocalReference );
297 + }
298 +
299 + abstract protected boolean validAttributeReference( String pLocalReference );
300 +
301 + abstract protected AMDconverterPair createAttributeMetaData( CreateAMDParams pParams );
302 +
303 + protected AMDconverterPair createInvalidAttributeRef( CreateAMDParams pParams, String pLabelSuffix,
304 + String pTooltip ) {
305 + return createAttributeMetaData( new BadAttributeParamsPlus( pParams, pLabelSuffix, pTooltip ), //
306 + null, false, // options
307 + String.class ); // type
308 + }
309 +
310 + protected AMDconverterPair createAttributeMetaData( CreateAMDParamsPlus pParams, //
311 + // !Global & Not from Usage
312 + Object[] pValidOptions, //
313 + boolean pAssumeValidOptions, //
314 + Class pFieldType ) {
315 + FormAttributeMetaDataFactory zAMDFactory = mAMDFactoriesByFieldType.get( pFieldType );
316 + if ( (zAMDFactory == null) && !pFieldType.isEnum() ) {
317 + return new AMDconverterPair( SendableUnknownDataTypeConverter.INSTANCE,
318 + new UnknownDataTypeMetaData( pParams.getUsage() ) );
319 + }
320 + return createAttributeMetaData( pParams, //
321 + // !Global & Not from Usage
322 + pValidOptions, pAssumeValidOptions, //
323 + zAMDFactory, null );
324 + }
325 +
326 + protected AMDconverterPair createAttributeMetaData( CreateAMDParamsPlus pParams, //
327 + // !Global & Not from Usage
328 + Object[] pValidOptions, //
329 + boolean pAssumeValidOptions, //
330 + FormAttributeMetaDataFactory pAMDFactory, //
331 + FormSendableDataConverter pDataConverter ) {
332 + IntendedUse zIntendedUse = pParams.getUsage().getIntendedUse();
333 + if ( zIntendedUse.isJustData() ) {
334 + FormSendableDataConverter zFormSendableDataConverter = pParams.isHide() ?
335 + SendableHideDataStringConverter.INSTANCE :
336 + SendableStringConverter.INSTANCE;
337 + return new AMDconverterPair( zFormSendableDataConverter, //
338 + new ViewAsStringMetaData( pParams.getUsage() ) );
339 + }
340 + if ( pParams.isHide() ) {
341 + return PasswordFieldFormAMD.INSTANCE.create( pParams );
342 + }
343 + String zFormHint = pParams.getHintValue( COMPONENT_FORM );
344 + if ( CF_TEXT_FIELD.equals( zFormHint ) || CF_TEXT_FIELD_RIGHT_ALIGNED.equals( zFormHint ) ) {
345 + return TextFieldFormAMD.INSTANCE.create( pParams );
346 + }
347 + String[] zHintedValidOptions = parseHintValidOptions( pParams.getHintValue( VALID_OPTIONS ) );
348 + if ( pAssumeValidOptions || //
349 + Currently.isNotNullOrEmpty( pValidOptions ) || Currently.isNotNullOrEmpty( zHintedValidOptions ) ) {
350 + AbstractSendableKeyValuePairConverter converter = //
351 + (pDataConverter instanceof AbstractSendableKeyValuePairConverter) ? //
352 + (AbstractSendableKeyValuePairConverter) pDataConverter :
353 + new SendableExternalizedKeyValuePairConverter( mExternalization );
354 + SimpleKeyValuePair[] zMDoptions =
355 + converter.createValidOptions( pValidOptions, zHintedValidOptions );
356 +
357 + if ( pParams.getUsage() instanceof InputImageAttributeUsage ) {
358 + AttributeMetaData zMetaData;
359 + if ( Currently.isNullOrEmpty( zMDoptions ) ) {
360 + zMetaData = new InputImageMetaData( pParams.getUsage(), //
361 + pParams.isDisabled(), //
362 + pParams.getHints(), //
363 + pParams.getFieldLabel(), //
364 + pParams.getFieldTooltip(), //
365 + pParams.isRequired(), //
366 + pParams.getErrorTextForRequired() );
367 + } else {
368 + zMetaData = new InputImageValidOptionsAttributeMetaData( pParams.getUsage(), //
369 + pParams.isDisabled(), //
370 + pParams.getFieldLabel(), //
371 + pParams.getFieldTooltip(), //
372 + pParams.isRequired(), //
373 + pParams.getErrorTextForRequired(),
374 + //
375 + zMDoptions );
376 + }
377 + return new AMDconverterPair( converter, zMetaData );
378 + }
379 + if ( pParams.isEditRequired() && CF_RADIO_GROUP.equals( zFormHint ) ) {
380 + return RadioGroupFormAMD.INSTANCE.create( pParams, converter, zMDoptions );
381 + }
382 + return ComboBoxFormAMD.INSTANCE.create( pParams, converter, zMDoptions );
383 + }
384 + if ( pAMDFactory == null ) {
385 + throw new IllegalStateException( "No Factory & No ValidOptions?" );
386 + }
387 + return pAMDFactory.createAttributeMetaData( pParams );
388 + }
389 +
390 + protected String[] parseHintValidOptions( String pHintValue ) {
391 + return Strings.parseOptions( pHintValue );
392 + }
393 +
394 + public void removeInstanceHelper( String pRowKey ) {
395 + mBackDoor.removeInstanceHelper( new FormDataRowKey( getFormUniqueID(), pRowKey ) );
396 + }
397 +
398 + public InstanceHelper createRelSubInstanceHelper( InstanceHelper pParent, String pRowKey ) {
399 + InstanceHelper rv = LLcreateRelSubInstanceHelper( pParent, pRowKey );
400 + mBackDoor.add( rv );
401 + return rv;
402 + }
403 +
404 + abstract protected InstanceHelper LLcreateRelSubInstanceHelper( InstanceHelper pParent, String pRowKey );
405 +
406 + public AttributeResourceOptionsResponseData getResourceOptions( String pAttributeReference,
407 + FormSendableDataConverter pDataConverter ) {
408 + return new AttributeResourceOptionsResponseData( ResourceOptionsErrorType.ErrorNotImplemented );
409 + }
410 +
411 + private static class BadAttributeParamsPlus extends CreateAMDParamsPlus {
412 + private String mLabelSuffix;
413 + private String mTooltip;
414 +
415 + public BadAttributeParamsPlus( CreateAMDParams pParams, String pLabelSuffix, String pTooltip ) {
416 + super( pParams, null, // HintManager
417 + false, // Required
418 + true, // Disabled
419 + false, // Hide
420 + null, // MaxChars
421 + null, // DisplayLines
422 + null ); // DisplayCharsWidth
423 + mLabelSuffix = pLabelSuffix;
424 + mTooltip = pTooltip;
425 + }
426 +
427 + public String getFieldLabel() {
428 + return super.getFieldLabel() + mLabelSuffix;
429 + }
430 +
431 + public String getFieldTooltip() {
432 + return mTooltip;
433 + }
434 + }
435 +
436 + private static final Map<Class, FormAttributeMetaDataFactory> mAMDFactoriesByFieldType =
437 + new HashMap<Class, FormAttributeMetaDataFactory>();
438 +
439 + private static void add( Class pClass, FormAttributeMetaDataFactory pFactory ) {
440 + mAMDFactoriesByFieldType.put( pClass, pFactory );
441 + }
442 +
443 + static {
444 + add( String.class, FormAMDFactory_String.INSTANCE );
445 +
446 + add( FloatingPointLong.class, FormAMDFactory_SimpleFloatingPointLong.INSTANCE );
447 +
448 + add( FixedPointLong.class, FormAMDFactory_SimpleFixedPointLong.INSTANCE );
449 +
450 + add( Money.class, FormAMDFactory_SimpleMoney.INSTANCE );
451 +
452 + add( SimpleTime.class, FormAMDFactory_SimpleTime.INSTANCE );
453 + add( java.sql.Time.class, FormAMDFactory_SimpleTime.INSTANCE );
454 +
455 + add( SimpleTimestamp.class, FormAMDFactory_SimpleTimestamp.INSTANCE );
456 + add( java.sql.Timestamp.class, FormAMDFactory_SimpleTimestamp.INSTANCE );
457 +
458 + add( CalendarYMD.class, FormAMDFactory_CalendarYMD.INSTANCE );
459 + add( java.sql.Date.class, FormAMDFactory_CalendarYMD.INSTANCE );
460 +
461 + add( Boolean.class, FormAMDFactory_Boolean.INSTANCE );
462 + add( boolean.class, FormAMDFactory_Boolean.INSTANCE );
463 +
464 + add( double.class, FormAMDFactory_Double.INSTANCE );
465 + add( Double.class, FormAMDFactory_Double.INSTANCE );
466 +
467 + add( float.class, FormAMDFactory_Float.INSTANCE );
468 + add( Float.class, FormAMDFactory_Float.INSTANCE );
469 +
470 + add( short.class, FormAMDFactory_Long.SHORT );
471 + add( Short.class, FormAMDFactory_Long.SHORT );
472 + add( int.class, FormAMDFactory_Long.INTEGER );
473 + add( Integer.class, FormAMDFactory_Long.INTEGER );
474 + add( long.class, FormAMDFactory_Long.LONG );
475 + add( Long.class, FormAMDFactory_Long.LONG );
476 + }
477 + }