Search in sources :

Example 1 with Table

use of org.springframework.roo.addon.dbre.addon.model.Table in project spring-roo by spring-projects.

the class DbreDatabaseListenerImpl method updateOrDeleteManagedEntity.

private Table updateOrDeleteManagedEntity(final ClassOrInterfaceTypeDetails managedEntity, final Database database) {
    // Update the attributes of the existing JPA-related annotation
    final AnnotationMetadata jpaAnnotation = getJpaAnnotation(managedEntity);
    Validate.validState(jpaAnnotation != null, "@%s not found on existing DBRE-managed entity %s", ROO_JPA_ENTITY.getSimpleTypeName(), managedEntity.getName().getFullyQualifiedTypeName());
    // Find table in database using 'table' and 'schema' attributes from the
    // JPA annotation
    final AnnotationAttributeValue<?> tableAttribute = jpaAnnotation.getAttribute(new JavaSymbolName("table"));
    final String errMsg = "Unable to maintain database-managed entity " + managedEntity.getName().getFullyQualifiedTypeName() + " because its associated table could not be found";
    Validate.notNull(tableAttribute, errMsg);
    final String tableName = (String) tableAttribute.getValue();
    Validate.notBlank(tableName, errMsg);
    final AnnotationAttributeValue<?> schemaAttribute = jpaAnnotation.getAttribute(new JavaSymbolName("schema"));
    final String schemaName = schemaAttribute != null ? (String) schemaAttribute.getValue() : null;
    final Table table = database.getTable(tableName, schemaName);
    if (table == null) {
        // Table is missing and probably has been dropped so delete managed
        // type and its identifier if applicable
        deleteManagedType(managedEntity, "no database table called '" + tableName + "'");
        return null;
    }
    table.setIncludeNonPortableAttributes(database.isIncludeNonPortableAttributes());
    table.setDisableVersionFields(database.isDisableVersionFields());
    table.setDisableGeneratedIdentifiers(database.isDisableGeneratedIdentifiers());
    // Update the @RooJpaEntity attributes
    final AnnotationMetadataBuilder jpaAnnotationBuilder = new AnnotationMetadataBuilder(jpaAnnotation);
    final Set<JavaSymbolName> attributesToDeleteIfPresent = new LinkedHashSet<JavaSymbolName>();
    manageIdentifier(managedEntity.getName(), jpaAnnotationBuilder, attributesToDeleteIfPresent, table);
    // Manage versionField attribute
    final AnnotationAttributeValue<?> versionFieldAttribute = jpaAnnotation.getAttribute(new JavaSymbolName(VERSION_FIELD));
    if (versionFieldAttribute == null) {
        if (hasVersionField(table)) {
            attributesToDeleteIfPresent.add(new JavaSymbolName(VERSION_FIELD));
        } else {
            jpaAnnotationBuilder.addStringAttribute(VERSION_FIELD, "");
        }
    } else {
        final String versionFieldValue = (String) versionFieldAttribute.getValue();
        if (hasVersionField(table) && (StringUtils.isBlank(versionFieldValue) || VERSION.equals(versionFieldValue))) {
            attributesToDeleteIfPresent.add(new JavaSymbolName(VERSION_FIELD));
        }
    }
    final AnnotationAttributeValue<?> sequenceNameFieldAttribute = jpaAnnotation.getAttribute(new JavaSymbolName(SEQUENCE_NAME_FIELD));
    if (sequenceNameFieldAttribute == null) {
        if (!table.isDisableGeneratedIdentifiers()) {
            attributesToDeleteIfPresent.add(new JavaSymbolName(SEQUENCE_NAME_FIELD));
        } else {
            jpaAnnotationBuilder.addStringAttribute(SEQUENCE_NAME_FIELD, "");
        }
    } else {
        final String sequenceNameFieldValue = (String) sequenceNameFieldAttribute.getValue();
        if (!table.isDisableGeneratedIdentifiers() && ("".equals(sequenceNameFieldValue))) {
            attributesToDeleteIfPresent.add(new JavaSymbolName(SEQUENCE_NAME_FIELD));
        }
    }
    // Update the annotation on disk
    final ClassOrInterfaceTypeDetailsBuilder cidBuilder = new ClassOrInterfaceTypeDetailsBuilder(managedEntity);
    cidBuilder.updateTypeAnnotation(jpaAnnotationBuilder.build(), attributesToDeleteIfPresent);
    getTypeManagementService().createOrUpdateTypeOnDisk(cidBuilder.build());
    return table;
}
Also used : LinkedHashSet(java.util.LinkedHashSet) JavaSymbolName(org.springframework.roo.model.JavaSymbolName) Table(org.springframework.roo.addon.dbre.addon.model.Table) ClassOrInterfaceTypeDetailsBuilder(org.springframework.roo.classpath.details.ClassOrInterfaceTypeDetailsBuilder) AnnotationMetadata(org.springframework.roo.classpath.details.annotations.AnnotationMetadata) AnnotationMetadataBuilder(org.springframework.roo.classpath.details.annotations.AnnotationMetadataBuilder)

