|
@@ -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 |
+ |
} |