001package org.andromda.cartridges.ejb3.metafacades;
002
003import org.andromda.cartridges.ejb3.EJB3Globals;
004import org.andromda.cartridges.ejb3.EJB3Profile;
005import org.andromda.metafacades.uml.AttributeFacade;
006import org.andromda.metafacades.uml.UMLProfile;
007import org.apache.commons.lang.StringUtils;
008import org.apache.commons.lang.math.NumberUtils;
009
010/**
011 * MetafacadeLogic implementation for org.andromda.cartridges.ejb3.metafacades.EJB3EntityAttributeFacade.
012 *
013 * @see EJB3EntityAttributeFacade
014 */
015public class EJB3EntityAttributeFacadeLogicImpl
016    extends EJB3EntityAttributeFacadeLogic
017{
018    private static final long serialVersionUID = 34L;
019    /**
020     * The property that stores the default entity ID generator type
021     */
022    public static final String ENTITY_DEFAULT_GENERATOR_TYPE = "entityDefaultGeneratorType";
023
024    /**
025     * The property that stores the default generator initial value
026     */
027    public static final String ENTITY_DEFAULT_GENERATOR_INITIAL_VALUE = "entityDefaultGeneratorInitialValue";
028
029    /**
030     * The property that stores the default generator allocation size for incrementing ids
031     */
032    public static final String ENTITY_DEFAULT_GENERATOR_ALLOCATION_SIZE = "entityDefaultGeneratorAllocationSize";
033
034    /**
035     * The property that stores the default enumeration string literal column length.
036     */
037    public static final String DEFAULT_ENUM_LITERAL_COLUMN_LENGTH = "entityDefaultEnumLiteralColumnLength";
038
039    /**
040     * The property that stores the default temporal type for date based attributes
041     */
042    public static final String ENTITY_DEFAULT_TEMPORAL_TYPE = "entityDefaultTemporalType";
043
044    // ---------------- constructor -------------------------------
045
046    /**
047     * @param metaObject UML object used to create the EJB3EntityAttributeFacade
048     * @param context Context for creation of the EJB3EntityAttributeFacade
049     */
050    public EJB3EntityAttributeFacadeLogicImpl(final Object metaObject, final String context)
051    {
052        super (metaObject, context);
053    }
054
055    // --------------- methods ---------------------
056
057    /**
058     * Overridden to provide handling of inheritance.
059     *
060     * @see org.andromda.metafacades.uml.AttributeFacade#isRequired()
061     */
062    @Override
063    public boolean isRequired()
064    {
065        boolean required = super.isRequired();
066        if (this.getOwner() instanceof EJB3EntityFacade)
067        {
068            EJB3EntityFacade entity = (EJB3EntityFacade)this.getOwner();
069
070            /*
071             * Exclude ONLY if single table inheritance exists
072             */
073            if (entity.isRequiresGeneralizationMapping() && entity.isInheritanceSingleTable()
074                    && !entity.isEmbeddableSuperclassGeneralizationExists())
075            {
076                required = false;
077            }
078        }
079        return required;
080    }
081
082    /*
083     * Override to provide java specific handling of the default value.
084     *
085     * @see org.andromda.metafacades.uml.AttributeFacade#getDefaultValue()
086    @Override
087    public String getDefaultValue()
088    {
089        String defaultValue = super.getDefaultValue();
090        final ClassifierFacade type = this.getType();
091        if (type != null)
092        {
093            final String fullyQualifiedName = StringUtils.trimToEmpty(type.getFullyQualifiedName());
094            if (type.isStringType())
095            {
096                defaultValue = '\"' + defaultValue + '\"';
097            }
098            else if (fullyQualifiedName.startsWith("java.lang"))
099            {
100                defaultValue = fullyQualifiedName + ".valueOf(" + defaultValue + ')';
101            }
102        }
103        return defaultValue;
104    }
105     */
106
107    /**
108     * @see EJB3EntityAttributeFacade#getFetchType()
109     */
110    @Override
111    protected String handleGetFetchType()
112    {
113        return (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_PERSISTENCE_FETCH_TYPE);
114    }
115
116    /**
117     * @see EJB3EntityAttributeFacadeLogic#handleIsEager()
118     */
119    @Override
120    protected boolean handleIsEager()
121    {
122        boolean isEager = false;
123        if (StringUtils.isNotBlank(this.getFetchType()))
124        {
125            if (EJB3Globals.FETCH_TYPE_EAGER.equalsIgnoreCase(this.getFetchType()))
126            {
127                isEager = true;
128            }
129        }
130        return isEager;
131    }
132
133    /**
134     * @see EJB3EntityAttributeFacadeLogic#handleIsLazy()
135     */
136    @Override
137    protected boolean handleIsLazy()
138    {
139        boolean isLazy = false;
140        if (StringUtils.isNotBlank(this.getFetchType()))
141        {
142            if (EJB3Globals.FETCH_TYPE_LAZY.equalsIgnoreCase(this.getFetchType()))
143            {
144                isLazy = true;
145            }
146        }
147        return isLazy;
148    }
149
150    /**
151     * @see EJB3EntityAttributeFacade#isVersion()
152     */
153    @Override
154    protected boolean handleIsVersion()
155    {
156        boolean isVersion = false;
157        if (this.hasStereotype(EJB3Profile.STEREOTYPE_VERSION))
158        {
159            isVersion = true;
160        }
161        return isVersion;
162    }
163
164    /**
165     * @see EJB3EntityAttributeFacade#isLob()
166     */
167    @Override
168    protected boolean handleIsLob()
169    {
170        return this.getType().isBlobType() || this.getType().isClobType();
171    }
172
173    /**
174     * @see EJB3EntityAttributeFacadeLogic#handleGetLobType()
175     */
176    @Override
177    protected String handleGetLobType()
178    {
179        return StringUtils.trimToEmpty((String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_EJB_PERSISTENCE_LOB_TYPE));
180    }
181
182    /**
183     * @see EJB3EntityAttributeFacade#getGeneratorType()
184     */
185    @Override
186    protected String handleGetGeneratorType()
187    {
188        String genType = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_PERSISTENCE_GENERATOR_TYPE);
189        if (StringUtils.isBlank(genType))
190        {
191            if (this.getType().isStringType() || this.getType().isDateType() || this.getType().isTimeType())
192            {
193                genType = EJB3Globals.GENERATOR_TYPE_NONE;
194            }
195            else
196            {
197                genType = String.valueOf(this.getConfiguredProperty(ENTITY_DEFAULT_GENERATOR_TYPE));
198                if (StringUtils.isBlank(genType))
199                {
200                    genType = EJB3Globals.GENERATOR_TYPE_AUTO;
201                }
202            }
203        }
204        return genType;
205    }
206
207    /**
208     * @see EJB3EntityAttributeFacadeLogic#handleIsGeneratorTypeSequence()
209     */
210    @Override
211    protected boolean handleIsGeneratorTypeSequence()
212    {
213        boolean isSequence = false;
214        if (StringUtils.isNotBlank(this.getGeneratorType()))
215        {
216            if (EJB3Globals.GENERATOR_TYPE_SEQUENCE.equalsIgnoreCase(this.getGeneratorType()))
217            {
218                isSequence = true;
219            }
220        }
221        return isSequence;
222    }
223
224    /**
225     * @see EJB3EntityAttributeFacadeLogic#handleIsGeneratorTypeTable()
226     */
227    @Override
228    protected boolean handleIsGeneratorTypeTable()
229    {
230        boolean isTable = false;
231        if (StringUtils.isNotBlank(this.getGeneratorType()))
232        {
233            if (EJB3Globals.GENERATOR_TYPE_TABLE.equalsIgnoreCase(this.getGeneratorType()))
234            {
235                isTable = true;
236            }
237        }
238        return isTable;
239    }
240
241    /**
242     * @see EJB3EntityAttributeFacadeLogic#handleIsGeneratorTypeAuto()
243     */
244    @Override
245    protected boolean handleIsGeneratorTypeAuto()
246    {
247        boolean isAuto = false;
248        if (StringUtils.isNotBlank(this.getGeneratorType()))
249        {
250            if (EJB3Globals.GENERATOR_TYPE_AUTO.equalsIgnoreCase(this.getGeneratorType()))
251            {
252                isAuto = true;
253            }
254        }
255        return isAuto;
256    }
257
258    /**
259     * @see EJB3EntityAttributeFacadeLogic#handleIsGeneratorTypeGeneric()
260     */
261    @Override
262    protected boolean handleIsGeneratorTypeGeneric()
263    {
264        boolean isGeneric = false;
265        if (StringUtils.isNotBlank(this.getGeneratorType()))
266        {
267            if (EJB3Globals.GENERATOR_TYPE_GENERIC.equalsIgnoreCase(this.getGeneratorType()))
268            {
269                isGeneric = true;
270            }
271        }
272        return isGeneric;
273    }
274
275    /**
276     * @see EJB3EntityAttributeFacadeLogic#handleIsGeneratorTypeNone()
277     */
278    @Override
279    protected boolean handleIsGeneratorTypeNone()
280    {
281        boolean isNone = false;
282        if (StringUtils.isNotBlank(this.getGeneratorType()))
283        {
284            if (EJB3Globals.GENERATOR_TYPE_NONE.equalsIgnoreCase(this.getGeneratorType()))
285            {
286                isNone = true;
287            }
288        }
289        return isNone;
290    }
291
292    /**
293     * @see EJB3EntityAttributeFacadeLogic#handleIsGeneratorTypeIdentity()
294     */
295    @Override
296    protected boolean handleIsGeneratorTypeIdentity()
297    {
298        boolean isIdentity = false;
299        if (StringUtils.isNotBlank(this.getGeneratorType()))
300        {
301            if (EJB3Globals.GENERATOR_TYPE_IDENTITY.equalsIgnoreCase(this.getGeneratorType()))
302            {
303                isIdentity = true;
304            }
305        }
306        return isIdentity;
307    }
308
309    /** Generator */
310    public static final String GENERATOR = "Generator";
311    /** _ */
312    public static final char UNDERSCORE = '_';
313    /**
314     * @see EJB3EntityAttributeFacadeLogic#handleGetGeneratorName()
315     */
316    @Override
317    protected String handleGetGeneratorName()
318    {
319        String generatorName = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_PERSISTENCE_GENERATOR_NAME);
320        if (StringUtils.isBlank(generatorName))
321        {
322            generatorName = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_PERSISTENCE_GENERATOR_SOURCE_NAME);
323            if (StringUtils.isBlank(generatorName))
324            {
325                generatorName = this.getOwner().getName() + GENERATOR;
326            }
327            else
328            {
329                generatorName = this.getOwner().getName() + UNDERSCORE + generatorName;
330            }
331        }
332        return generatorName;
333    }
334
335    /**
336     * @see EJB3EntityAttributeFacadeLogic#handleGetGeneratorSourceName()
337     */
338    @Override
339    protected String handleGetGeneratorSourceName()
340    {
341        String sourceName = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_PERSISTENCE_GENERATOR_SOURCE_NAME);
342        if (StringUtils.isBlank(sourceName))
343        {
344            sourceName = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_PERSISTENCE_GENERATOR_NAME);
345        }
346        return sourceName;
347    }
348
349    /**
350     * @see EJB3EntityAttributeFacadeLogic#getGeneratorGenericStrategy()
351     */
352    @Override
353    protected String handleGetGeneratorGenericStrategy()
354    {
355        return (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_PERSISTENCE_GENERATOR_GENERIC_STRATEGY);
356    }
357
358    /**
359     * @see EJB3EntityAttributeFacadeLogic#handleGetGeneratorPkColumnValue()
360     */
361    @Override
362    protected String handleGetGeneratorPkColumnValue()
363    {
364        String pkColumnValue = (String)this.findTaggedValue(
365                EJB3Profile.TAGGEDVALUE_PERSISTENCE_GENERATOR_PKCOLUMN_VALUE);
366
367        if (StringUtils.isBlank(pkColumnValue))
368        {
369            pkColumnValue = this.getOwner().getName() + UNDERSCORE + this.getColumnName();
370        }
371        return pkColumnValue;
372    }
373
374    /**
375     * @see EJB3EntityAttributeFacadeLogic#handleGetGeneratorInitialValue()
376     */
377    @Override
378    protected int handleGetGeneratorInitialValue()
379    {
380        int initialValue = 1;
381        String initialValueStr =
382            (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_PERSISTENCE_GENERATOR_INITIAL_VALUE);
383        if (StringUtils.isNotBlank(initialValueStr))
384        {
385            initialValue = NumberUtils.toInt(initialValueStr);
386        }
387        else
388        {
389            initialValueStr =
390                String.valueOf(this.getConfiguredProperty(ENTITY_DEFAULT_GENERATOR_INITIAL_VALUE));
391            if (StringUtils.isNotBlank(initialValueStr))
392            {
393                initialValue = NumberUtils.toInt(initialValueStr);
394            }
395        }
396
397        return initialValue;
398    }
399
400    /**
401     * @see EJB3EntityAttributeFacadeLogic#handleGetGeneratorAllocationSize()
402     */
403    @Override
404    protected int handleGetGeneratorAllocationSize()
405    {
406        int allocationSize = 1;
407        String allocationSizeStr =
408            (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_PERSISTENCE_GENERATOR_ALLOCATION_SIZE);
409        if (StringUtils.isNotBlank(allocationSizeStr))
410        {
411            allocationSize = NumberUtils.toInt(allocationSizeStr);
412        }
413        else
414        {
415            allocationSizeStr =
416                String.valueOf(this.getConfiguredProperty(ENTITY_DEFAULT_GENERATOR_ALLOCATION_SIZE));
417            if (StringUtils.isNotBlank(allocationSizeStr))
418            {
419                allocationSize = NumberUtils.toInt(allocationSizeStr);
420            }
421        }
422
423        return allocationSize;
424    }
425
426    /**
427     * Override the super method to first look at the tagged value if one exists.
428     * If not, then return the default column length.
429     *
430     * @see org.andromda.metafacades.uml.EntityAttribute#getColumnLength()
431     */
432    @Override
433    public String getColumnLength()
434    {
435        String columnLength = (String)this.findTaggedValue(UMLProfile.TAGGEDVALUE_PERSISTENCE_COLUMN_LENGTH);
436        if (StringUtils.isBlank(columnLength))
437        {
438            columnLength = super.getColumnLength();
439        }
440        return columnLength;
441    }
442
443    /**
444     * Override the super method to first look at the tagged value if one exists.
445     * If not, then return the default column name.
446     *
447     * @see org.andromda.metafacades.uml.EntityAttribute#getColumnName()
448     */
449    @Override
450    public String getColumnName()
451    {
452        String columnName = (String)this.findTaggedValue(UMLProfile.TAGGEDVALUE_PERSISTENCE_COLUMN);
453        if (StringUtils.isBlank(columnName))
454        {
455            columnName = super.getColumnName();
456        }
457        return columnName;
458    }
459
460    /**
461     * @see EJB3EntityAttributeFacadeLogic#handleGetColumnDefinition()
462     *
463     * If the column definition has not manually been set and the attribute
464     * type is an enumeration, work out the schema from the length and type
465     * of the enumeration literals.  The definition is only set for if the
466     * literal types are String.
467     */
468    @Override
469    protected String handleGetColumnDefinition()
470    {
471        String definition = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_PERSISTENCE_COLUMN_DEFINITION);
472        if (StringUtils.isBlank(definition) && this.getType().isEnumeration())
473        {
474            boolean isOrdinal = false;
475            int length = NumberUtils.toInt(
476                    String.valueOf(this.getConfiguredProperty(DEFAULT_ENUM_LITERAL_COLUMN_LENGTH)));
477            for (AttributeFacade attribute : this.getType().getAttributes())
478            {
479                if (!attribute.getType().isStringType())
480                {
481                    isOrdinal = true;
482                    break;
483                }
484                if (attribute.getName().length() > length)
485                {
486                    length = attribute.getName().length();
487                }
488            }
489            if (!isOrdinal)
490            {
491                definition = "VARCHAR(" + length + ')';
492            }
493        }
494        return definition;
495    }
496
497    /**
498     * @see EJB3EntityAttributeFacadeLogic#handleGetColumnPrecision()
499     */
500    @Override
501    protected String handleGetColumnPrecision()
502    {
503        return (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_PERSISTENCE_COLUMN_PRECISION);
504    }
505
506    /**
507     * @see EJB3EntityAttributeFacadeLogic#handleGetColumnScale()
508     */
509    @Override
510    protected String handleGetColumnScale()
511    {
512        return (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_PERSISTENCE_COLUMN_SCALE);
513    }
514
515    /**
516     * @see EJB3EntityAttributeFacadeLogic#handleIsColumnNullable()
517     */
518    @Override
519    protected boolean handleIsColumnNullable()
520    {
521        boolean nullable = true;
522        String nullableString = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_PERSISTENCE_COLUMN_NULLABLE);
523
524        if (StringUtils.isBlank(nullableString))
525        {
526            nullable = (this.isIdentifier() || this.isUnique()) ? false : !this.isRequired();
527        }
528        else
529        {
530            nullable = Boolean.valueOf(nullableString).booleanValue();
531        }
532        return nullable;
533    }
534
535    /**
536     * @see EJB3EntityAttributeFacadeLogic#handleGetTemporalType()
537     */
538    @Override
539    protected String handleGetTemporalType()
540    {
541        String temporalType = null;
542        if (this.getType().isDateType())
543        {
544            temporalType = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_PERSISTENCE_TEMPORAL_TYPE);
545            if (StringUtils.isBlank(temporalType))
546            {
547                temporalType = String.valueOf(this.getConfiguredProperty(ENTITY_DEFAULT_TEMPORAL_TYPE));
548            }
549        }
550        return temporalType;
551    }
552
553    /**
554     * @see EJB3EntityAttributeFacadeLogic#handleGetEnumerationType()
555     */
556    @Override
557    protected String handleGetEnumerationType()
558    {
559        return (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_PERSISTENCE_ENUMERATION_TYPE);
560    }
561
562    /**
563     * @see EJB3EntityAttributeFacadeLogic#handleIsInsertEnabled()
564     */
565    @Override
566    protected boolean handleIsInsertEnabled()
567    {
568        final String value = (String)super.findTaggedValue(EJB3Profile.TAGGEDVALUE_PERSISTENCE_COLUMN_INSERT);
569        return StringUtils.isNotBlank(value) ? Boolean.valueOf(value).booleanValue() : true;
570    }
571
572    /**
573     * @see EJB3EntityAttributeFacadeLogic#handleIsUpdateEnabled()
574     */
575    @Override
576    protected boolean handleIsUpdateEnabled()
577    {
578        final String value = (String)super.findTaggedValue(EJB3Profile.TAGGEDVALUE_PERSISTENCE_COLUMN_UPDATE);
579        return StringUtils.isNotBlank(value) ? Boolean.valueOf(value).booleanValue() : true;
580    }
581
582    /**
583     * @see EJB3EntityAttributeFacadeLogic#handleIsContainsEmbeddedObject()
584     */
585    @Override
586    protected boolean handleIsContainsEmbeddedObject()
587    {
588        boolean returnValue = false;
589        if (this.getType() instanceof EJB3EmbeddedValueFacade)
590        {
591            returnValue = true;
592        }
593        return returnValue;
594    }
595
596    /**
597     * @return findTaggedValue 'andromda_hibernate_type'
598     */
599    @Override
600    protected String handleGetOverrideType()
601    {
602        return (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_PERSISTENCE_OVERRIDE_TYPE);
603    }
604}