Example 2 with Table

use of org.springframework.roo.addon.dbre.addon.model.Table in project spring-roo by spring-projects.

the class DbreMetadata method addOneToManyFields.

private void addOneToManyFields(final Table table) {
    Validate.notNull(table, "Table required");
    if (table.isJoinTable()) {
        return;
    }
    for (final ForeignKey exportedKey : table.getExportedKeys()) {
        final Table exportedKeyForeignTable = exportedKey.getForeignTable();
        Validate.notNull(exportedKeyForeignTable, "Foreign key table for foreign key '%s' in table '%s' does not exist. One-to-many relationship not created", exportedKey.getName(), table.getFullyQualifiedTableName());
        if (exportedKeyForeignTable.isJoinTable()) {
            continue;
        }
        final String foreignTableName = exportedKeyForeignTable.getName();
        final String foreignSchemaName = exportedKeyForeignTable.getSchema().getName();
        final Table foreignTable = database.getTable(foreignTableName, foreignSchemaName);
        Validate.notNull(foreignTable, "Related table '%s' could not be found but was referenced by table '%s'", exportedKeyForeignTable.getFullyQualifiedTableName(), table.getFullyQualifiedTableName());
        if (isOneToOne(foreignTable, foreignTable.getImportedKey(exportedKey.getName()))) {
            continue;
        }
        final Short keySequence = exportedKey.getKeySequence();
        final String fieldSuffix = keySequence != null && keySequence > 0 ? String.valueOf(keySequence) : "";
        JavaSymbolName fieldName = new JavaSymbolName(getInflectorPlural(DbreTypeUtils.suggestFieldName(foreignTableName)) + fieldSuffix);
        JavaSymbolName mappedByFieldName = null;
        if (exportedKey.getReferenceCount() == 1) {
            final Reference reference = exportedKey.getReferences().iterator().next();
            mappedByFieldName = new JavaSymbolName(DbreTypeUtils.suggestFieldName(reference.getForeignColumnName()));
        } else {
            mappedByFieldName = new JavaSymbolName(DbreTypeUtils.suggestFieldName(table) + fieldSuffix);
        }
        // Check for existence of same field - ROO-1691
        while (true) {
            if (!hasFieldInItd(fieldName)) {
                break;
            }
            fieldName = new JavaSymbolName(fieldName.getSymbolName() + "_");
        }
        final FieldMetadataBuilder fieldBuilder = getOneToManyMappedByField(fieldName, mappedByFieldName, foreignTableName, foreignSchemaName, exportedKey.getOnUpdate(), exportedKey.getOnDelete());
        addToBuilder(fieldBuilder);
        // Exclude these fields in @RooToString to avoid circular references
        // - ROO-1399
        excludeFieldsInToStringAnnotation(fieldBuilder.getFieldName().getSymbolName());
    }
}
Also used : JavaSymbolName(org.springframework.roo.model.JavaSymbolName) Table(org.springframework.roo.addon.dbre.addon.model.Table) Reference(org.springframework.roo.addon.dbre.addon.model.Reference) ForeignKey(org.springframework.roo.addon.dbre.addon.model.ForeignKey) FieldMetadataBuilder(org.springframework.roo.classpath.details.FieldMetadataBuilder)

Example 3 with Table

use of org.springframework.roo.addon.dbre.addon.model.Table in project spring-roo by spring-projects.

the class DbreMetadata method addManyToOneFields.

