Package org.datanucleus.metadata

Examples of org.datanucleus.metadata.ColumnMetaData


    /* (non-Javadoc)
     * @see javax.jdo.metadata.VersionMetadata#newColumnMetadata()
     */
    public ColumnMetadata newColumnMetadata()
    {
        ColumnMetaData internalColmd = getInternal().newColumnMetaData();
        ColumnMetadataImpl colmd = new ColumnMetadataImpl(internalColmd);
        colmd.parent = this;
        return colmd;
    }
View Full Code Here


    /* (non-Javadoc)
     * @see javax.jdo.metadata.KeyMetadata#newColumnMetadata()
     */
    public ColumnMetadata newColumnMetadata()
    {
        ColumnMetaData internalColmd = getInternal().newColumnMetaData();
        ColumnMetadataImpl colmd = new ColumnMetadataImpl(internalColmd);
        colmd.parent = this;
        return colmd;
    }
View Full Code Here

    /* (non-Javadoc)
     * @see javax.jdo.metadata.UniqueMetadata#newColumnMetadata()
     */
    public ColumnMetadata newColumnMetadata()
    {
        ColumnMetaData internalColmd = getInternal().newColumnMetaData();
        ColumnMetadataImpl colmd = new ColumnMetadataImpl(internalColmd);
        colmd.parent = this;
        return colmd;
    }
View Full Code Here

    /* (non-Javadoc)
     * @see javax.jdo.metadata.PrimaryKeyMetadata#newColumnMetadata()
     */
    public ColumnMetadata newColumnMetadata()
    {
        ColumnMetaData internalColmd = getInternal().newColumnMetadata();
        ColumnMetadataImpl colmd = new ColumnMetadataImpl(internalColmd);
        colmd.parent = this;
        return colmd;
    }
View Full Code Here

            {
                table = columnTable;
            }
        }

        ColumnMetaData colmd = new ColumnMetaData();
        colmd.setName(columnName);
        colmd.setTarget(target);
        colmd.setTargetMember(targetField);
        colmd.setJdbcType(jdbcType);
        colmd.setSqlType(sqlType);
        colmd.setLength(length);
        colmd.setScale(scale);
        colmd.setAllowsNull(allowsNull);
        colmd.setDefaultValue(defaultValue);
        colmd.setInsertValue(insertValue);
        colmd.setInsertable(insertable);
        colmd.setUpdateable(updateable);
        colmd.setUnique(unique);
        if (!StringUtils.isWhitespace(column.columnDefinition()))
        {
            colmd.setColumnDdl(column.columnDefinition());
        }
        return colmd;
    }
