Erzeuge die Vererbungen für alle Contenttypen beim Upgrade.

git-svn-id: https://svn.libreccm.org/ccm/trunk@714 8810af33-2d31-482b-a856-94f89814c4df
master
quasi 2011-01-26 15:21:22 +00:00
parent b5bc15d2d1
commit 0f7948f18a
1 changed files with 85 additions and 0 deletions

View File

@ -98,10 +98,95 @@ public class CreateGenericContentTypes extends Program {
tc.commitTxn(); // save database additions for re-reading tc.commitTxn(); // save database additions for re-reading
tc.beginTxn();
ContentTypeCollection ctc = ContentType.getAllContentTypes();
s_log.debug("Starte content types update");
while (ctc.next()) {
ContentType ct = ctc.getContentType();
s_log.debug("Verarbeite " + ct.getClassName());
createPedigree(ct);
}
tc.commitTxn();
} }
}.run(); }.run();
} }
/**
* Generates the pedigree for this content type
* @param type The new content type
*/
private void createPedigree(ContentType type) {
// The parent content type
ContentType parent = null;
// Get all content types
ContentTypeCollection cts = ContentType.getAllContentTypes();
// This is a brute force method, but I can't come up with something
// better atm without changing either all Loader or the xml-files.
while (cts.next()) {
ContentType ct = cts.getContentType();
try {
Class.forName(type.getClassName()).asSubclass(Class.forName(ct.getClassName()));
} catch (Exception ex) {
// This cast is not valid so type is not a sublacss of ct
continue;
}
// Save the current ct as possible parent if we haven't found any parent yet
// or if the current ancestor list is longer than that one from the possible
// parent earlier found
if (!type.getClassName().equals(ct.getClassName())
&& (parent == null
|| (parent.getAncestors() != null
&& ct.getAncestors() != null
&& parent.getAncestors().length() < ct.getAncestors().length()))) {
parent = ct;
}
}
// If there is a valid parent content type create the pedigree
if (parent != null && !parent.getClassName().equals(type.getClassName())) {
if (parent.getAncestors() != null) {
String parentAncestors = parent.getAncestors();
StringTokenizer strTok = new StringTokenizer(parentAncestors, "/");
// Add parent ancestors to this content types ancestor list
// Also while we iterate through the list, we also need to add
// this content type as descendant to all entries in the ancestor list
while (strTok.hasMoreElements()) {
BigDecimal ctID = new BigDecimal(strTok.nextToken());
// Get the current content type
try {
ContentType ct = new ContentType(ctID);
ct.addDescendants(ctID);
} catch (Exception ex) {
// The db is broken. There is no content type for this ID
}
// Add parent ancestor
type.addAncestor(ctID);
}
}
// Add parent to ancestor list
type.addAncestor(parent.getID());
// Add this to parent descendants
parent.addDescendants(type.getID());
}
}
} }