private void addManyToOneFields(final Table table) {
    // Add unique many-to-one fields
    final Map<JavaSymbolName, FieldMetadataBuilder> uniqueFields = new LinkedHashMap<JavaSymbolName, FieldMetadataBuilder>();
    for (final ForeignKey foreignKey : table.getImportedKeys()) {
        final Table foreignTable = foreignKey.getForeignTable();
        if (foreignTable == null || isOneToOne(table, foreignKey)) {
            continue;
        }
        // Assume many-to-one multiplicity
        JavaSymbolName fieldName = null;
        final String foreignTableName = foreignTable.getName();
        final String foreignSchemaName = foreignTable.getSchema().getName();
        if (foreignKey.getReferenceCount() == 1) {
            final Reference reference = foreignKey.getReferences().iterator().next();
            fieldName = new JavaSymbolName(DbreTypeUtils.suggestFieldName(reference.getLocalColumnName()));
        } else {
            final Short keySequence = foreignKey.getKeySequence();
            final String fieldSuffix = keySequence != null && keySequence > 0 ? String.valueOf(keySequence) : "";
            fieldName = new JavaSymbolName(DbreTypeUtils.suggestFieldName(foreignTableName) + fieldSuffix);
        }
        final JavaType fieldType = DbreTypeUtils.findTypeForTableName(managedEntities, foreignTableName, foreignSchemaName);
        Validate.notNull(fieldType, "Attempted to create many-to-one field '%s' in '%s' %s", fieldName, destination.getFullyQualifiedTypeName(), getErrorMsg(foreignTable.getFullyQualifiedTableName(), table.getFullyQualifiedTableName()));
        // Fields are stored in a field-keyed map first before adding them
        // to the builder.
        // This ensures the fields from foreign keys with multiple columns
        // will only get created once.
        final FieldMetadataBuilder fieldBuilder = getOneToOneOrManyToOneField(fieldName, fieldType, foreignKey, MANY_TO_ONE, true);
        uniqueFields.put(fieldName, fieldBuilder);
    }
    for (final FieldMetadataBuilder fieldBuilder : uniqueFields.values()) {
        addToBuilder(fieldBuilder);
        // Exclude these fields in @RooToString to avoid circular references
        // - ROO-1399
        excludeFieldsInToStringAnnotation(fieldBuilder.getFieldName().getSymbolName());
    }
}
Also used : JavaSymbolName(org.springframework.roo.model.JavaSymbolName) JdkJavaType(org.springframework.roo.model.JdkJavaType) JavaType(org.springframework.roo.model.JavaType) Table(org.springframework.roo.addon.dbre.addon.model.Table) Reference(org.springframework.roo.addon.dbre.addon.model.Reference) ForeignKey(org.springframework.roo.addon.dbre.addon.model.ForeignKey) FieldMetadataBuilder(org.springframework.roo.classpath.details.FieldMetadataBuilder) LinkedHashMap(java.util.LinkedHashMap)

Example 4 with Table

use of org.springframework.roo.addon.dbre.addon.model.Table in project spring-roo by spring-projects.

the class DbreDatabaseListenerImpl method reverseEngineer.