View Full Code Here

                                {
                                    UniqueMetaData unimd = new UniqueMetaData();
                                    unimd.setTable((String)annotationValues.get("name"));
                                    for (int k=0;k<constrs[j].columnNames().length;k++)
                                    {
                                        ColumnMetaData colmd = new ColumnMetaData();
                                        colmd.setName(constrs[j].columnNames()[k]);
                                        unimd.addColumn(colmd);
                                    }
                                    if (uniques == null)
                                    {
                                        uniques = new HashSet<UniqueMetaData>();
                                    }
                                    uniques.add(unimd);
                                }
                            }
                        }
                        else if (annName.equals(JPAAnnotationUtils.ID_CLASS))
                        {
                            idClassName = ((Class)annotationValues.get("value")).getName();
                        }
                        else if (annName.equals(JPAAnnotationUtils.INHERITANCE))
                        {
                            // Only valid in the root class
                            InheritanceType inhType = (InheritanceType)annotationValues.get("strategy");
                            inheritanceStrategyForTree = inhType.toString();
                            if (inhType == InheritanceType.JOINED)
                            {
                                inheritanceStrategy = InheritanceStrategy.NEW_TABLE.toString();
                            }
                            else if (inhType == InheritanceType.TABLE_PER_CLASS)
                            {
                                inheritanceStrategy = InheritanceStrategy.COMPLETE_TABLE.toString();
                            }
                            else if (inhType == InheritanceType.SINGLE_TABLE)
                            {
                                // Translated to root class as "new-table" and children as "superclass-table"
                                // and @Inheritance should only be specified on root class so defaults to internal default
                            }
                        }
                        else if (annName.equals(JPAAnnotationUtils.DISCRIMINATOR_COLUMN))
                        {
                            discriminatorColumnName = (String)annotationValues.get("name");
                            DiscriminatorType type = (DiscriminatorType)annotationValues.get("discriminatorType");
                            if (type == DiscriminatorType.CHAR)
                            {
                                discriminatorColumnType = "CHAR";
                            }
                            else if (type == DiscriminatorType.INTEGER)
                            {
                                discriminatorColumnType = "INTEGER";
                            }
                            else if (type == DiscriminatorType.STRING)
                            {
                                discriminatorColumnType = "VARCHAR";
                            }
                            discriminatorColumnLength = (Integer)annotationValues.get("length");
                            String tmp = (String)annotationValues.get("columnDefinition");
                            if (!StringUtils.isWhitespace(tmp))
                            {
                                discriminatorColumnDdl = tmp;
                            }
                        }
                        else if (annName.equals(JPAAnnotationUtils.DISCRIMINATOR_VALUE))
                        {
                            discriminatorValue = (String)annotationValues.get("value");
                        }
                        else if (annName.equals(JPAAnnotationUtils.EMBEDDABLE))
                        {
                            embeddedOnly = "true";
                            identityType = IdentityType.NONDURABLE;
                        }
                        else if (annName.equals(JPAAnnotationUtils.CACHEABLE))
                        {
                            Boolean cacheableVal = (Boolean)annotationValues.get("value");
                            if (cacheableVal == Boolean.FALSE)
                            {
                                cacheable = "false";
                            }
                        }
                        else if (annName.equals(JPAAnnotationUtils.ENTITY_LISTENERS))
                        {
                            entityListeners = (Class[])annotationValues.get("value");
                        }
                        else if (annName.equals(JPAAnnotationUtils.EXCLUDE_SUPERCLASS_LISTENERS))
                        {
                            excludeSuperClassListeners = true;
                        }
                        else if (annName.equals(JPAAnnotationUtils.EXCLUDE_DEFAULT_LISTENERS))
                        {
                            excludeDefaultListeners = true;
                        }
                        else if (annName.equals(JPAAnnotationUtils.SEQUENCE_GENERATOR))
                        {
                            processSequenceGeneratorAnnotation(pmd, annotationValues);
                        }
                        else if (annName.equals(JPAAnnotationUtils.TABLE_GENERATOR))
                        {
                            processTableGeneratorAnnotation(pmd, annotationValues);
                        }
                        else if (annName.equals(JPAAnnotationUtils.PRIMARY_KEY_JOIN_COLUMN))
                        {
                            // Override the PK column name when we have a persistent superclass
                            pkColumnMetaData = new ColumnMetaData[1];
                            pkColumnMetaData[0] = new ColumnMetaData();
                            pkColumnMetaData[0].setName((String)annotationValues.get("name"));
                            pkColumnMetaData[0].setTarget((String)annotationValues.get("referencedColumnName"));
                        }
                        else if (annName.equals(JPAAnnotationUtils.PRIMARY_KEY_JOIN_COLUMNS))
                        {
                            // Override the PK column names when we have a persistent superclass
                            PrimaryKeyJoinColumn[] values = (PrimaryKeyJoinColumn[])annotationValues.get("value");
                            pkColumnMetaData = new ColumnMetaData[values.length];
                            for (int j=0;j<values.length;j++)
                            {
                                pkColumnMetaData[j] = new ColumnMetaData();
                                pkColumnMetaData[j].setName(values[j].name());
                                pkColumnMetaData[j].setTarget(values[j].referencedColumnName());
                                if (!StringUtils.isWhitespace(values[j].columnDefinition()))
                                {
                                    pkColumnMetaData[j].setColumnDdl(values[j].columnDefinition());
                                }
                            }
                        }
                        else if (annName.equals(JPAAnnotationUtils.ATTRIBUTE_OVERRIDES))
                        {
                            AttributeOverride[] overrides = (AttributeOverride[])annotationValues.get("value");
                            if (overrides != null)
                            {
                                if (overriddenFields == null)
                                {
                                    overriddenFields = new HashSet<AbstractMemberMetaData>();
                                }

                                for (int j=0;j<overrides.length;j++)
                                {
                                    AbstractMemberMetaData fmd = new FieldMetaData(cmd,
                                        "#UNKNOWN." + overrides[j].name());
                                    fmd.setPersistenceModifier(FieldPersistenceModifier.PERSISTENT.toString());
                                    Column col = overrides[j].column();
                                    // TODO Make inferrals about jdbctype, length etc if the field is 1 char etc
                                    ColumnMetaData colmd = new ColumnMetaData();
                                    colmd.setName(col.name());
                                    colmd.setLength(col.length());
                                    colmd.setScale(col.scale());
                                    colmd.setAllowsNull(col.nullable());
                                    colmd.setInsertable(col.insertable());
                                    colmd.setUpdateable(col.updatable());
                                    colmd.setUnique(col.unique());
                                    fmd.addColumn(colmd);
                                    overriddenFields.add(fmd);
                                }
                            }
                        }
                        else if (annName.equals(JPAAnnotationUtils.ATTRIBUTE_OVERRIDE))
                        {
                            if (overriddenFields == null)
                            {
                                overriddenFields = new HashSet<AbstractMemberMetaData>();
                            }

                            AbstractMemberMetaData fmd = new FieldMetaData(cmd,
                                "#UNKNOWN." + (String)annotationValues.get("name"));
                            Column col = (Column)annotationValues.get("column");
                            // TODO Make inferrals about jdbctype, length etc if the field is 1 char etc
                            ColumnMetaData colmd = new ColumnMetaData();
                            colmd.setName(col.name());
                            colmd.setLength(col.length());
                            colmd.setScale(col.scale());
                            colmd.setAllowsNull(col.nullable());
                            colmd.setInsertable(col.insertable());
                            colmd.setUpdateable(col.updatable());
                            colmd.setUnique(col.unique());
                            fmd.addColumn(colmd);
                            overriddenFields.add(fmd);
                        }
                        else if (annName.equals(JPAAnnotationUtils.ASSOCIATION_OVERRIDES))
                        {
                            AssociationOverride[] overrides = (AssociationOverride[])annotationValues.get("value");
                            if (overrides != null)
                            {
                                if (overriddenFields == null)
                                {
                                    overriddenFields = new HashSet<AbstractMemberMetaData>();
                                }

                                for (int j=0;j<overrides.length;j++)
                                {
                                    AbstractMemberMetaData fmd = new FieldMetaData(cmd,
                                        "#UNKNOWN." + overrides[j].name());
                                    JoinColumn[] cols = overrides[j].joinColumns();
                                    for (int k=0;k<cols.length;k++)
                                    {
                                        ColumnMetaData colmd = new ColumnMetaData();
                                        colmd.setName(cols[k].name());
                                        colmd.setTarget(cols[k].referencedColumnName());
                                        colmd.setAllowsNull(cols[k].nullable());
                                        colmd.setInsertable(cols[k].insertable());
                                        colmd.setUpdateable(cols[k].updatable());
                                        colmd.setUnique(cols[k].unique());
                                        fmd.addColumn(colmd);
                                    }
                                    overriddenFields.add(fmd);
                                }
                            }
                        }
                        else if (annName.equals(JPAAnnotationUtils.ASSOCIATION_OVERRIDE))
                        {
                            if (overriddenFields == null)
                            {
                                overriddenFields = new HashSet<AbstractMemberMetaData>();
                            }

                            AbstractMemberMetaData fmd = new FieldMetaData(cmd,
                                "#UNKNOWN." + (String)annotationValues.get("name"));
                            JoinColumn[] cols = (JoinColumn[])annotationValues.get("joinColumns");
                            for (int k=0;k<cols.length;k++)
                            {
                                ColumnMetaData colmd = new ColumnMetaData();
                                colmd.setName(cols[k].name());
                                colmd.setTarget(cols[k].referencedColumnName());
                                colmd.setAllowsNull(cols[k].nullable());
                                colmd.setInsertable(cols[k].insertable());
                                colmd.setUpdateable(cols[k].updatable());
                                colmd.setUnique(cols[k].unique());
                                fmd.addColumn(colmd);
                            }
                            overriddenFields.add(fmd);
                        }
                        else if (annName.equals(JPAAnnotationUtils.NAMED_QUERIES))
                        {
                            NamedQuery[] queries = (NamedQuery[])annotationValues.get("value");
                            if (namedQueries == null)
                            {
                                namedQueries = new HashSet<QueryMetaData>();
                            }
                            for (int j=0;j<queries.length;j++)
                            {
                                QueryMetaData qmd = new QueryMetaData(queries[j].name());
                                qmd.setLanguage(QueryLanguage.JPQL.toString());
                                qmd.setUnmodifiable(true);
                                qmd.setQuery(queries[j].query());
                                namedQueries.add(qmd);
                            }
                        }
                        else if (annName.equals(JPAAnnotationUtils.NAMED_QUERY))
                        {
                            if (namedQueries == null)
                            {
                                namedQueries = new HashSet<QueryMetaData>();
                            }
                            QueryMetaData qmd = new QueryMetaData((String)annotationValues.get("name"));
                            qmd.setLanguage(QueryLanguage.JPQL.toString());
                            qmd.setUnmodifiable(true);
                            qmd.setQuery((String)annotationValues.get("query"));
                            namedQueries.add(qmd);
                        }
                        else if (annName.equals(JPAAnnotationUtils.NAMED_NATIVE_QUERIES))
                        {
                            NamedNativeQuery[] queries = (NamedNativeQuery[])annotationValues.get("value");
                            if (namedQueries == null)
                            {
                                namedQueries = new HashSet<QueryMetaData>();
                            }
                            for (int j=0;j<queries.length;j++)
                            {
                                String resultClassName = null;
                                if (queries[j].resultClass() != null && queries[j].resultClass() != void.class)
                                {
                                    resultClassName = queries[j].resultClass().getName();
                                }
                                String resultMappingName = null;
                                if (queries[j].resultSetMapping() != null)
                                {
                                    resultMappingName = queries[j].resultSetMapping();
                                }
                                QueryMetaData qmd = new QueryMetaData(queries[j].name());
                                qmd.setLanguage(QueryLanguage.SQL.toString());
                                qmd.setUnmodifiable(true);
                                qmd.setResultClass(resultClassName);
                                qmd.setResultMetaDataName(resultMappingName);
                                qmd.setQuery(queries[j].query());
                                namedQueries.add(qmd);
                            }
                        }
                        else if (annName.equals(JPAAnnotationUtils.NAMED_NATIVE_QUERY))
                        {
                            if (namedQueries == null)
                            {
                                namedQueries = new HashSet<QueryMetaData>();
                            }

                            Class resultClass = (Class)annotationValues.get("resultClass");
                            String resultClassName = null;
                            if (resultClass != null && resultClass != void.class)
                            {
                                resultClassName = resultClass.getName();
                            }
                            String resultMappingName = (String)annotationValues.get("resultSetMapping");
                            if (StringUtils.isWhitespace(resultMappingName))
                            {
                                resultMappingName = null;
                            }
                            QueryMetaData qmd = new QueryMetaData((String)annotationValues.get("name"));
                            qmd.setLanguage(QueryLanguage.SQL.toString());
                            qmd.setUnmodifiable(true);
                            qmd.setResultClass(resultClassName);
                            qmd.setResultMetaDataName(resultMappingName);
                            qmd.setQuery((String)annotationValues.get("query"));
                            namedQueries.add(qmd);
                        }
                        else if (annName.equals(JPAAnnotationUtils.SQL_RESULTSET_MAPPINGS))
                        {
                            SqlResultSetMapping[] mappings = (SqlResultSetMapping[])annotationValues.get("value");
                            if (resultMappings == null)
                            {
                                resultMappings = new ArrayList<QueryResultMetaData>();
                            }

                            for (int j=0;j<mappings.length;j++)
                            {
                                QueryResultMetaData qrmd = new QueryResultMetaData(mappings[j].name());
                                EntityResult[] entityResults = (EntityResult[])mappings[j].entities();
                                if (entityResults != null)
                                {
                                    for (int k=0;k<entityResults.length;k++)
                                    {
                                        String entityClassName = entityResults[k].entityClass().getName();
                                        qrmd.addPersistentTypeMapping(entityClassName, null,
                                            entityResults[k].discriminatorColumn());
                                        FieldResult[] fields = entityResults[k].fields();
                                        if (fields != null)
                                        {
                                            for (int l=0;l<fields.length;l++)
                                            {
                                                qrmd.addMappingForPersistentTypeMapping(entityClassName, fields[l].name(), fields[l].column());
                                            }
                                        }
                                    }
                                }
                                ColumnResult[] colResults = (ColumnResult[])mappings[j].columns();
                                if (colResults != null)
                                {
                                    for (int k=0;k<colResults.length;k++)
                                    {
                                        qrmd.addScalarColumn(colResults[k].name());
                                    }
                                }

                                resultMappings.add(qrmd);
                            }
                        }
                        else if (annName.equals(JPAAnnotationUtils.SQL_RESULTSET_MAPPING))
                        {
                            if (resultMappings == null)
                            {
                                resultMappings = new ArrayList<QueryResultMetaData>();
                            }

                            QueryResultMetaData qrmd = new QueryResultMetaData((String)annotationValues.get("name"));
                            EntityResult[] entityResults = (EntityResult[])annotationValues.get("entities");
                            if (entityResults != null)
                            {
                                for (int j=0;j<entityResults.length;j++)
                                {
                                    String entityClassName = entityResults[j].entityClass().getName();
                                    qrmd.addPersistentTypeMapping(entityClassName, null,
                                        entityResults[j].discriminatorColumn());
                                    FieldResult[] fields = entityResults[j].fields();
                                    if (fields != null)
                                    {
                                        for (int k=0;k<fields.length;k++)
                                        {
                                            qrmd.addMappingForPersistentTypeMapping(entityClassName, fields[k].name(), fields[k].column());
                                        }
                                    }
                                }
                            }
                            ColumnResult[] colResults = (ColumnResult[])annotationValues.get("columns");
                            if (colResults != null)
                            {
                                for (int j=0;j<colResults.length;j++)
                                {
                                    qrmd.addScalarColumn(colResults[j].name());
                                }
                            }
                            resultMappings.add(qrmd);
                        }
                        else if (annName.equals(JPAAnnotationUtils.SECONDARY_TABLES))
                        {
                            // processed below in newJoinMetaData
                        }
                        else if (annName.equals(JPAAnnotationUtils.SECONDARY_TABLE))
                        {
                            // processed below in newJoinMetaData
                        }
                        else if (annName.equals(JPAAnnotationUtils.EXTENSION))
                        {
                            // extension
                            ExtensionMetaData extmd = new ExtensionMetaData((String)annotationValues.get("vendorName"),
                                (String)annotationValues.get("key"), (String)annotationValues.get("value"));
                            if (extensions == null)
                            {
                                extensions = new HashSet<ExtensionMetaData>(1);
                            }
                            extensions.add(extmd);
                        }
                        else if (annName.equals(JPAAnnotationUtils.EXTENSIONS))
                        {
                            // extension
                            Extension[] values = (Extension[])annotationValues.get("value");
                            if (values != null && values.length > 0)
                            {
                                if (extensions == null)
                                {
                                    extensions = new HashSet<ExtensionMetaData>(values.length);
                                }
                                for (int j=0;j<values.length;j++)
                                {
                                    ExtensionMetaData extmd = new ExtensionMetaData(values[j].vendorName(),
                                        values[j].key().toString(), values[j].value().toString());
                                    extensions.add(extmd);
                                }
                            }
                        }
                        else
                        {
                            NucleusLogger.METADATA.error(LOCALISER.msg("044203",
                                cls.getName(), annotations[i].getName()));
                        }
                    }
                }

                if (entityName == null || entityName.length() == 0)
                {
                    entityName = ClassUtils.getClassNameForClass(cls);
                }

                NucleusLogger.METADATA.info(LOCALISER.msg("044200", cls.getName(), "JPA"));

                cmd.setTable(table);
                cmd.setCatalog(catalog);
                cmd.setSchema(schema);
                cmd.setEntityName(entityName);
                cmd.setDetachable(detachable);
                cmd.setRequiresExtent(requiresExtent);
                cmd.setObjectIdClass(idClassName);
                cmd.setEmbeddedOnly(embeddedOnly);
                cmd.setCacheable(cacheable);
                cmd.setIdentityType(identityType);
                if (isClassPersistenceCapable(cls.getSuperclass()))
                {
                    cmd.setPersistenceCapableSuperclass(cls.getSuperclass().getName());
                }
                if (excludeSuperClassListeners)
                {
                    cmd.excludeSuperClassListeners();
                }
                if (excludeDefaultListeners)
                {
                    cmd.excludeDefaultListeners();
                }
                if (entityListeners != null)
                {
                    for (int i=0; i<entityListeners.length; i++)
                    {
                        // Any EventListener will not have their callback methods registered at this point
                        EventListenerMetaData elmd = new EventListenerMetaData(entityListeners[i].getName());
                        cmd.addListener(elmd);
                    }
                }

                // Inheritance
                InheritanceMetaData inhmd = null;
                if (inheritanceStrategy != null)
                {
                    // Strategy specified so create inheritance data
                    inhmd = cmd.newInheritanceMetadata().setStrategy(inheritanceStrategy);
                    inhmd.setStrategyForTree(inheritanceStrategyForTree);
                }
                else if (discriminatorValue != null || discriminatorColumnName != null ||
                        discriminatorColumnLength != null || discriminatorColumnType != null)
                {
                    // Discriminator specified so we need inheritance data
                    inhmd = cmd.newInheritanceMetadata().setStrategyForTree(inheritanceStrategyForTree);
                }

                if (discriminatorValue != null || discriminatorColumnName != null ||
                    discriminatorColumnLength != null || discriminatorColumnType != null)
                {
                    // Add discriminator information to the inheritance of this class
                    DiscriminatorMetaData dismd = inhmd.newDiscriminatorMetadata();
                    if (discriminatorValue != null)
                    {
                        // Value specified so assumed to be value-map
                        dismd.setColumnName(discriminatorColumnName);
                        dismd.setValue(discriminatorValue).setStrategy("value-map").setIndexed("false");
                    }
                    else
                    {
                        // No value so use class-name
                        discriminatorValue = cls.getName();
                        dismd.setColumnName(discriminatorColumnName);
                        dismd.setValue(discriminatorValue).setStrategy("value-map").setIndexed("false");
                    }

                    ColumnMetaData discolmd = null;
                    if (discriminatorColumnLength != null || discriminatorColumnName != null || discriminatorColumnType != null)
                    {
                        discolmd = new ColumnMetaData();
                        discolmd.setName(discriminatorColumnName);
                        if (discriminatorColumnType != null)
                        {
                            discolmd.setJdbcType(discriminatorColumnType);
                        }
                        if (discriminatorColumnLength != null)
                        {
                            discolmd.setLength(discriminatorColumnLength);
                        }
                        dismd.setColumnMetaData(discolmd);
                        if (discriminatorColumnDdl != null)
                        {
                            discolmd.setColumnDdl(discriminatorColumnDdl);
                        }
                    }
                }

                // extension - datastore-identity
