in cayenne/src/main/java/org/apache/cayenne/map/DbEntity.java [345:457]
private void handleAttributeUpdate(AttributeEvent e) {
if (e == null || e.getEntity() != this) {
// not our concern
return;
}
// catch clearing (event with null ('any') DbAttribute)
Attribute<?,?,?> attribute = e.getAttribute();
if (attribute == null && this.attributes.isEmpty()) {
this.primaryKey.clear();
this.generatedAttributes.clear();
return;
}
// make sure we handle a DbAttribute
if (!(attribute instanceof DbAttribute)) {
return;
}
DbAttribute dbAttribute = (DbAttribute) attribute;
// handle attribute name changes
if (e.getId() == AttributeEvent.CHANGE && e.isNameChange()) {
String oldName = e.getOldName();
String newName = e.getNewName();
DataMap map = getDataMap();
if (map != null) {
for (DbEntity ent : map.getDbEntities()) {
// handle all of the dependent object entity attribute changes
for (ObjEntity oe : map.getMappedEntities(ent)) {
for (ObjAttribute attr : oe.getAttributes()) {
if (attr.getDbAttribute() == dbAttribute) {
attr.setDbAttributePath(newName);
}
}
}
// handle all of the relationships / joins that use the
// changed attribute
for (DbRelationship rel : ent.getRelationships()) {
for (DbJoin join : rel.getJoins()) {
if (join.getSource() == dbAttribute) {
join.setSourceName(newName);
}
if (join.getTarget() == dbAttribute) {
join.setTargetName(newName);
}
}
}
}
}
// clear the attribute out of the collection
attributes.remove(oldName);
// add the attribute back in with the new name
super.addAttribute(dbAttribute);
}
// handle PK refresh
if (primaryKey.contains(dbAttribute) || dbAttribute.isPrimaryKey()) {
switch (e.getId()) {
case MapEvent.ADD:
this.primaryKey.add(dbAttribute);
break;
case MapEvent.REMOVE:
this.primaryKey.remove(dbAttribute);
break;
default:
// generic update
this.primaryKey.clear();
for (DbAttribute next : getAttributes()) {
if (next.isPrimaryKey()) {
this.primaryKey.add(next);
}
}
}
// check toDep PK for reverse relationships
for (DbRelationship rel : getRelationships()) {
DbRelationship reverse = rel.getReverseRelationship();
if(reverse != null && reverse.isToDependentPK() && !reverse.isValidForDepPk()) {
reverse.setToDependentPK(false);
}
}
}
// handle generated key refresh
if (generatedAttributes.contains(dbAttribute) || dbAttribute.isGenerated()) {
switch (e.getId()) {
case MapEvent.ADD:
this.generatedAttributes.add(dbAttribute);
break;
case MapEvent.REMOVE:
this.generatedAttributes.remove(dbAttribute);
break;
default:
// generic update
this.generatedAttributes.clear();
for (DbAttribute next : getAttributes()) {
if (next.isGenerated()) {
this.generatedAttributes.add(next);
}
}
}
}
}