private void reverseEngineer(final Database database) {
    final Set<ClassOrInterfaceTypeDetails> managedEntities = getTypeLocationService().findClassesOrInterfaceDetailsWithAnnotation(ROO_DB_MANAGED);
    // Lookup the relevant destination package if not explicitly given
    final JavaPackage destinationPackage = getDestinationPackage(database, managedEntities);
    // Set the destination package in the database
    database.setDestinationPackage(destinationPackage);
    // Get tables from database
    final Set<Table> tables = new LinkedHashSet<Table>(database.getTables());
    // Manage existing entities with @RooDbManaged annotation
    for (final ClassOrInterfaceTypeDetails managedEntity : managedEntities) {
        // Remove table from set as each managed entity is processed.
        // The tables that remain in the set will be used for creation of
        // new entities later
        final Table table = updateOrDeleteManagedEntity(managedEntity, database);
        if (table != null) {
            tables.remove(table);
        }
    }
    // Create new entities from tables
    final List<ClassOrInterfaceTypeDetails> newEntities = new ArrayList<ClassOrInterfaceTypeDetails>();
    for (final Table table : tables) {
        // Don't create types from join tables in many-to-many associations
        if (!table.isJoinTable()) {
            JavaPackage schemaPackage = destinationPackage;
            if (database.hasMultipleSchemas()) {
                schemaPackage = new JavaPackage(destinationPackage.getFullyQualifiedPackageName() + "." + DbreTypeUtils.suggestPackageName(table.getSchema().getName()));
            }
            final JavaType javaType = DbreTypeUtils.suggestTypeNameForNewTable(table.getName(), schemaPackage);
            if (getTypeLocationService().getTypeDetails(javaType) == null) {
                table.setIncludeNonPortableAttributes(database.isIncludeNonPortableAttributes());
                table.setDisableVersionFields(database.isDisableVersionFields());
                table.setDisableGeneratedIdentifiers(database.isDisableGeneratedIdentifiers());
                newEntities.add(createNewManagedEntityFromTable(javaType, table));
            }
        }
    }
    // Create repositories if required
    if (database.isRepository()) {
        for (final ClassOrInterfaceTypeDetails entity : newEntities) {
            final JavaType type = entity.getType();
            getRepositoryJpaOperations().addRepository(new JavaType(type.getFullyQualifiedTypeName() + "Repository"), type, null);
        }
    }
    // Create services if required
    if (database.isService()) {
        for (final ClassOrInterfaceTypeDetails entity : newEntities) {
            final JavaType type = entity.getType();
            final String typeName = type.getFullyQualifiedTypeName();
            getServiceOperations().addService(type, new JavaType(typeName + "Service"), null);
        }
    }
    // Create integration tests if required
    if (database.isTestAutomatically()) {
        for (final ClassOrInterfaceTypeDetails entity : newEntities) {
            getIntegrationTestOperations().newIntegrationTest(entity.getType());
        }
    }
    // Notify
    final List<ClassOrInterfaceTypeDetails> allEntities = new ArrayList<ClassOrInterfaceTypeDetails>();
    allEntities.addAll(newEntities);
    allEntities.addAll(managedEntities);
    notify(allEntities);
}
Also used : LinkedHashSet(java.util.LinkedHashSet) JdkJavaType(org.springframework.roo.model.JdkJavaType) JavaType(org.springframework.roo.model.JavaType) Table(org.springframework.roo.addon.dbre.addon.model.Table) ArrayList(java.util.ArrayList) ClassOrInterfaceTypeDetails(org.springframework.roo.classpath.details.ClassOrInterfaceTypeDetails) JavaPackage(org.springframework.roo.model.JavaPackage)

Example 5 with Table

use of org.springframework.roo.addon.dbre.addon.model.Table in project spring-roo by spring-projects.

the class DbreMetadata method addOneToOneFields.