View Full Code Here

                        if (cols != null)
                        {
                            columnMetaData = new ColumnMetaData[cols.length];
                            for (int j=0;j<cols.length;j++)
                            {
                                columnMetaData[j] = new ColumnMetaData();
                                columnMetaData[j].setName(cols[j].name());
                                columnMetaData[j].setTarget(cols[j].referencedColumnName());
                                columnMetaData[j].setAllowsNull(cols[j].nullable());
                                columnMetaData[j].setInsertable(cols[j].insertable());
                                columnMetaData[j].setUpdateable(cols[j].updatable());
                                columnMetaData[j].setUnique(cols[j].unique());
                            }
                        }
                    }
                    else if (annName.equals(JPAAnnotationUtils.JOIN_COLUMN))
                    {
                        // 1-1 FK column, or 1-N FK column, or N-1 FK column
                        columnMetaData = new ColumnMetaData[1];
                        String colNullable = null;
                        String colInsertable = null;
                        String colUpdateable = null;
                        String colUnique = null;
                        if (annotationValues.get("nullable") != null)
                        {
                            colNullable = annotationValues.get("nullable").toString();
                        }
                        if (annotationValues.get("insertable") != null)
                        {
                            colInsertable = annotationValues.get("insertable").toString();
                        }
                        if (annotationValues.get("updatable") != null)
                        {
                            // Note : "updatable" is spelt incorrectly in the JPA spec.
                            colUpdateable = annotationValues.get("updatable").toString();
                        }
                        if (annotationValues.get("unique") != null)
                        {
                            colUnique = annotationValues.get("unique").toString();
                        }
                        columnMetaData[0] = new ColumnMetaData();
                        columnMetaData[0].setName((String)annotationValues.get("name"));
                        columnMetaData[0].setTarget((String)annotationValues.get("referencedColumnName"));
                        columnMetaData[0].setAllowsNull(colNullable);
                        columnMetaData[0].setInsertable(colInsertable);
                        columnMetaData[0].setUpdateable(colUpdateable);
                        columnMetaData[0].setUnique(colUnique);
                    }
                    else if (annName.equals(JPAAnnotationUtils.ATTRIBUTE_OVERRIDES) && mmd.isEmbedded())
                    {
                        // Embedded field overrides
                        EmbeddedMetaData embmd = new EmbeddedMetaData();
                        embmd.setOwnerMember(mmd.getName());
                        mmd.setEmbeddedMetaData(embmd);                           
                        AttributeOverride[] attributeOverride = (AttributeOverride[])annotationValues.get("value");
                        for (int j=0; j<attributeOverride.length; j++)
                        {
                            AbstractMemberMetaData apmd = new FieldMetaData(embmd, attributeOverride[j].name());
                            embmd.addMember(apmd);
                            try
                            {
                                //needs to do the same for methods
                                Field overrideField = member.getType().getDeclaredField(attributeOverride[j].name());
                                apmd.addColumn(JPAAnnotationUtils.getColumnMetaDataForColumnAnnotation(apmd,
                                    new Member(overrideField), attributeOverride[j].column()));
                            }
                            catch (SecurityException e)
                            {
                                throw new NucleusException("Cannot obtain override field "+
                                    attributeOverride[j].name()+" of class "+member.getType()+
                                    " for persistent class "+cmd.getName(),e);
                            }
                            catch (NoSuchFieldException e)
                            {
                                throw new NucleusException("Override field "+attributeOverride[j].name()+
                                    " does not exist in class "+member.getType()+" for persistent class "+
                                    cmd.getName(),e);
                            }
                        }
                    }
                    else if (annName.equals(JPAAnnotationUtils.JOIN_TABLE))
                    {
                        // Process @JoinTable to generate JoinMetaData
                        mmd.setTable((String)annotationValues.get("name"));
                        mmd.setCatalog((String)annotationValues.get("catalog"));
                        mmd.setSchema((String)annotationValues.get("schema"));

                        joinmd = new JoinMetaData();
                        mmd.setJoinMetaData(joinmd);

                        if (annotationValues.get("joinColumns") != null)
                        {
                            ArrayList<JoinColumn> joinColumns = new ArrayList<JoinColumn>();
                            joinColumns.addAll(Arrays.asList((JoinColumn[])annotationValues.get("joinColumns")));
                            for (int j = 0; j < joinColumns.size(); j++)
                            {
                                ColumnMetaData colmd = new ColumnMetaData();
                                colmd.setName(joinColumns.get(j).name());
                                colmd.setTarget(joinColumns.get(j).referencedColumnName());
                                colmd.setAllowsNull(joinColumns.get(j).nullable());
                                joinmd.addColumn(colmd);
                            }
                        }
                        if (annotationValues.get("inverseJoinColumns") != null)
                        {
                            ArrayList<JoinColumn> elementColumns = new ArrayList<JoinColumn>();
                            elementColumns.addAll(Arrays.asList((JoinColumn[])annotationValues.get("inverseJoinColumns")));
                            ElementMetaData elmd = new ElementMetaData();
                            mmd.setElementMetaData(elmd);
                            for (int j = 0; j < elementColumns.size(); j++)
                            {
                                ColumnMetaData colmd = new ColumnMetaData();
                                colmd.setName(elementColumns.get(j).name());
                                colmd.setTarget(elementColumns.get(j).referencedColumnName());
                                colmd.setAllowsNull(elementColumns.get(j).nullable());
                                elmd.addColumn(colmd);
                            }
                        }
                        UniqueConstraint[] joinUniqueConstraints = (UniqueConstraint[])annotationValues.get("uniqueConstraints");
                        if (joinUniqueConstraints != null && joinUniqueConstraints.length > 0)
                        {
                            // Unique constraints on the join table
                            for (int j=0;j<joinUniqueConstraints.length;j++)
                            {
                                UniqueMetaData unimd = new UniqueMetaData();
                                for (int k=0;k<joinUniqueConstraints[j].columnNames().length;k++)
                                {
                                    ColumnMetaData colmd = new ColumnMetaData();
                                    colmd.setName(joinUniqueConstraints[j].columnNames()[k]);
                                    unimd.addColumn(colmd);
                                }
                                joinmd.setUniqueMetaData(unimd); // JDO only supports a single unique constraint on a join table
                            }
                        }
                    }
                    else if (annName.equals(JPAAnnotationUtils.COLLECTION_TABLE) &&
                        (jpaLevel.equalsIgnoreCase("JPA2") || jpaLevel.equalsIgnoreCase("DataNucleus")))
                    {
                        // Process @CollectionTable to generate JoinMetaData
                        mmd.setTable((String)annotationValues.get("name"));
                        mmd.setCatalog((String)annotationValues.get("catalog"));
                        mmd.setSchema((String)annotationValues.get("schema"));

                        joinmd = mmd.getJoinMetaData();
                        if (joinmd == null)
                        {
                            // Should always be set by @ElementCollection but add just in case
                            joinmd = new JoinMetaData();
                            mmd.setJoinMetaData(joinmd);
                        }

                        if (annotationValues.get("joinColumns") != null)
                        {
                            ArrayList<JoinColumn> joinColumns = new ArrayList<JoinColumn>();
                            joinColumns.addAll(Arrays.asList((JoinColumn[])annotationValues.get("joinColumns")));
                            for (int j = 0; j < joinColumns.size(); j++)
                            {
                                ColumnMetaData colmd = new ColumnMetaData();
                                colmd.setName(joinColumns.get(j).name());
                                colmd.setTarget(joinColumns.get(j).referencedColumnName());
                                colmd.setAllowsNull(joinColumns.get(j).nullable());
                                joinmd.addColumn(colmd);
                            }
                        }
                        UniqueConstraint[] joinUniqueConstraints = (UniqueConstraint[])annotationValues.get("uniqueConstraints");
                        if (joinUniqueConstraints != null && joinUniqueConstraints.length > 0)
                        {
                            // Unique constraints on the join table
                            for (int j=0;j<joinUniqueConstraints.length;j++)
                            {
                                UniqueMetaData unimd = new UniqueMetaData();
                                for (int k=0;k<joinUniqueConstraints[j].columnNames().length;k++)
                                {
                                    ColumnMetaData colmd = new ColumnMetaData();
                                    colmd.setName(joinUniqueConstraints[j].columnNames()[k]);
                                    unimd.addColumn(colmd);
                                }
                                joinmd.setUniqueMetaData(unimd); // JDO only supports a single unique constraint on a join table
                            }
                        }
                    }
                    else if (annName.equals(JPAAnnotationUtils.MAP_KEY))
                    {
                        String keyMappedBy = (String)annotationValues.get("name");
                        if (keyMappedBy != null)
                        {
                            KeyMetaData keymd = new KeyMetaData();
                            keymd.setMappedBy(keyMappedBy);
                            mmd.setKeyMetaData(keymd);
                            if (mmd.getMap() != null &&
                                (mmd.getMap().getKeyType() == null || mmd.getMap().getKeyType().equals(Object.class.getName())))
                            {
                                // Set keyType based on mapped-by field of value class
                                String valueType = mmd.getMap().getValueType();
                                try
                                {
                                    Class cls = clr.classForName(valueType);
                                    try
                                    {
                                        Field fld = cls.getDeclaredField(keyMappedBy);
                                        mmd.getMap().setKeyType(fld.getType().getName());
                                    }
                                    catch (NoSuchFieldException nsfe)
                                    {
                                        try
                                        {
                                            String getterName = ClassUtils.getJavaBeanGetterName(keyMappedBy, false);
                                            Method mthd = cls.getDeclaredMethod(getterName, (Class[])null);
                                            mmd.getMap().setKeyType(mthd.getReturnType().getName());
                                        }
                                        catch (NoSuchMethodException nsme)
                                        {
                                        }
                                    }
                                }
                                catch (Exception e)
                                {
                                }
                            }
                        }
                    }
                    else if (annName.equals(JPAAnnotationUtils.ORDER_BY))
                    {
                        if (mmd.getOrderMetaData() != null)
                        {
                            throw new NucleusException("@OrderBy found yet field=" +
                                cmd.getFullClassName() + "." + member.getName() +
                                " already has ordering information!");
                        }

                        String orderBy = (String)annotationValues.get("value");
                        if (orderBy != null)
                        {
                            // "Ordered List"
                            OrderMetaData ordmd = new OrderMetaData();
                            ordmd.setOrdering(orderBy);
                            mmd.setOrderMetaData(ordmd);
                        }
                    }
                    else if (annName.equals(JPAAnnotationUtils.ORDER_COLUMN))
                    {
                        if (mmd.getOrderMetaData() != null)
                        {
                            throw new NucleusException("@OrderColumn found yet field=" +
                                cmd.getFullClassName() + "." + member.getName() +
                                " already has ordering information!");
                        }

                        String columnName = (String)annotationValues.get("name");
                        int orderingOrigin = ((Integer)annotationValues.get("base")).intValue();
                        OrderMetaData ordermd = new OrderMetaData();
                        ordermd.setColumnName(columnName);
                        ordermd.setOrderOrigin(orderingOrigin);

                        String colNullable = null;
                        String colInsertable = null;
                        String colUpdateable = null;
                        if (annotationValues.get("nullable") != null)
                        {
                            colNullable = annotationValues.get("nullable").toString();
                        }
                        if (annotationValues.get("insertable") != null)
                        {
                            colInsertable = annotationValues.get("insertable").toString();
                        }
                        if (annotationValues.get("updatable") != null)
                        {
                            // Note : "updatable" is spelt incorrectly in the JPA spec.
                            colUpdateable = annotationValues.get("updatable").toString();
                        }
                        ColumnMetaData colmd = new ColumnMetaData();
                        colmd.setName(columnName);
                        colmd.setAllowsNull(colNullable);
                        colmd.setInsertable(colInsertable);
                        colmd.setUpdateable(colUpdateable);
                        String tmp = (String)annotationValues.get("columnDefinition");
                        if (!StringUtils.isWhitespace(tmp))
                        {
                            colmd.setColumnDdl(tmp);
                        }
                        ordermd.addColumn(colmd);
                        mmd.setOrderMetaData(ordermd);
                    }
                    else if (annName.equals(JPAAnnotationUtils.ONE_TO_MANY))
                    {
                        // 1-N relation
                        oneToMany = true;
                    }
                    else if (annName.equals(JPAAnnotationUtils.MANY_TO_MANY))
                    {
                        // M-N relation
                        manyToMany = true;
                    }
                }
            }

            // Post-processing to apply JPA rules for field relationships etc
            if (oneToMany && mmd.getJoinMetaData() == null && mmd.getMappedBy() == null &&
                jpaLevel.equalsIgnoreCase("JPA1"))
            {
                // 1-N with no join specified and unidirectional so JPA says it has to be via join (no 1-N uni FKs)
                mmd.setJoinMetaData(new JoinMetaData());
            }
            if (manyToMany && mmd.getJoinMetaData() == null && mmd.getMappedBy() == null)
            {
                // M-N with no join specified and unidir so add the join for them
                mmd.setJoinMetaData(new JoinMetaData());
            }

            if (mmd.getOrderMetaData() == null && Collection.class.isAssignableFrom(member.getType()))
            {
                // @OrderBy not specified but is a Collection so use ordering of element using PK field(s)
                OrderMetaData ordmd = new OrderMetaData();
                ordmd.setOrdering("#PK"); // Special value recognised by OrderMetaData
                mmd.setOrderMetaData(ordmd);
            }

            if (columnMetaData == null)
            {
                // Column specified (at least in part) via @Column/@Lob/@Enumerated/@Temporal
                ColumnMetaData colmd = newColumnMetaData(mmd, member, annotations);
                if (colmd != null)
                {
                    columnMetaData = new ColumnMetaData[1];
                    columnMetaData[0] = colmd;
                }
View Full Code Here

                            vermd.setColumnName(column);
                            vermd.setIndexed(IndexedValue.getIndexedValue(indexed));
                            if (columns != null && columns.length > 0)
                            {
                                // Only use the first column
                                ColumnMetaData colmd =
                                    JDOAnnotationUtils.getColumnMetaDataForColumnAnnotation(columns[0]);
                                vermd.addColumn(colmd);
                            }
                            JDOAnnotationUtils.addExtensionsToMetaData(vermd, (Extension[])annotationValues.get("extensions"));
                        }
                        else if (annName.equals(JDOAnnotationUtils.DATASTORE_IDENTITY))
                        {
                            String strategy = JDOAnnotationUtils.getIdentityStrategyString(
                                (IdGeneratorStrategy)annotationValues.get("strategy"));
                            String customStrategy = (String)annotationValues.get("customStrategy");
                            if (!StringUtils.isWhitespace(customStrategy))
                            {
                                // User has provided an extension strategy
                                strategy = customStrategy;
                            }
                            String sequence = (String)annotationValues.get("sequence");
                            String column = (String)annotationValues.get("column");
                            Column[] columns = (Column[])annotationValues.get("columns");
                            idmd = new IdentityMetaData();
                            idmd.setColumnName(column);
                            idmd.setValueStrategy(IdentityStrategy.getIdentityStrategy(strategy));
                            idmd.setSequence(sequence);
                            if (columns != null && columns.length > 0)
                            {
                                // Only use the first column
                                ColumnMetaData colmd =
                                    JDOAnnotationUtils.getColumnMetaDataForColumnAnnotation(columns[0]);
                                idmd.addColumn(colmd);
                            }
                            JDOAnnotationUtils.addExtensionsToMetaData(idmd, (Extension[])annotationValues.get("extensions"));
                        }
                        else if (annName.equals(JDOAnnotationUtils.PRIMARY_KEY))
                        {
                            String pkName = (String)annotationValues.get("name");
                            String pkColumn = (String)annotationValues.get("column");
                            Column[] columns = (Column[])annotationValues.get("columns");
                            pkmd = new PrimaryKeyMetaData();
                            pkmd.setName(pkName);
                            pkmd.setColumnName(pkColumn);
                            if (columns != null && columns.length > 0)
                            {
                                for (int j=0;j<columns.length;j++)
                                {
                                    pkmd.addColumn(JDOAnnotationUtils.getColumnMetaDataForColumnAnnotation(columns[j]));
                                }
                            }
                        }
                        else if (annName.equals(JDOAnnotationUtils.JOINS))
                        {
                            if (joins != null)
                            {
                                NucleusLogger.METADATA.warn(LOCALISER.msg("044210", cmd.getFullClassName()));
                            }
                            Join[] js = (Join[])annotationValues.get("value");
                            if (js != null && js.length > 0)
                            {
                                joins = new JoinMetaData[js.length];
                                for (int j=0;j<js.length;j++)
                                {
                                    joins[j] = new JoinMetaData();
                                    joins[j].setTable(js[j].table());
                                    joins[j].setColumnName(js[j].column());
                                    joins[j].setIndexed(IndexedValue.getIndexedValue(js[i].indexed()));
                                    joins[j].setOuter(js[j].outer());
                                    joins[j].setUnique(js[i].unique());
                                    joins[j].setDeleteAction(JDOAnnotationUtils.getForeignKeyActionString(js[j].deleteAction()));
                                }
                            }
                        }
                        else if (annName.equals(JDOAnnotationUtils.JOIN))
                        {
                            if (joins != null)
                            {
                                NucleusLogger.METADATA.warn(LOCALISER.msg("044210", cmd.getFullClassName()));
                            }
                            joins = new JoinMetaData[1];
                            joins[0] = new JoinMetaData();
                            joins[0].setTable((String)annotationValues.get("table"));
                            joins[0].setColumnName((String)annotationValues.get("column"));
                            joins[0].setIndexed(IndexedValue.getIndexedValue((String)annotationValues.get("indexed")));
                            joins[0].setOuter((String)annotationValues.get("outer"));
                            joins[0].setUnique((String)annotationValues.get("unique"));
                            joins[0].setDeleteAction(((ForeignKeyAction)annotationValues.get("deleteAction")).toString());
                            JDOAnnotationUtils.addExtensionsToMetaData(joins[0], (Extension[])annotationValues.get("extensions"));
                        }
                        else if (annName.equals(JDOAnnotationUtils.INHERITANCE))
                        {
                            String strategy = JDOAnnotationUtils.getInheritanceStrategyString(
                                (InheritanceStrategy)annotationValues.get("strategy"));
                            String customStrategy = (String)annotationValues.get("customStrategy");
                            if (!StringUtils.isWhitespace(customStrategy))
                            {
                                // User has provided an extension strategy
                                strategy = customStrategy;
                            }
                            inhmd = new InheritanceMetaData();
                            inhmd.setStrategy(strategy);
                        }
                        else if (annName.equals(JDOAnnotationUtils.DISCRIMINATOR))
                        {
                            DiscriminatorStrategy discriminatorStrategy = (DiscriminatorStrategy)annotationValues.get("strategy");
                            String strategy = JDOAnnotationUtils.getDiscriminatorStrategyString(discriminatorStrategy);
                            String column = (String)annotationValues.get("column");
                            String indexed = (String)annotationValues.get("indexed");
                            String value = (String)annotationValues.get("value");
                            Column[] columns = (Column[])annotationValues.get("columns");
                            dismd = new DiscriminatorMetaData();
                            dismd.setColumnName(column);
                            dismd.setValue(value);
                            dismd.setStrategy(strategy);
                            dismd.setIndexed(indexed);
                            if (columns != null && columns.length > 0)
                            {
                                // Only use the first column
                                ColumnMetaData colmd =
                                    JDOAnnotationUtils.getColumnMetaDataForColumnAnnotation(columns[0]);
                                dismd.setColumnMetaData(colmd);
                            }
                        }
                        else if (annName.equals(JDOAnnotationUtils.QUERIES))
                        {
                            if (queries != null)
                            {
                                NucleusLogger.METADATA.warn(LOCALISER.msg("044209", cmd.getFullClassName()));
                            }
                            Query[] qs = (Query[])annotationValues.get("value");
                            queries = new QueryMetaData[qs.length];
                            for (int j=0;j<queries.length;j++)
                            {
                                String lang = JDOAnnotationUtils.getQueryLanguageName(qs[j].language());
                                String resultClassName = (qs[j].resultClass() != null && qs[j].resultClass() != void.class ?
                                        qs[j].resultClass().getName() : null);
                                queries[j] = new QueryMetaData(qs[j].name());
                                queries[j].setScope(cls.getName());
                                queries[j].setLanguage(lang);
                                queries[j].setUnmodifiable(qs[j].unmodifiable());
                                queries[j].setResultClass(resultClassName);
                                queries[j].setUnique(qs[j].unique());
                                queries[j].setFetchPlanName(qs[j].fetchPlan());
                                queries[j].setQuery(qs[j].value());
                                JDOAnnotationUtils.addExtensionsToMetaData(queries[j], qs[j].extensions());
                            }
                        }
                        else if (annName.equals(JDOAnnotationUtils.QUERY))
                        {
                            if (queries != null)
                            {
                                NucleusLogger.METADATA.warn(LOCALISER.msg("044209", cmd.getFullClassName()));
                            }
                            queries = new QueryMetaData[1];
                            String unmodifiable = "" + annotationValues.get("unmodifiable");
                            Class resultClassValue = (Class)annotationValues.get("resultClass");
                            String resultClassName =
                                (resultClassValue != null && resultClassValue != void.class ? resultClassValue.getName() : null);
                            String lang = JDOAnnotationUtils.getQueryLanguageName((String)annotationValues.get("language"));
                            queries[0] = new QueryMetaData((String)annotationValues.get("name"));
                            queries[0].setScope(cls.getName());
                            queries[0].setLanguage(lang);
                            queries[0].setUnmodifiable(unmodifiable);
                            queries[0].setResultClass(resultClassName);
                            queries[0].setUnique((String)annotationValues.get("unique"));
                            queries[0].setFetchPlanName((String)annotationValues.get("fetchPlan"));
                            queries[0].setQuery((String)annotationValues.get("value"));
                            JDOAnnotationUtils.addExtensionsToMetaData(queries[0], (Extension[])annotationValues.get("extensions"));
                        }
                        else if (annName.equals(JDOAnnotationUtils.FETCHPLANS))
                        {
                            if (fetchPlans != null)
                            {
                                NucleusLogger.METADATA.warn(LOCALISER.msg("044207", cmd.getFullClassName()));
                            }
                            FetchPlan[] plans = (FetchPlan[])annotationValues.get("value");
                            fetchPlans = new FetchPlanMetaData[plans.length];
                            for (int j=0;j<plans.length;j++)
                            {
                                fetchPlans[j] = new FetchPlanMetaData(plans[j].name());
                                fetchPlans[j].setMaxFetchDepth(plans[j].maxFetchDepth());
                                fetchPlans[j].setFetchSize(plans[j].fetchSize());
                                int numGroups = plans[j].fetchGroups().length;
                                for (int k=0;k<numGroups;k++)
                                {
                                    FetchGroupMetaData fgmd = new FetchGroupMetaData(plans[j].fetchGroups()[k]);
                                    fetchPlans[j].addFetchGroup(fgmd);
                                }
                            }
                        }
                        else if (annName.equals(JDOAnnotationUtils.FETCHPLAN))
                        {
                            if (fetchPlans != null)
                            {
                                NucleusLogger.METADATA.warn(LOCALISER.msg("044207", cmd.getFullClassName()));
                            }
                            fetchPlans = new FetchPlanMetaData[1];
                            int maxFetchDepth = ((Integer)annotationValues.get("maxFetchDepth")).intValue();
                            int fetchSize = ((Integer)annotationValues.get("fetchSize")).intValue();
                            fetchPlans[0] = new FetchPlanMetaData((String)annotationValues.get("name"));
                            fetchPlans[0].setMaxFetchDepth(maxFetchDepth);
                            fetchPlans[0].setFetchSize(fetchSize);
                        }
                        else if (annName.equals(JDOAnnotationUtils.FETCHGROUPS))
                        {
                            if (fetchGroups != null)
                            {
                                NucleusLogger.METADATA.warn(LOCALISER.msg("044208", cmd.getFullClassName()));
                            }
                            FetchGroup[] groups = (FetchGroup[])annotationValues.get("value");
                            fetchGroups = new FetchGroupMetaData[groups.length];
                            for (int j=0;j<groups.length;j++)
                            {
                                fetchGroups[j] = new FetchGroupMetaData(groups[j].name());
                                fetchGroups[j].setPostLoad(groups[j].postLoad());
                                int numFields = groups[j].members().length;
                                for (int k=0;k<numFields;k++)
                                {
                                    FieldMetaData fmd = new FieldMetaData(fetchGroups[j],
                                        groups[j].members()[k].name());
                                    fmd.setRecursionDepth(groups[j].members()[k].recursionDepth());
                                    fetchGroups[j].addMember(fmd);
                                }
                                int numGroups = groups[j].fetchGroups().length;
                                for (int k=0;k<numGroups;k++)
                                {
                                    FetchGroupMetaData subgrp = new FetchGroupMetaData(groups[j].fetchGroups()[k]);
                                    fetchGroups[j].addFetchGroup(subgrp);
                                }
                            }
                        }
                        else if (annName.equals(JDOAnnotationUtils.FETCHGROUP))
                        {
                            if (fetchGroups != null)
                            {
                                NucleusLogger.METADATA.warn(LOCALISER.msg("044208", cmd.getFullClassName()));
                            }
                            fetchGroups = new FetchGroupMetaData[1];
                            fetchGroups[0] = new FetchGroupMetaData((String)annotationValues.get("name"));
                            fetchGroups[0].setPostLoad((String)annotationValues.get("postLoad"));
                            Persistent[] fields = (Persistent[])annotationValues.get("members");
                            if (fields != null)
                            {
                                for (int j=0;j<fields.length;j++)
                                {
                                    FieldMetaData fmd = new FieldMetaData(fetchGroups[0],
                                        fields[j].name());
                                    fmd.setRecursionDepth(fields[j].recursionDepth());
                                    fetchGroups[0].addMember(fmd);
                                }
                            }
                        }
                        else if (annName.equals(JDOAnnotationUtils.SEQUENCE))
                        {
                            String seqName = (String)annotationValues.get("name");
                            String seqStrategy = JDOAnnotationUtils.getSequenceStrategyString(
                                (SequenceStrategy)annotationValues.get("strategy"));
                            String seqSeq = (String)annotationValues.get("datastoreSequence");
                            Class seqFactory = (Class)annotationValues.get("factoryClass");
                            String seqFactoryClassName = null;
                            if (seqFactory != null && seqFactory != void.class)
                            {
                                seqFactoryClassName = seqFactory.getName();
                            }
                            seqmd = new SequenceMetaData(seqName, seqStrategy);
                            seqmd.setFactoryClass(seqFactoryClassName);
                            seqmd.setDatastoreSequence(seqSeq);
                            JDOAnnotationUtils.addExtensionsToMetaData(seqmd, (Extension[])annotationValues.get("extensions"));
                        }
                        else if (annName.equals(JDOAnnotationUtils.INDICES))
                        {
                            // Multiple Indices for the class
                            Index[] values = (Index[])annotationValues.get("value");
                            if (values != null && values.length > 0)
                            {
                                indices = new HashSet<IndexMetaData>(values.length);
                                for (int j=0;j<values.length;j++)
                                {
                                    IndexMetaData idxmd = JDOAnnotationUtils.getIndexMetaData(values[j].name(), values[j].table(),
                                        "" + values[j].unique(), values[j].members(), values[j].columns());
                                    if (idxmd.getNumberOfColumns() == 0 && idxmd.getNumberOfMembers() == 0)
                                    {
                                        NucleusLogger.METADATA.warn(LOCALISER.msg("044204", cls.getName()));
                                    }
                                    else
                                    {
                                        indices.add(idxmd);
                                    }
                                }
                            }
                        }
                        else if (annName.equals(JDOAnnotationUtils.INDEX))
                        {
                            // Single Index for the class
                            String name = (String)annotationValues.get("name");
                            String table = (String)annotationValues.get("table");
                            String unique = (String)annotationValues.get("unique");
                            String[] members = (String[])annotationValues.get("members");
                            Column[] columns = (Column[])annotationValues.get("columns");

                            IndexMetaData idxmd = JDOAnnotationUtils.getIndexMetaData(name, table, unique, members, columns);
                            if (idxmd.getNumberOfColumns() == 0 && idxmd.getNumberOfMembers() == 0)
                            {
                                NucleusLogger.METADATA.warn(LOCALISER.msg("044204", cls.getName()));
                            }
                            else
                            {
                                indices = new HashSet<IndexMetaData>(1);
                                indices.add(idxmd);
                            }
                        }
                        else if (annName.equals(JDOAnnotationUtils.UNIQUES))
                        {
                            // Multiple Unique Constraints for the class
                            Unique[] values = (Unique[])annotationValues.get("value");
                            if (values != null && values.length > 0)
                            {
                                uniqueKeys = new HashSet<UniqueMetaData>(values.length);
                                for (int j=0;j<values.length;j++)
                                {
                                    UniqueMetaData unimd = JDOAnnotationUtils.getUniqueMetaData(values[j].name(),
                                        values[j].table(), "" + values[j].deferred(), values[j].members(), values[j].columns());
                                    if (unimd.getNumberOfColumns() == 0 && unimd.getNumberOfMembers() == 0)
                                    {
                                        NucleusLogger.METADATA.warn(LOCALISER.msg("044205", cls.getName()));
                                    }
                                    else
                                    {
                                        uniqueKeys.add(unimd);
                                    }
                                }
                            }
                        }
                        else if (annName.equals(JDOAnnotationUtils.UNIQUE))
                        {
                            // Single Unique constraint for the class
                            String name = (String)annotationValues.get("name");
                            String table = (String)annotationValues.get("table");
                            String deferred = (String)annotationValues.get("deferred");
                            String[] members = (String[])annotationValues.get("members");
                            Column[] columns = (Column[])annotationValues.get("columns");

                            UniqueMetaData unimd = JDOAnnotationUtils.getUniqueMetaData(name, table, deferred, members, columns);
                            if (unimd.getNumberOfColumns() == 0 && unimd.getNumberOfMembers() == 0)
                            {
                                NucleusLogger.METADATA.warn(LOCALISER.msg("044205", cls.getName()));
                            }
                            else
                            {
                                uniqueKeys = new HashSet<UniqueMetaData>(1);
                                uniqueKeys.add(unimd);
                            }
                        }
                        else if (annName.equals(JDOAnnotationUtils.FOREIGNKEYS))
                        {
                            // Multiple FKs for the class
                            ForeignKey[] values = (ForeignKey[])annotationValues.get("value");
                            if (values != null && values.length > 0)
                            {
                                fks = new HashSet<ForeignKeyMetaData>(values.length);
                                for (int j=0;j<values.length;j++)
                                {
                                    String deleteAction = JDOAnnotationUtils.getForeignKeyActionString(values[j].deleteAction());
                                    String updateAction = JDOAnnotationUtils.getForeignKeyActionString(values[j].deleteAction());
                                    ForeignKeyMetaData fkmd = JDOAnnotationUtils.getFKMetaData(values[j].name(),
                                        values[j].table(), values[j].unique(), "" + values[j].deferred(),
                                        deleteAction, updateAction, values[j].members(), values[j].columns());
                                    if (fkmd.getNumberOfColumns() == 0 && fkmd.getNumberOfMembers() == 0)
                                    {
                                        NucleusLogger.METADATA.warn(LOCALISER.msg("044206", cls.getName()));
                                    }
                                    else
                                    {
                                        fks.add(fkmd);
                                    }
                                }
                            }
                        }
                        else if (annName.equals(JDOAnnotationUtils.FOREIGNKEY))
                        {
                            // Single FK constraint for the class
                            String name = (String)annotationValues.get("name");
                            String table = (String)annotationValues.get("table");
                            String unique = (String)annotationValues.get("unique");
                            String deferred = (String)annotationValues.get("deferred");
                            String deleteAction = JDOAnnotationUtils.getForeignKeyActionString(
                                (ForeignKeyAction)annotationValues.get("deleteAction"));
                            String updateAction = JDOAnnotationUtils.getForeignKeyActionString(
                                (ForeignKeyAction)annotationValues.get("updateAction"));
                            String[] members = (String[])annotationValues.get("members");
                            Column[] columns = (Column[])annotationValues.get("columns");

                            ForeignKeyMetaData fkmd = JDOAnnotationUtils.getFKMetaData(name, table, unique, deferred,
                                deleteAction, updateAction, members, columns);
                            if (fkmd.getNumberOfColumns() == 0 && fkmd.getNumberOfMembers() == 0)
                            {
                                NucleusLogger.METADATA.warn(LOCALISER.msg("044206", cls.getName()));
                            }
                            else
                            {
                                fks = new HashSet<ForeignKeyMetaData>(1);
                                fks.add(fkmd);
                            }
                        }
                        else if (annName.equals(JDOAnnotationUtils.COLUMNS))
                        {
                            // Unmapped column specification
                            Column[] cols = (Column[])annotationValues.get("value");
                            if (cols != null && cols.length > 0)
                            {
                                unmappedColumns = new ColumnMetaData[cols.length];
                                for (int j=0;j<cols.length;j++)
                                {
                                    unmappedColumns[j] =
                                        JDOAnnotationUtils.getColumnMetaDataForColumnAnnotation(cols[j]);
                                    JDOAnnotationUtils.addExtensionsToMetaData(unmappedColumns[j], cols[j].extensions());
                                }
                            }
                        }
                        else if (annName.equals(JDOAnnotationUtils.CACHEABLE))
                        {
                            String cache = (String)annotationValues.get("value");
                            if (cache != null)
                            {
                                cacheable = cache;
                            }
                        }
                        else if (annName.equals(JDOAnnotationUtils.EXTENSIONS))
                        {
                            Extension[] values = (Extension[])annotationValues.get("value");
                            if (values != null && values.length > 0)
                            {
                                extensions = new HashSet<ExtensionMetaData>(values.length);
                                for (int j=0;j<values.length;j++)
                                {
                                    ExtensionMetaData extmd = new ExtensionMetaData(values[j].vendorName(),
                                        values[j].key().toString(), values[j].value().toString());
                                    extensions.add(extmd);
                                }
                            }
                        }
                        else if (annName.equals(JDOAnnotationUtils.EXTENSION))
                        {
                            ExtensionMetaData extmd = new ExtensionMetaData((String)annotationValues.get("vendorName"),
                                (String)annotationValues.get("key"), (String)annotationValues.get("value"));
                            extensions = new HashSet<ExtensionMetaData>(1);
                            extensions.add(extmd);
                        }
                        else
                        {
                            if (!annName.equals(JDOAnnotationUtils.PERSISTENCE_CAPABLE) &&
                                !annName.equals(JDOAnnotationUtils.PERSISTENCE_AWARE))
                            {
                                NucleusLogger.METADATA.error(LOCALISER.msg("044203", cls.getName(),
                                    annotations[i].getName()));
                            }
                        }
                    }
                }

                // Either PersistenceCapable, PersistenceAware or PersistentInterface so build up the metadata
                NucleusLogger.METADATA.info(LOCALISER.msg("044200", cls.getName(), "JDO"));

                if (cmd instanceof ClassMetaData)
                {
                    pmd.addClass((ClassMetaData)cmd);
                }
                else if (cmd instanceof InterfaceMetaData)
                {
                    pmd.addInterface((InterfaceMetaData)cmd);
                }

                if (embeddedOnly)
                {
                    cmd.setEmbeddedOnly(true);
                }
                if (idmd != null)
                {
                    // Datastore identity
                    idmd.setParent(cmd);
                    cmd.setIdentityMetaData(idmd);
                }
                if (pkmd != null)
                {
                    // Primary Key
                    pkmd.setParent(cmd);
                    cmd.setPrimaryKeyMetaData(pkmd);
                }

                if (vermd != null)
                {
                    // Version
                    vermd.setParent(cmd);
                    cmd.setVersionMetaData(vermd);
                }

                if (inhmd != null)
                {
                    // Inheritance
                    if (dismd != null)
                    {
                        inhmd.setDiscriminatorMetaData(dismd);
                    }
                    inhmd.setParent(cmd);
                    cmd.setInheritanceMetaData(inhmd);
                }
                else if (dismd != null)
                {
                    inhmd = new InheritanceMetaData();
                    inhmd.setDiscriminatorMetaData(dismd);
                    cmd.setInheritanceMetaData(inhmd);
                }

                if (joins != null && joins.length > 0)
                {
                    // Joins
                    for (int i=0;i<joins.length;i++)
                    {
                        cmd.addJoin(joins[i]);
                    }
                }
                if (queries != null && queries.length > 0)
                {
                    // Named Queries
                    for (int i=0;i<queries.length;i++)
                    {
                        queries[i].setParent(cmd);
                        cmd.addQuery(queries[i]);
                    }
                }
                if (fetchGroups != null && fetchGroups.length > 0)
                {
                    // Fetch Groups
                    for (int i=0;i<fetchGroups.length;i++)
                    {
                        fetchGroups[i].setParent(cmd);
                        cmd.addFetchGroup(fetchGroups[i]);
                    }
                }

                if (seqmd != null)
                {
                    // Sequence - currently only allowing 1 per class (should really be on the package)
                    cmd.getPackageMetaData().addSequence(seqmd);
                }

                if (indices != null)
                {
                    Iterator iter = indices.iterator();
                    while (iter.hasNext())
                    {
                        IndexMetaData idxmd = (IndexMetaData)iter.next();
                        idxmd.setParent(cmd);
                        cmd.addIndex(idxmd);
                    }
                }
                if (uniqueKeys != null)
                {
                    Iterator iter = uniqueKeys.iterator();
                    while (iter.hasNext())
                    {
                        UniqueMetaData unimd = (UniqueMetaData)iter.next();
                        unimd.setParent(cmd);
                        cmd.addUniqueConstraint(unimd);
                    }
                }
                if (fks != null)
                {
                    Iterator iter = fks.iterator();
                    while (iter.hasNext())
                    {
                        ForeignKeyMetaData fkmd = (ForeignKeyMetaData)iter.next();
                        fkmd.setParent(cmd);
                        cmd.addForeignKey(fkmd);
                    }
                }
                if (unmappedColumns != null)
                {
                    Iterator iter = fks.iterator();
                    while (iter.hasNext())
                    {
                        ColumnMetaData colmd = (ColumnMetaData)iter.next();
                        colmd.setParent(cmd);
                        cmd.addUnmappedColumn(colmd);
                    }
                }
                if (cacheable != null && cacheable.equalsIgnoreCase("false"))
                {
View Full Code Here

            allowsNull == null && unique == null && jdbcType == null && sqlType == null)
        {
            return null;
        }

        ColumnMetaData colmd = new ColumnMetaData();
        colmd.setName(columnName);
        colmd.setTarget(target);
        colmd.setTargetMember(targetField);
        colmd.setJdbcType(jdbcType);
        colmd.setSqlType(sqlType);
        colmd.setLength(length);
        colmd.setScale(scale);
        colmd.setAllowsNull(allowsNull);
        colmd.setDefaultValue(defaultValue);
        colmd.setInsertValue(insertValue);
        colmd.setInsertable(insertable);
        colmd.setUpdateable(updateable);
        colmd.setUnique(unique);
        if (columnDdl != null)
        {
            colmd.setColumnDdl(columnDdl);
        }
        if (parent instanceof AbstractMemberMetaData)
        {
            AbstractMemberMetaData apmd = (AbstractMemberMetaData) parent;
            apmd.setTable(table);
            // apmd.addColumn(colmd);
            // update column settings if primary key, cannot be null
            colmd.setAllowsNull(new Boolean(apmd.isPrimaryKey() ? false : colmd.isAllowsNull()));
        }
        return colmd;
    }
