private void processPolymorphic(BelongsToPolymorphic belongsToPolymorphic, Class<? extends Model> modelClass ) { Class<? extends Model>[] parentClasses = belongsToPolymorphic.parents(); String[] typeLabels = belongsToPolymorphic.typeLabels(); if (typeLabels.length > 0 && typeLabels.length != parentClasses.length) { throw new InitException("must provide all type labels for polymorphic associations"); } for (int i = 0, parentClassesLength = parentClasses.length; i < parentClassesLength; i++) { Class<? extends Model> parentClass = parentClasses[i]; String typeLabel = typeLabels.length > 0 ? typeLabels[i] : parentClass.getName(); BelongsToPolymorphicAssociation belongsToPolymorphicAssociation = new BelongsToPolymorphicAssociation(modelClass, parentClass, typeLabel, parentClass.getName()); metaModels.getMetaModel(modelClass).addAssociation(belongsToPolymorphicAssociation); OneToManyPolymorphicAssociation oneToManyPolymorphicAssociation = new OneToManyPolymorphicAssociation(parentClass, modelClass, typeLabel); metaModels.getMetaModel(parentClass).addAssociation(oneToManyPolymorphicAssociation); } }
metaModel.addAssociation( (Association) lookup.findConstructor( Class.forName((String) map.get(Association.CLASS)),
private void processOverridesHasMany(Class<? extends Model> modelClass, HasMany hasManyAnnotation) { if(hasManyAnnotation != null){ Class<? extends Model> childClass = hasManyAnnotation.child(); String foreignKeyName = hasManyAnnotation.foreignKeyName(); if (metaModels.getMetaModel(childClass).hasAssociation(modelClass, OneToManyAssociation.class)) { LogFilter.log(LOGGER, LogLevel.WARNING, "Redundant annotations used: @BelongsTo and @HasMany on a " + "relationship between Model {} and Model {}.", modelClass.getName(), childClass.getName()); return; } Association hasMany = new OneToManyAssociation(modelClass, childClass, foreignKeyName); Association belongsTo = new BelongsToAssociation(childClass, modelClass, foreignKeyName); metaModels.getMetaModel(modelClass).addAssociation(hasMany); metaModels.getMetaModel(childClass).addAssociation(belongsTo); } }
private void processOverridesBelongsTo(Class<? extends Model> modelClass, BelongsTo belongsToAnnotation) { if(belongsToAnnotation != null){ Class<? extends Model> parentClass = belongsToAnnotation.parent(); String foreignKeyName = belongsToAnnotation.foreignKeyName(); if (metaModels.getMetaModel(parentClass).hasAssociation(modelClass, OneToManyAssociation.class)) { LogFilter.log(LOGGER, LogLevel.WARNING, "Redundant annotations used: @BelongsTo and @HasMany on a " + "relationship between Model {} and Model {}.", modelClass.getName(), parentClass.getName()); return; } Association hasMany = new OneToManyAssociation(parentClass, modelClass, foreignKeyName); Association belongsTo = new BelongsToAssociation(modelClass, parentClass, foreignKeyName); metaModels.getMetaModel(parentClass).addAssociation(hasMany); metaModels.getMetaModel(modelClass).addAssociation(belongsTo); } }
private void processManyToManyOverrides(Many2Many many2manyAnnotation, Class<? extends Model> modelClass){ Class<? extends Model> otherClass = many2manyAnnotation.other(); String source = metaModels.getTableName(modelClass); String target = metaModels.getTableName(otherClass); String join = many2manyAnnotation.join(); String sourceFKName = many2manyAnnotation.sourceFKName(); String targetFKName = many2manyAnnotation.targetFKName(); String otherPk; String thisPk; try { Method m = modelClass.getMethod("getMetaModel"); MetaModel mm = (MetaModel) m.invoke(modelClass); thisPk = mm.getIdName(); m = otherClass.getMethod("getMetaModel"); mm = (MetaModel) m.invoke(otherClass); otherPk = mm.getIdName(); } catch (Exception e) { throw new InitException("failed to determine PK name in many to many relationship", e); } Association many2many1 = new Many2ManyAssociation(modelClass, otherClass, join, sourceFKName, targetFKName, otherPk); metaModels.getMetaModel(source).addAssociation(many2many1); Association many2many2 = new Many2ManyAssociation(otherClass, modelClass, join, targetFKName, sourceFKName, thisPk); metaModels.getMetaModel(target).addAssociation(many2many2); }
/** * Discover many to many associations. * * @param source name of table for which associations are searched. */ private void discoverOne2ManyAssociationsFor(String source, String dbName) { MetaModel sourceMM = getMetaModel(source); for (String target : metaModels.getTableNames(dbName)) { MetaModel targetMM = getMetaModel(target); String sourceFKName = getMetaModel(source).getFKName(); if (targetMM != sourceMM && targetMM.hasAttribute(sourceFKName)) { Class<? extends Model> sourceModelClass = metaModels.getModelClass(source); Class<? extends Model> targetModelClass = metaModels.getModelClass(target); targetMM.addAssociation(new BelongsToAssociation(targetModelClass, sourceModelClass, sourceFKName)); sourceMM.addAssociation(new OneToManyAssociation(sourceModelClass, targetModelClass, sourceFKName)); } } }
private void discoverMany2ManyAssociationsFor(String source, String dbName) { for (String potentialJoinTable : metaModels.getTableNames(dbName)) { String target = Inflector.getOtherName(source, potentialJoinTable); if (target != null && getMetaModel(target) != null && hasForeignKeys(potentialJoinTable, source, target)) { Class<? extends Model> sourceModelClass = metaModels.getModelClass(source); Class<? extends Model> targetModelClass = metaModels.getModelClass(target); Association associationSource = new Many2ManyAssociation(sourceModelClass, targetModelClass, potentialJoinTable, getMetaModel(source).getFKName(), getMetaModel(target).getFKName()); getMetaModel(source).addAssociation(associationSource); } } }
private void processPolymorphic(BelongsToPolymorphic belongsToPolymorphic, Class<? extends Model> modelClass ) { Class<? extends Model>[] parentClasses = belongsToPolymorphic.parents(); String[] typeLabels = belongsToPolymorphic.typeLabels(); if (typeLabels.length > 0 && typeLabels.length != parentClasses.length) { throw new InitException("must provide all type labels for polymorphic associations"); } for (int i = 0, parentClassesLength = parentClasses.length; i < parentClassesLength; i++) { Class<? extends Model> parentClass = parentClasses[i]; String typeLabel = typeLabels.length > 0 ? typeLabels[i] : parentClass.getName(); BelongsToPolymorphicAssociation belongsToPolymorphicAssociation = new BelongsToPolymorphicAssociation(modelClass, parentClass, typeLabel, parentClass.getName()); metaModels.getMetaModel(modelClass).addAssociation(belongsToPolymorphicAssociation); OneToManyPolymorphicAssociation oneToManyPolymorphicAssociation = new OneToManyPolymorphicAssociation(parentClass, modelClass, typeLabel); metaModels.getMetaModel(parentClass).addAssociation(oneToManyPolymorphicAssociation); } }
private void processOverridesHasMany(Class<? extends Model> modelClass, HasMany hasManyAnnotation) { if(hasManyAnnotation != null){ Class<? extends Model> childClass = hasManyAnnotation.child(); String foreignKeyName = hasManyAnnotation.foreignKeyName(); if (metaModels.getMetaModel(childClass).hasAssociation(modelClass, OneToManyAssociation.class)) { LogFilter.log(LOGGER, LogLevel.WARNING, "Redundant annotations used: @BelongsTo and @HasMany on a " + "relationship between Model {} and Model {}.", modelClass.getName(), childClass.getName()); return; } Association hasMany = new OneToManyAssociation(modelClass, childClass, foreignKeyName); Association belongsTo = new BelongsToAssociation(childClass, modelClass, foreignKeyName); metaModels.getMetaModel(modelClass).addAssociation(hasMany); metaModels.getMetaModel(childClass).addAssociation(belongsTo); } }
private void processOverridesBelongsTo(Class<? extends Model> modelClass, BelongsTo belongsToAnnotation) { if(belongsToAnnotation != null){ Class<? extends Model> parentClass = belongsToAnnotation.parent(); String foreignKeyName = belongsToAnnotation.foreignKeyName(); if (metaModels.getMetaModel(parentClass).hasAssociation(modelClass, OneToManyAssociation.class)) { LogFilter.log(LOGGER, LogLevel.WARNING, "Redundant annotations used: @BelongsTo and @HasMany on a " + "relationship between Model {} and Model {}.", modelClass.getName(), parentClass.getName()); return; } Association hasMany = new OneToManyAssociation(parentClass, modelClass, foreignKeyName); Association belongsTo = new BelongsToAssociation(modelClass, parentClass, foreignKeyName); metaModels.getMetaModel(parentClass).addAssociation(hasMany); metaModels.getMetaModel(modelClass).addAssociation(belongsTo); } }
/** * Discover many to many associations. * * @param source name of table for which associations are searched. */ private void discoverOne2ManyAssociationsFor(String source, String dbName) { MetaModel sourceMM = getMetaModel(source); for (String target : metaModels.getTableNames(dbName)) { MetaModel targetMM = getMetaModel(target); String sourceFKName = getMetaModel(source).getFKName(); if (targetMM != sourceMM && targetMM.hasAttribute(sourceFKName)) { targetMM.addAssociation(new BelongsToAssociation(target, source, sourceFKName)); sourceMM.addAssociation(new OneToManyAssociation(source, target, sourceFKName)); } } }
private void processOverridesBelongsTo(Class<? extends Model> modelClass, BelongsTo belongsToAnnotation) { if(belongsToAnnotation != null){ Class<? extends Model> parentClass = belongsToAnnotation.parent(); String foreignKeyName = belongsToAnnotation.foreignKeyName(); Association hasMany = new OneToManyAssociation(getTableName(parentClass), getTableName(modelClass), foreignKeyName); Association belongsTo = new BelongsToAssociation(getTableName(modelClass), getTableName(parentClass), foreignKeyName); metaModels.getMetaModel(parentClass).addAssociation(hasMany); metaModels.getMetaModel(modelClass).addAssociation(belongsTo); } }
private void processManyToManyOverrides(Many2Many many2manyAnnotation, Class<? extends Model> modelClass){ Class<? extends Model> otherClass = many2manyAnnotation.other(); String source = getTableName(modelClass); String target = getTableName(otherClass); String join = many2manyAnnotation.join(); String sourceFKName = many2manyAnnotation.sourceFKName(); String targetFKName = many2manyAnnotation.targetFKName(); String otherPk; String thisPk; try { Method m = modelClass.getMethod("getMetaModel"); MetaModel mm = (MetaModel) m.invoke(modelClass); thisPk = mm.getIdName(); m = otherClass.getMethod("getMetaModel"); mm = (MetaModel) m.invoke(otherClass); otherPk = mm.getIdName(); } catch (Exception e) { throw new InitException("failed to determine PK name in many to many relationship", e); } Association many2many1 = new Many2ManyAssociation(modelClass, otherClass, join, sourceFKName, targetFKName, otherPk); metaModels.getMetaModel(source).addAssociation(many2many1); Association many2many2 = new Many2ManyAssociation(otherClass, modelClass, join, targetFKName, sourceFKName, thisPk); metaModels.getMetaModel(target).addAssociation(many2many2); }
/** * Discover many to many associations. * * @param source name of table for which associations are searched. */ private void discoverOne2ManyAssociationsFor(String source, String dbName) { MetaModel sourceMM = getMetaModel(source); for (String target : metaModels.getTableNames(dbName)) { MetaModel targetMM = getMetaModel(target); String sourceFKName = getMetaModel(source).getFKName(); if (targetMM != sourceMM && targetMM.hasAttribute(sourceFKName)) { Class<? extends Model> sourceModelClass = metaModels.getModelClass(source); Class<? extends Model> targetModelClass = metaModels.getModelClass(target); targetMM.addAssociation(new BelongsToAssociation(targetModelClass, sourceModelClass, sourceFKName)); sourceMM.addAssociation(new OneToManyAssociation(sourceModelClass, targetModelClass, sourceFKName)); } } }
metaModels.getMetaModel(source).addAssociation(many2many1); metaModels.getMetaModel(target).addAssociation(many2many2); metaModels.getMetaModel(modelClass).addAssociation(belongsToPolymorphicAssociation); metaModels.getMetaModel(parentClass).addAssociation(oneToManyPolymorphicAssociation);
private void discoverMany2ManyAssociationsFor(String source, String dbName) { for (String join : metaModels.getTableNames(dbName)) { String other = Inflector.getOtherName(source, join); if (other == null || getMetaModel(other) == null || !hasForeignKeys(join, source, other)) continue; Association associationSource = new Many2ManyAssociation(source, other, join, getMetaModel(source).getFKName(), getMetaModel(other).getFKName()); getMetaModel(source).addAssociation(associationSource); } }
private void discoverMany2ManyAssociationsFor(String source, String dbName) { for (String potentialJoinTable : metaModels.getTableNames(dbName)) { String target = Inflector.getOtherName(source, potentialJoinTable); if (target != null && getMetaModel(target) != null && hasForeignKeys(potentialJoinTable, source, target)) { Class<? extends Model> sourceModelClass = metaModels.getModelClass(source); Class<? extends Model> targetModelClass = metaModels.getModelClass(target); Association associationSource = new Many2ManyAssociation(sourceModelClass, targetModelClass, potentialJoinTable, getMetaModel(source).getFKName(), getMetaModel(target).getFKName()); getMetaModel(source).addAssociation(associationSource); } } }