private void addOneToOneFields(final Table table) {
    // Add unique one-to-one fields
    final Map<JavaSymbolName, FieldMetadataBuilder> uniqueFields = new LinkedHashMap<JavaSymbolName, FieldMetadataBuilder>();
    for (final ForeignKey foreignKey : table.getImportedKeys()) {
        if (!isOneToOne(table, foreignKey)) {
            continue;
        }
        final Table importedKeyForeignTable = foreignKey.getForeignTable();
        Validate.notNull(importedKeyForeignTable, "Foreign key table for foreign key '%s' in table '%s' does not exist. One-to-one relationship not created", foreignKey.getName(), table.getFullyQualifiedTableName());
        final String foreignTableName = importedKeyForeignTable.getName();
        final String foreignSchemaName = importedKeyForeignTable.getSchema().getName();
        final Short keySequence = foreignKey.getKeySequence();
        final String fieldSuffix = keySequence != null && keySequence > 0 ? String.valueOf(keySequence) : "";
        final JavaSymbolName fieldName = new JavaSymbolName(DbreTypeUtils.suggestFieldName(foreignTableName) + fieldSuffix);
        final JavaType fieldType = DbreTypeUtils.findTypeForTableName(managedEntities, foreignTableName, foreignSchemaName);
        Validate.notNull(fieldType, "Attempted to create one-to-one field '%s' in '%s' %s", fieldName, destination.getFullyQualifiedTypeName(), getErrorMsg(importedKeyForeignTable.getFullyQualifiedTableName(), table.getFullyQualifiedTableName()));
        // Fields are stored in a field-keyed map first before adding them
        // to the builder.
        // This ensures the fields from foreign keys with multiple columns
        // will only get created once.
        final FieldMetadataBuilder fieldBuilder = getOneToOneOrManyToOneField(fieldName, fieldType, foreignKey, ONE_TO_ONE, false);
        uniqueFields.put(fieldName, fieldBuilder);
    }
    for (final FieldMetadataBuilder fieldBuilder : uniqueFields.values()) {
        addToBuilder(fieldBuilder);
        // Exclude these fields in @RooToString to avoid circular references
        // - ROO-1399
        excludeFieldsInToStringAnnotation(fieldBuilder.getFieldName().getSymbolName());
    }
    // Add one-to-one mapped-by fields
    if (table.isJoinTable()) {
        return;
    }
    for (final ForeignKey exportedKey : table.getExportedKeys()) {
        final Table exportedKeyForeignTable = exportedKey.getForeignTable();
        Validate.notNull(exportedKeyForeignTable, "Foreign key table for foreign key '%s' in table '%s' does not exist. One-to-one relationship not created", exportedKey.getName(), table.getFullyQualifiedTableName());
        if (exportedKeyForeignTable.isJoinTable()) {
            continue;
        }
        final String foreignTableName = exportedKeyForeignTable.getName();
        final String foreignSchemaName = exportedKeyForeignTable.getSchema().getName();
        final Table foreignTable = database.getTable(foreignTableName, foreignSchemaName);
        Validate.notNull(foreignTable, "Related table '%s' could not be found but has a foreign-key reference to table '%s'", exportedKeyForeignTable.getFullyQualifiedTableName(), table.getFullyQualifiedTableName());
        if (!isOneToOne(foreignTable, foreignTable.getImportedKey(exportedKey.getName()))) {
            continue;
        }
        final Short keySequence = exportedKey.getKeySequence();
        final String fieldSuffix = keySequence != null && keySequence > 0 ? String.valueOf(keySequence) : "";
        JavaSymbolName fieldName = new JavaSymbolName(DbreTypeUtils.suggestFieldName(foreignTableName) + fieldSuffix);
        final JavaType fieldType = DbreTypeUtils.findTypeForTableName(managedEntities, foreignTableName, foreignSchemaName);
        Validate.notNull(fieldType, "Attempted to create one-to-one mapped-by field '%s' in '%s' %s", fieldName, destination.getFullyQualifiedTypeName(), getErrorMsg(foreignTable.getFullyQualifiedTableName()));
        // Check for existence of same field - ROO-1691
        while (true) {
            if (!hasFieldInItd(fieldName)) {
                break;
            }
            fieldName = new JavaSymbolName(fieldName.getSymbolName() + "_");
        }
        final JavaSymbolName mappedByFieldName = new JavaSymbolName(DbreTypeUtils.suggestFieldName(table.getName()) + fieldSuffix);
        final FieldMetadataBuilder fieldBuilder = getOneToOneMappedByField(fieldName, fieldType, mappedByFieldName, exportedKey.getOnUpdate(), exportedKey.getOnDelete());
        addToBuilder(fieldBuilder);
        // Exclude these fields in @RooToString to avoid circular references
        // - ROO-1399
        excludeFieldsInToStringAnnotation(fieldBuilder.getFieldName().getSymbolName());
    }
}
Also used : JavaSymbolName(org.springframework.roo.model.JavaSymbolName) JdkJavaType(org.springframework.roo.model.JdkJavaType) JavaType(org.springframework.roo.model.JavaType) Table(org.springframework.roo.addon.dbre.addon.model.Table) ForeignKey(org.springframework.roo.addon.dbre.addon.model.ForeignKey) FieldMetadataBuilder(org.springframework.roo.classpath.details.FieldMetadataBuilder) LinkedHashMap(java.util.LinkedHashMap)

Aggregations

Table (org.springframework.roo.addon.dbre.addon.model.Table)6 JavaSymbolName (org.springframework.roo.model.JavaSymbolName)5 ForeignKey (org.springframework.roo.addon.dbre.addon.model.ForeignKey)4 FieldMetadataBuilder (org.springframework.roo.classpath.details.FieldMetadataBuilder)4 LinkedHashMap (java.util.LinkedHashMap)3 JavaType (org.springframework.roo.model.JavaType)3 JdkJavaType (org.springframework.roo.model.JdkJavaType)3 LinkedHashSet (java.util.LinkedHashSet)2 Reference (org.springframework.roo.addon.dbre.addon.model.Reference)2 ArrayList (java.util.ArrayList)1 ClassOrInterfaceTypeDetails (org.springframework.roo.classpath.details.ClassOrInterfaceTypeDetails)1 ClassOrInterfaceTypeDetailsBuilder (org.springframework.roo.classpath.details.ClassOrInterfaceTypeDetailsBuilder)1 AnnotationMetadata (org.springframework.roo.classpath.details.annotations.AnnotationMetadata)1 AnnotationMetadataBuilder (org.springframework.roo.classpath.details.annotations.AnnotationMetadataBuilder)1 JavaPackage (org.springframework.roo.model.JavaPackage)1