View Full Code Here

                        PrimaryKeyJoinColumn[] pkJoinCols = secTableAnns[j].pkJoinColumns();
                        if (pkJoinCols != null)
                        {
                            for (int k = 0; k < pkJoinCols.length; k++)
                            {
                                ColumnMetaData colmd = new ColumnMetaData();
                                colmd.setName(pkJoinCols[k].name());
                                colmd.setTarget(pkJoinCols[k].referencedColumnName());
                                joinmd.addColumn(colmd);
                            }
                        }
                        joins.add(joinmd);
                        cmd.addJoin(joinmd);

                        UniqueConstraint[] constrs = secTableAnns[j].uniqueConstraints();
                        if (constrs != null && constrs.length > 0)
                        {
                            for (int k=0;k<constrs.length;k++)
                            {
                                UniqueMetaData unimd = new UniqueMetaData();
                                unimd.setTable((String)annotationValues.get("table"));
                                for (int l=0;l<constrs[k].columnNames().length;l++)
                                {
                                    ColumnMetaData colmd = new ColumnMetaData();
                                    colmd.setName(constrs[k].columnNames()[l]);
                                    unimd.addColumn(colmd);
                                }
                                joinmd.setUniqueMetaData(unimd); // JDO only allows one unique
                            }
                        }
                    }
                }
            }
            else if (annName.equals(JPAAnnotationUtils.SECONDARY_TABLE))
            {
                JoinMetaData joinmd = new JoinMetaData();
                joinmd.setTable((String)annotationValues.get("name"));
                joinmd.setCatalog((String)annotationValues.get("catalog"));
                joinmd.setSchema((String)annotationValues.get("schema"));
                if (annotationValues.get("pkJoinColumns") != null)
                {
                    PrimaryKeyJoinColumn[] joinCols = (PrimaryKeyJoinColumn[])annotationValues.get("pkJoinColumns");
                    for (int j = 0; j < joinCols.length; j++)
                    {
                        ColumnMetaData colmd = new ColumnMetaData();
                        colmd.setName(joinCols[j].name());
                        colmd.setTarget(joinCols[j].referencedColumnName());
                        joinmd.addColumn(colmd);
                    }
                }
                joins.add(joinmd);
                cmd.addJoin(joinmd);

                UniqueConstraint[] constrs = (UniqueConstraint[])annotationValues.get("uniqueConstraints");
                if (constrs != null && constrs.length > 0)
                {
                    for (int j=0;j<constrs.length;j++)
                    {
                        UniqueMetaData unimd = new UniqueMetaData();
                        unimd.setTable((String)annotationValues.get("table"));
                        for (int k=0;k<constrs[j].columnNames().length;k++)
                        {
                            ColumnMetaData colmd = new ColumnMetaData();
                            colmd.setName(constrs[j].columnNames()[k]);
                            unimd.addColumn(colmd);
                        }
                        joinmd.setUniqueMetaData(unimd); // JDO only allows one unique
                    }
                }
View Full Code Here

TOP

Related Classes of org.datanucleus.metadata.ColumnMetaData

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.