diff --git a/ccm-cms-publicpersonalprofile/src/ccm-cms-publicpersonalprofile.upgrade b/ccm-cms-publicpersonalprofile/src/ccm-cms-publicpersonalprofile.upgrade
index 0c076ea5d..fd4503b19 100644
--- a/ccm-cms-publicpersonalprofile/src/ccm-cms-publicpersonalprofile.upgrade
+++ b/ccm-cms-publicpersonalprofile/src/ccm-cms-publicpersonalprofile.upgrade
@@ -3,6 +3,7 @@
-
+
+
\ No newline at end of file
diff --git a/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/contenttypes/PublicPersonalProfileOwnerAssocUpgrade.java b/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/contenttypes/PublicPersonalProfileOwnerAssocUpgrade.java
deleted file mode 100644
index e01d90614..000000000
--- a/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/contenttypes/PublicPersonalProfileOwnerAssocUpgrade.java
+++ /dev/null
@@ -1,405 +0,0 @@
-package com.arsdigita.cms.contenttypes;
-
-import com.arsdigita.util.cmd.Program;
-import com.arsdigita.runtime.RuntimeConfig;
-import com.arsdigita.util.jdbc.Connections;
-import java.math.BigDecimal;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.commons.cli.CommandLine;
-
-/**
- * Upgrade for the owner association (6.6.1 to 6.6.2). Warning: Update of
- * ccm-cms from 6.6.4 to 6.6.5 has be executed before this update.
- *
- * @author Jens Pelzetter
- * @version $Id: PublicPersonalProfileOwnerAssocUpgrade.java 1501 2012-02-10
- * 16:49:14Z jensp $
- */
-public class PublicPersonalProfileOwnerAssocUpgrade extends Program {
-
- public PublicPersonalProfileOwnerAssocUpgrade() {
- super("PublicPersonalProfileOwnerAssocUpgrade", "1.0.0", "");
- }
-
- public static void main(final String[] args) {
- new PublicPersonalProfileOwnerAssocUpgrade().run(args);
- }
-
- public void doRun(final CommandLine cmdLine) {
- System.out.println("Starting upgrade...");
-
- List oldData = new ArrayList();
-
- final Connection conn = Connections.acquire(RuntimeConfig.getConfig().
- getJDBCURL());
- try {
- conn.setAutoCommit(false);
- } catch (SQLException ex) {
- System.err.println("Failed to configure JDBC connection.");
- printStackTrace(ex);
- close(conn);
- return;
- }
-
- System.out.println("Retrieving old data...");
-
- try {
- final Statement stmt = conn.createStatement();
- final ResultSet oldAssocResult = stmt.executeQuery(
- "SELECT profile_id, owner_id, owner_order "
- + "FROM ct_public_personal_profile_owner_map "
- + "JOIN cms_items on profile_id = item_id "
- + "WHERE version = 'draft'");
-
- while (oldAssocResult.next()) {
- AssocEntry entry = new AssocEntry();
-
- entry.setProfileDraftId(oldAssocResult.getBigDecimal(1));
- entry.setProfileBundleDraftId(getParentIdFor(
- entry.getProfileDraftId(), conn));
- entry.setOwnerDraftId(oldAssocResult.getBigDecimal(2));
- entry.setOwnerBundleDraftId(getParentIdFor(
- entry.getOwnerDraftId(), conn));
-
- entry.setProfilePublicId(getPublicIdFor(
- entry.getProfileDraftId(), conn));
- entry.setProfileBundlePublicId(getPublicIdFor(
- entry.getProfileBundleDraftId(), conn));
- entry.setOwnerPublicId(getParentIdFor(
- entry.getOwnerDraftId(), conn));
- entry.setOwnerBundlePublicId(getParentIdFor(
- entry.getOwnerBundleDraftId(), conn));
-
- entry.setOwnerOrder(oldAssocResult.getInt(3));
-
- oldData.add(entry);
- }
- } catch (SQLException ex) {
- System.err.println("Failed to retrieve old data.");
- printStackTrace(ex);
- return;
- }
-
- try {
- System.out.println("Droping old table...");
- final Statement stmt = conn.createStatement();
- stmt.execute("DROP TABLE ct_public_personal_profile_owner_map");
- } catch (SQLException ex) {
- System.err.println("Failed to drop old table.");
- printStackTrace(ex);
- rollback(conn);
- close(conn);
- return;
- }
-
- try {
- System.out.println("Creating new tables...");
- final Statement stmt = conn.createStatement();
-
- stmt.addBatch("CREATE TABLE ct_public_personal_profile_bundles ( "
- + "bundle_id integer NOT NULL)");
-
- stmt.addBatch("CREATE TABLE ct_public_personal_profile_owner_map ( "
- + "profile_id integer NOT NULL, "
- + "owner_id integer NOT NULL, "
- + "owner_order integer)");
-
- stmt.addBatch("ALTER TABLE ONLY ct_public_personal_profile_bundles "
- + "ADD CONSTRAINT ct_pub_per_pro_bun_bun_p_zhc9i "
- + "PRIMARY KEY (bundle_id)");
-
- stmt.addBatch("ALTER TABLE ONLY ct_public_personal_profile_bundles "
- + " ADD CONSTRAINT ct_pub_per_pro_bun_bun_f__jr2_ "
- + "FOREIGN KEY (bundle_id) "
- + "REFERENCES cms_bundles(bundle_id)");
-
- stmt.addBatch("ALTER TABLE ONLY ct_public_personal_profile_owner_map "
- + "ADD CONSTRAINT ct_pub_per_pro_own_map_p_rr7ie "
- + "PRIMARY KEY (owner_id, profile_id)");
-
- stmt.addBatch("ALTER TABLE ONLY ct_public_personal_profile_owner_map "
- + "ADD CONSTRAINT ct_pub_per_pro_own_map_f_cd7_1 "
- + "FOREIGN KEY (owner_id) "
- + "REFERENCES cms_person_bundles(bundle_id)");
-
- stmt.addBatch(
- "ALTER TABLE ONLY ct_public_personal_profile_owner_map "
- + "ADD CONSTRAINT ct_pub_per_pro_own_map_f_ugs15 "
- + "FOREIGN KEY (profile_id) "
- + "REFERENCES ct_public_personal_profile_bundles(bundle_id)");
- stmt.executeBatch();
-
- } catch (SQLException ex) {
- System.err.println("Failed to create new table.");
- printStackTrace(ex);
- rollback(conn);
- close(conn);
- return;
- }
-
- try {
- System.out.println("Filling new tables with data...");
- final Statement queryProfilesStmt = conn.createStatement();
- final Statement stmt = conn.createStatement();
-
- final ResultSet profilesRs =
- queryProfilesStmt.executeQuery(
- "SELECT parent_id "
- + "FROM cms_items "
- + "JOIN ct_public_personal_profiles "
- + "ON cms_items.item_id = ct_public_personal_profiles.profile_id");
-
- while (profilesRs.next()) {
- stmt.addBatch(String.format(
- "INSERT INTO ct_public_personal_profile_bundles (bundle_id) "
- + "VALUES (%d)",
- profilesRs.getInt(1)));
- stmt.addBatch(String.format(
- "UPDATE acs_objects "
- + "SET default_domain_class = 'com.arsdigita.cms.contenttypes.PublicPersonalProfileBundle', "
- + "object_type = 'com.arsdigita.cms.contenttypes.PublicPersonalProfileBundle' "
- + "WHERE object_id = %d",
- profilesRs.getInt(1)));
- }
-
- final List processedEntries = new ArrayList();
- for (AssocEntry entry : oldData) {
-
- if (processedEntries.contains(
- String.format("%s-%s",
- entry.getProfileBundleDraftId().toString(),
- entry.getOwnerBundleDraftId().toString()))) {
- continue;
- }
-
- stmt.addBatch(String.format(
- "INSERT INTO ct_public_personal_profile_owner_map ("
- + "profile_id, "
- + "owner_id, "
- + "owner_order) "
- + "VALUES (%s, %s, %d)",
- entry.getProfileBundleDraftId().toString(),
- entry.getOwnerBundleDraftId().toString(),
- entry.getOwnerOrder()));
- if ((entry.getProfileBundlePublicId() != null)
- && (entry.getOwnerBundlePublicId() != null)) {
- stmt.addBatch(String.format(
- "INSERT INTO ct_public_personal_profile_owner_map ("
- + "profile_id, "
- + "owner_id, "
- + "owner_order) "
- + "VALUES (%s, %s, %d)",
- entry.getProfileBundlePublicId().toString(),
- entry.getOwnerBundlePublicId().toString(),
- entry.getOwnerOrder()));
- }
-
- if (entry.getProfileBundlePublicId() != null) {
- stmt.addBatch(String.format(
- "UPDATE cms_published_links "
- + "SET pending = %s, "
- + "pending_source = %s, "
- + "draft_target = %s "
- + "WHERE pending = %s "
- + "AND draft_target = %s",
- entry.getProfileBundlePublicId(),
- entry.getProfileBundlePublicId(),
- entry.getOwnerBundleDraftId(),
- entry.getProfilePublicId(),
- entry.getOwnerDraftId()));
- }
-
- if (entry.getOwnerBundlePublicId() != null) {
- stmt.addBatch(String.format(
- "UPDATE cms_published_links "
- + "SET pending = %s, "
- + "pending_source = %s, "
- + "draft_target = %s "
- + "WHERE pending = %s "
- + "AND draft_target = %s",
- entry.getOwnerBundlePublicId(),
- entry.getOwnerBundlePublicId(),
- entry.getProfileBundleDraftId(),
- entry.getOwnerPublicId(),
- entry.getProfileDraftId()));
- }
-
-
- processedEntries.add(String.format(
- "%s-%s",
- entry.getProfileBundleDraftId().toString(),
- entry.getOwnerBundleDraftId().toString()));
- }
-
- stmt.executeBatch();
-
- } catch (SQLException ex) {
- System.err.println("Failed to fill tables.");
- printStackTrace(ex);
- rollback(conn);
- close(conn);
- return;
- }
-
- try {
- conn.commit();
- } catch (SQLException ex) {
- System.err.println("Failed to commiting changes.");
- printStackTrace(ex);
- rollback(conn);
- return;
- }
-
- close(conn);
- }
-
- private class AssocEntry {
-
- private BigDecimal profileDraftId;
- private BigDecimal ownerDraftId;
- private BigDecimal profilePublicId;
- private BigDecimal ownerPublicId;
- private BigDecimal profileBundleDraftId;
- private BigDecimal ownerBundleDraftId;
- private BigDecimal profileBundlePublicId;
- private BigDecimal ownerBundlePublicId;
- private Integer ownerOrder;
-
- public AssocEntry() {
- }
-
- public BigDecimal getOwnerBundleDraftId() {
- return ownerBundleDraftId;
- }
-
- public void setOwnerBundleDraftId(BigDecimal ownerBundleDraftId) {
- this.ownerBundleDraftId = ownerBundleDraftId;
- }
-
- public BigDecimal getOwnerBundlePublicId() {
- return ownerBundlePublicId;
- }
-
- public void setOwnerBundlePublicId(BigDecimal ownerBundlePublicId) {
- this.ownerBundlePublicId = ownerBundlePublicId;
- }
-
- public BigDecimal getOwnerDraftId() {
- return ownerDraftId;
- }
-
- public void setOwnerDraftId(BigDecimal ownerDraftId) {
- this.ownerDraftId = ownerDraftId;
- }
-
- public Integer getOwnerOrder() {
- return ownerOrder;
- }
-
- public void setOwnerOrder(Integer ownerOrder) {
- this.ownerOrder = ownerOrder;
- }
-
- public BigDecimal getOwnerPublicId() {
- return ownerPublicId;
- }
-
- public void setOwnerPublicId(BigDecimal ownerPublicId) {
- this.ownerPublicId = ownerPublicId;
- }
-
- public BigDecimal getProfileBundleDraftId() {
- return profileBundleDraftId;
- }
-
- public void setProfileBundleDraftId(BigDecimal profileBundleDraftId) {
- this.profileBundleDraftId = profileBundleDraftId;
- }
-
- public BigDecimal getProfileBundlePublicId() {
- return profileBundlePublicId;
- }
-
- public void setProfileBundlePublicId(BigDecimal profileBundlePublicId) {
- this.profileBundlePublicId = profileBundlePublicId;
- }
-
- public BigDecimal getProfileDraftId() {
- return profileDraftId;
- }
-
- public void setProfileDraftId(BigDecimal profileDraftId) {
- this.profileDraftId = profileDraftId;
- }
-
- public BigDecimal getProfilePublicId() {
- return profilePublicId;
- }
-
- public void setProfilePublicId(BigDecimal profilePublicId) {
- this.profilePublicId = profilePublicId;
- }
- }
-
- private void rollback(final Connection conn) {
- try {
- conn.rollback();
- } catch (SQLException ex1) {
- System.err.println("Rollback failed.");
- ex1.printStackTrace(System.err);
- }
- }
-
- private void close(final Connection conn) {
- try {
- conn.close();
- } catch (SQLException ex) {
- System.err.println("Failed to close JDBC connectio.");
- printStackTrace(ex);
- }
- }
-
- private void printStackTrace(final SQLException ex) {
- ex.printStackTrace(System.err);
- if (ex.getNextException() != null) {
- printStackTrace(ex.getNextException());
- }
- }
-
- private BigDecimal getPublicIdFor(final BigDecimal id,
- final Connection conn)
- throws SQLException {
- final Statement stmt = conn.createStatement();
-
- final ResultSet rs = stmt.executeQuery(String.format(
- "SELECT item_id FROM cms_items WHERE master_id = %s",
- id.toString()));
-
- while (rs.next()) {
- return rs.getBigDecimal(1);
- }
-
- return null;
- }
-
- private BigDecimal getParentIdFor(final BigDecimal id,
- final Connection conn)
- throws SQLException {
- final Statement stmt = conn.createStatement();
-
- final ResultSet rs = stmt.executeQuery(String.format(
- "SELECT parent_id FROM cms_items WHERE item_id = %s",
- id.toString()));
-
- while (rs.next()) {
- return rs.getBigDecimal(1);
- }
-
- return null;
- }
-}
diff --git a/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/contenttypes/upgrades/PublicPersonalProfileBundleCreate.java b/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/contenttypes/upgrades/PublicPersonalProfileBundleCreate.java
new file mode 100644
index 000000000..3ffedcec2
--- /dev/null
+++ b/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/contenttypes/upgrades/PublicPersonalProfileBundleCreate.java
@@ -0,0 +1,50 @@
+package com.arsdigita.cms.contenttypes.upgrades;
+
+import com.arsdigita.cms.contenttypes.PublicPersonalProfileBundle;
+
+/**
+ *
+ * @author Jens Pelzetter
+ * @version $Id$
+ */
+public class PublicPersonalProfileBundleCreate extends AbstractBundleUpgrade {
+
+ public PublicPersonalProfileBundleCreate() {
+ super("PublicPersonalProfileBundleCreate", "1.0.0", "");
+ }
+
+ public static void main(final String[] args) {
+ new PublicPersonalProfileBundleCreate().run(args);
+ }
+
+ @Override
+ protected String getBundleTableName() {
+ return "ct_public_personal_profile_bundles";
+ }
+
+ @Override
+ protected String getContentItemTableName() {
+ return "ct_public_personal_profiles";
+ }
+
+ @Override
+ protected String getIdColName() {
+ return "profile_id";
+ }
+
+ @Override
+ protected String getBundleClassName() {
+ return PublicPersonalProfileBundle.class.getName();
+ }
+
+ @Override
+ protected String getPrimaryKeyConstraintName() {
+ return "ct_pub_per_pro_bun_bun_p_zhc9i";
+ }
+
+ @Override
+ protected String getBundleContraintName() {
+ return "ct_pub_per_pro_bun_bun_f__jr2_";
+ }
+
+}
diff --git a/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/contenttypes/upgrades/PublicPersonalProfileOwnerAssocUpgrade.java b/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/contenttypes/upgrades/PublicPersonalProfileOwnerAssocUpgrade.java
new file mode 100644
index 000000000..e7d9c895f
--- /dev/null
+++ b/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/contenttypes/upgrades/PublicPersonalProfileOwnerAssocUpgrade.java
@@ -0,0 +1,70 @@
+package com.arsdigita.cms.contenttypes.upgrades;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ *
+ * @author Jens Pelzetter
+ * @version $Id$
+ */
+public class PublicPersonalProfileOwnerAssocUpgrade extends AbstractAssocUpgrade {
+
+ public PublicPersonalProfileOwnerAssocUpgrade() {
+ super("PublicPersonalProfileOwnerAssocUpgrade", "1.0.0", "");
+ }
+
+ public static void main(final String[] args) {
+ new PublicPersonalProfileOwnerAssocUpgrade().run(args);
+ }
+
+ @Override
+ protected String getTableName() {
+ return "ct_public_personal_profile_owner_map.owner_id";
+ }
+
+ @Override
+ protected String getOwnerIdCol() {
+ return "profile_id";
+ }
+
+ @Override
+ protected String getMemberIdCol() {
+ return "owner_id";
+ }
+
+ @Override
+ protected Map getAttributes() {
+ final Map attributes = new HashMap();
+ attributes.put("owner_order", "integer");
+ return attributes;
+ }
+
+ @Override
+ protected String getPrimaryKeyConstraintName() {
+ return "ct_pub_per_pro_own_map_p_rr7ie";
+ }
+
+ @Override
+ protected String getOwnerConstraintName() {
+ return "ct_pub_per_pro_own_map_f_ugs15";
+ }
+
+ @Override
+ protected String getMemberConstraintName() {
+ return "ct_pub_per_pro_own_map_f_cd7_1";
+ }
+
+ @Override
+ protected String getOwnerTableName() {
+ return "ct_public_personal_profile_bundles";
+ }
+
+ @Override
+ protected String getMemberTableName() {
+ return "cms_person_bundles";
+ }
+
+
+
+}
diff --git a/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/publicpersonalprofile/PublicPersonalProfilesServlet.java b/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/publicpersonalprofile/PublicPersonalProfilesServlet.java
index 79c4e7941..5850eb3ba 100644
--- a/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/publicpersonalprofile/PublicPersonalProfilesServlet.java
+++ b/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/publicpersonalprofile/PublicPersonalProfilesServlet.java
@@ -13,7 +13,6 @@ import com.arsdigita.cms.CMS;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.ContentPage;
import com.arsdigita.cms.ContentSection;
-import com.arsdigita.cms.ReusableImageAsset;
import com.arsdigita.cms.contentassets.ItemImageAttachment;
import com.arsdigita.cms.contentassets.RelatedLink;
import com.arsdigita.cms.contenttypes.GenericAddress;
@@ -58,6 +57,7 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
+import com.arsdigita.cms.ReusableImageAsset;
/**
* Servlet for the PublicPersonalProfile application.
diff --git a/ccm-cms/pdl/com/arsdigita/content-types/GenericOrganizationalUnit.pdl b/ccm-cms/pdl/com/arsdigita/content-types/GenericOrganizationalUnit.pdl
index e472d6554..9149143b2 100644
--- a/ccm-cms/pdl/com/arsdigita/content-types/GenericOrganizationalUnit.pdl
+++ b/ccm-cms/pdl/com/arsdigita/content-types/GenericOrganizationalUnit.pdl
@@ -56,15 +56,15 @@ association {
// Links a organization with persons.
association {
- GenericOrganizationalUnitBundle[0..n] organizationalunits = join cms_bundles.bundle_id
+ GenericOrganizationalUnitBundle[0..n] organizationalunits = join cms_person_bundles.bundle_id
to cms_organizationalunits_person_map.person_id,
join cms_organizationalunits_person_map.organizationalunit_id
- to cms_bundles.bundle_id;
+ to cms_orgaunit_bundles.bundle_id;
- GenericPersonBundle[0..n] persons = join cms_bundles.bundle_id
+ GenericPersonBundle[0..n] persons = join cms_orgaunit_bundles.bundle_id
to cms_organizationalunits_person_map.organizationalunit_id,
join cms_organizationalunits_person_map.person_id
- to cms_bundles.bundle_id;
+ to cms_person_bundles.bundle_id;
// Additional attributes for the association
String[0..1] role_name = cms_organizationalunits_person_map.role_name VARCHAR(100);
diff --git a/ccm-cms/src/ccm-cms.upgrade b/ccm-cms/src/ccm-cms.upgrade
index bffe7e28e..fd456114e 100755
--- a/ccm-cms/src/ccm-cms.upgrade
+++ b/ccm-cms/src/ccm-cms.upgrade
@@ -52,7 +52,9 @@
-
+
+
+
@@ -61,6 +63,6 @@
-
+
diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericContactPersonAssocUpgrade.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericContactPersonAssocUpgrade.java
deleted file mode 100644
index 8287864ff..000000000
--- a/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericContactPersonAssocUpgrade.java
+++ /dev/null
@@ -1,452 +0,0 @@
-package com.arsdigita.cms.contenttypes;
-
-import com.arsdigita.util.cmd.Program;
-import com.arsdigita.runtime.RuntimeConfig;
-import com.arsdigita.util.jdbc.Connections;
-import java.math.BigDecimal;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.commons.cli.CommandLine;
-
-/**
- * Upgrade for association between GenericContact and GenericPerson (6.6.4 to
- * 6.6.5)
- *
- * @author Jens Pelzetter
- * @version $Id: GenericContactPersonAssocUpgrade.java 1501 2012-02-10 16:49:14Z
- * jensp $
- */
-public class GenericContactPersonAssocUpgrade extends Program {
-
- public GenericContactPersonAssocUpgrade() {
- super("GenericContactPersonAssocUpgrade", "1.0.0", "");
- }
-
- public static void main(final String[] args) {
- new GenericContactPersonAssocUpgrade().run(args);
- }
-
- public void doRun(final CommandLine cmdLine) {
- System.out.println("Starting upgrade...");
- List oldData = new ArrayList();
-
- System.out.println("Trying to get JDBC connection...");
-
- final Connection conn = Connections.acquire(RuntimeConfig.getConfig().
- getJDBCURL());
- try {
- conn.setAutoCommit(false);
- } catch (SQLException ex) {
- System.err.println("Failed to configure JDBC connection.");
- printStackTrace(ex);
- close(conn);
- return;
- }
-
- System.out.println("Retrieving old data...");
- try {
- final Statement stmt = conn.createStatement();
- final ResultSet oldAssocResult = stmt.executeQuery(
- "SELECT person_id, contact_id, link_order, link_key "
- + "FROM cms_person_contact_map "
- + "JOIN cms_items on person_id = item_id "
- + "WHERE version = 'draft' ");
-
- while (oldAssocResult.next()) {
- AssocEntry entry = new AssocEntry();
-
- entry.setPersonDraftId(oldAssocResult.getBigDecimal(1));
- entry.setPersonDraftBundleId(getParentIdFor(
- entry.getPersonDraftId(), conn));
- entry.setContactDraftId(oldAssocResult.getBigDecimal(2));
- entry.setContactDraftBundleId(getParentIdFor(
- entry.getContactDraftId(), conn));
-
- entry.setPersonPublicId(getPublicIdFor(
- entry.getPersonDraftId(), conn));
- entry.setPersonPublicBundleId(getPublicIdFor(
- entry.getPersonDraftBundleId(), conn));
- entry.setContactPublicId(getPublicIdFor(
- entry.getContactDraftId(), conn));
- entry.setContactPublicBundleId(getPublicIdFor(
- entry.getContactDraftBundleId(), conn));
-
- entry.setLinkOrder(oldAssocResult.getInt(3));
- entry.setLinkKey(oldAssocResult.getString(4));
-
- oldData.add(entry);
- }
- } catch (SQLException ex) {
- System.err.println("Failed to retrieve old data.");
- printStackTrace(ex);
- return;
- }
-
- try {
- System.out.println("Droping old table...");
- final Statement stmt = conn.createStatement();
- stmt.execute("DROP TABLE cms_person_contact_map");
- } catch (SQLException ex) {
- System.err.println("Failed to drop old table.");
- printStackTrace(ex);
- rollback(conn);
- close(conn);
- return;
- }
-
- try {
- System.out.println("Creating new tables...");
- final Statement stmt = conn.createStatement();
-
- stmt.addBatch("CREATE TABLE cms_person_bundles ( "
- + "bundle_id integer NOT NULL)");
-
- stmt.addBatch("CREATE TABLE cms_contact_bundles ( "
- + "bundle_id integer NOT NULL)");
-
- stmt.addBatch("CREATE TABLE cms_person_contact_map ("
- + "person_id integer NOT NULL,"
- + "contact_id integer NOT NULL,"
- + "link_order integer,"
- + "link_key character varying(100)"
- + ")");
-
- stmt.addBatch("ALTER TABLE ONLY cms_person_bundles "
- + "ADD CONSTRAINT cms_pers_bundl_bund_id_p_7xuzi "
- + "PRIMARY KEY (bundle_id);");
-
- stmt.addBatch("ALTER TABLE ONLY cms_person_bundles "
- + "ADD CONSTRAINT cms_pers_bundl_bund_id_f__rzge "
- + "FOREIGN KEY (bundle_id) "
- + "REFERENCES cms_bundles(bundle_id);");
-
- stmt.addBatch("ALTER TABLE ONLY cms_contact_bundles "
- + "ADD CONSTRAINT cms_cont_bundl_bund_id_p_2p6vp "
- + "PRIMARY KEY (bundle_id);");
-
- stmt.addBatch("ALTER TABLE ONLY cms_contact_bundles "
- + "ADD CONSTRAINT cms_cont_bundl_bund_id_f_m8aga "
- + "FOREIGN KEY (bundle_id) "
- + "REFERENCES cms_bundles(bundle_id);");
-
- stmt.addBatch("ALTER TABLE ONLY cms_person_contact_map "
- + "ADD CONSTRAINT cms_per_con_map_con_id_p_g1cii "
- + "PRIMARY KEY (contact_id, person_id)");
-
- stmt.addBatch("ALTER TABLE ONLY cms_person_contact_map "
- + "ADD CONSTRAINT cms_per_con_map_con_id_f_peoc2 "
- + "FOREIGN KEY (contact_id) "
- + "REFERENCES cms_contact_bundles(bundle_id);");
-
- stmt.addBatch("ALTER TABLE ONLY cms_person_contact_map "
- + "ADD CONSTRAINT cms_per_con_map_per_id_f_g82jn "
- + "FOREIGN KEY (person_id) "
- + "REFERENCES cms_person_bundles(bundle_id);");
- stmt.executeBatch();
-
- } catch (SQLException ex) {
- System.err.println("Failed to create new table.");
- printStackTrace(ex);
- rollback(conn);
- close(conn);
- return;
- }
-
- try {
- System.out.println("Filling new tables with data...");
- final Statement queryPersonsStmt = conn.createStatement();
- final Statement queryContactsStmt = conn.createStatement();
- final Statement stmt = conn.createStatement();
-
- final ResultSet personsRs =
- queryPersonsStmt.executeQuery(
- "SELECT parent_id "
- + "FROM cms_items "
- + "JOIN cms_persons "
- + "ON cms_items.item_id = cms_persons.person_id");
-
- while (personsRs.next()) {
- stmt.addBatch(String.format("INSERT INTO cms_person_bundles (bundle_id) "
- + "VALUES (%d)",
- personsRs.getInt(1)));
- stmt.addBatch(String.format(
- "UPDATE acs_objects "
- + "SET default_domain_class = 'com.arsdigita.cms.contenttypes.GenericPersonBundle',"
- + "object_type = 'com.arsdigita.cms.contenttypes.GenericPersonBundle' "
- + "WHERE object_id = %d",
- personsRs.getInt(1)));
- }
-
- final ResultSet contactsRs = queryContactsStmt.executeQuery(
- "SELECT DISTINCT parent_id "
- + "FROM cms_items "
- + "JOIN cms_contacts "
- + "ON cms_items.item_id = cms_contacts.contact_id");
-
- while (contactsRs.next()) {
- stmt.addBatch(String.format("INSERT INTO cms_contact_bundles (bundle_id) "
- + "VALUES (%s)",
- contactsRs.getInt(1)));
- stmt.addBatch(String.format(
- "UPDATE acs_objects "
- + "SET default_domain_class = 'com.arsdigita.cms.contenttypes.GenericContactBundle', "
- + "object_type = 'com.arsdigita.cms.contenttypes.GenericContactBundle' "
- + "WHERE object_id = %d",
- contactsRs.getInt(1)));
- }
-
- final List processedEntries =
- new ArrayList();
- for (AssocEntry entry : oldData) {
- if (processedEntries.contains(
- String.format("%s-%s",
- entry.getPersonDraftBundleId().toString(),
- entry.getContactDraftBundleId().toString()))) {
- continue;
- }
-
- stmt.addBatch(String.format(
- "INSERT INTO cms_person_contact_map ("
- + "person_id, "
- + "contact_id, "
- + "link_order, "
- + "link_key) "
- + "VALUES (%s, %s, %d, '%s')",
- entry.getPersonDraftBundleId().toString(),
- entry.getContactDraftBundleId().toString(),
- entry.getLinkOrder(),
- entry.getLinkKey()));
-
- if ((entry.getPersonPublicBundleId() != null)
- && (entry.getContactPublicBundleId() != null)) {
- stmt.addBatch(String.format(
- "INSERT INTO cms_person_contact_map ("
- + "person_id, "
- + "contact_id, "
- + "link_order, "
- + "link_key) "
- + "VALUES (%s, %s, %d, '%s')",
- entry.getPersonPublicBundleId().toString(),
- entry.getContactPublicBundleId().toString(),
- entry.getLinkOrder(),
- entry.getLinkKey()));
- }
-
- if (entry.getPersonPublicBundleId() != null) {
- stmt.addBatch(String.format(
- "UPDATE cms_published_links "
- + "SET pending = %s, "
- + "pending_source = %s, "
- + "draft_target = %s "
- + "WHERE pending = %s "
- + "AND draft_target = %s",
- entry.getPersonPublicBundleId().toString(),
- entry.getPersonPublicBundleId().toString(),
- entry.getContactDraftBundleId(),
- entry.getPersonPublicId(),
- entry.getContactDraftId()));
- }
-
- if (entry.getContactPublicBundleId() != null) {
- stmt.addBatch(String.format(
- "UPDATE cms_published_links "
- + "SET pending = %s, "
- + "pending_source = %s, "
- + "draft_target = %s "
- + "WHERE pending = %s "
- + "AND draft_target = %s",
- entry.getContactPublicBundleId().toString(),
- entry.getContactPublicBundleId().toString(),
- entry.getPersonDraftBundleId(),
- entry.getContactPublicId(),
- entry.getPersonDraftId()));
- }
-
- processedEntries.add(String.format(
- "%s-%s",
- entry.getPersonDraftBundleId().
- toString(),
- entry.getContactDraftBundleId().toString()));
- }
-
- stmt.executeBatch();
-
-
- } catch (SQLException ex) {
- System.err.println("Failed to fill tables.");
- printStackTrace(ex);
- rollback(conn);
- close(conn);
- return;
- }
-
- try {
- conn.commit();
- } catch (SQLException ex) {
- System.err.println("Failed to commiting changes.");
- printStackTrace(ex);
- rollback(conn);
- return;
- }
-
- close(conn);
- }
-
- private class AssocEntry {
-
- private BigDecimal personDraftId;
- private BigDecimal contactDraftId;
- private BigDecimal personPublicId;
- private BigDecimal contactPublicId;
- private BigDecimal personDraftBundleId;
- private BigDecimal contactDraftBundleId;
- private BigDecimal personPublicBundleId;
- private BigDecimal contactPublicBundleId;
- private Integer linkOrder;
- private String linkKey;
-
- public AssocEntry() {
- }
-
- public BigDecimal getContactDraftBundleId() {
- return contactDraftBundleId;
- }
-
- public void setContactDraftBundleId(BigDecimal contactDraftBundleId) {
- this.contactDraftBundleId = contactDraftBundleId;
- }
-
- public BigDecimal getContactDraftId() {
- return contactDraftId;
- }
-
- public void setContactDraftId(BigDecimal contactDraftId) {
- this.contactDraftId = contactDraftId;
- }
-
- public BigDecimal getContactPublicBundleId() {
- return contactPublicBundleId;
- }
-
- public void setContactPublicBundleId(BigDecimal contactPublicBundleId) {
- this.contactPublicBundleId = contactPublicBundleId;
- }
-
- public BigDecimal getContactPublicId() {
- return contactPublicId;
- }
-
- public void setContactPublicId(BigDecimal contactPublicId) {
- this.contactPublicId = contactPublicId;
- }
-
- public String getLinkKey() {
- return linkKey;
- }
-
- public void setLinkKey(String linkKey) {
- this.linkKey = linkKey;
- }
-
- public Integer getLinkOrder() {
- return linkOrder;
- }
-
- public void setLinkOrder(Integer linkOrder) {
- this.linkOrder = linkOrder;
- }
-
- public BigDecimal getPersonDraftBundleId() {
- return personDraftBundleId;
- }
-
- public void setPersonDraftBundleId(BigDecimal personDraftBundleId) {
- this.personDraftBundleId = personDraftBundleId;
- }
-
- public BigDecimal getPersonDraftId() {
- return personDraftId;
- }
-
- public void setPersonDraftId(BigDecimal personDraftId) {
- this.personDraftId = personDraftId;
- }
-
- public BigDecimal getPersonPublicBundleId() {
- return personPublicBundleId;
- }
-
- public void setPersonPublicBundleId(BigDecimal personPublicBundleId) {
- this.personPublicBundleId = personPublicBundleId;
- }
-
- public BigDecimal getPersonPublicId() {
- return personPublicId;
- }
-
- public void setPersonPublicId(BigDecimal personPublicId) {
- this.personPublicId = personPublicId;
- }
- }
-
- private BigDecimal getPublicIdFor(final BigDecimal id,
- final Connection conn)
- throws SQLException {
- final Statement stmt = conn.createStatement();
-
- final ResultSet rs = stmt.executeQuery(String.format(
- "SELECT item_id FROM cms_items WHERE master_id = %s",
- id.toString()));
-
- while (rs.next()) {
- return rs.getBigDecimal(1);
- }
-
- return null;
- }
-
- private BigDecimal getParentIdFor(final BigDecimal id,
- final Connection conn)
- throws SQLException {
- final Statement stmt = conn.createStatement();
-
- final ResultSet rs = stmt.executeQuery(String.format(
- "SELECT parent_id FROM cms_items WHERE item_id = %s",
- id.toString()));
-
- while (rs.next()) {
- return rs.getBigDecimal(1);
- }
-
- return null;
- }
-
- private void rollback(final Connection conn) {
- try {
- conn.rollback();
- } catch (SQLException ex1) {
- System.err.println("Rollback failed.");
- ex1.printStackTrace(System.err);
- }
- }
-
- private void close(final Connection conn) {
- try {
- conn.close();
- } catch (SQLException ex) {
- System.err.println("Failed to close JDBC connection.");
- printStackTrace(ex);
- }
- }
-
- private void printStackTrace(final SQLException ex) {
- ex.printStackTrace(System.err);
- if (ex.getNextException() != null) {
- printStackTrace(ex.getNextException());
- }
- }
-}
diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/AbstractAssocUpgrade.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/AbstractAssocUpgrade.java
new file mode 100644
index 000000000..8b2efeccb
--- /dev/null
+++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/AbstractAssocUpgrade.java
@@ -0,0 +1,420 @@
+package com.arsdigita.cms.contenttypes.upgrades;
+
+import com.arsdigita.runtime.RuntimeConfig;
+import com.arsdigita.util.cmd.Program;
+import com.arsdigita.util.jdbc.Connections;
+import java.math.BigDecimal;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.cli.CommandLine;
+
+/**
+ *
+ * @author Jens Pelzetter
+ * @version $Id$
+ */
+public abstract class AbstractAssocUpgrade extends Program {
+
+ public AbstractAssocUpgrade(final String name, final String version, final String usage) {
+ super(name, version, usage);
+ }
+
+ protected abstract String getTableName();
+
+ protected abstract String getOwnerIdCol();
+
+ protected abstract String getMemberIdCol();
+
+ protected abstract Map getAttributes();
+
+ protected abstract String getPrimaryKeyConstraintName();
+
+ protected abstract String getOwnerConstraintName();
+
+ protected abstract String getMemberConstraintName();
+
+ protected abstract String getOwnerTableName();
+
+ protected abstract String getMemberTableName();
+
+ @Override
+ protected void doRun(final CommandLine cmdLine) {
+ System.out.println("Starting upgrade...");
+ final List oldData = new ArrayList();
+
+ final Connection conn = Connections.acquire(RuntimeConfig.getConfig().
+ getJDBCURL());
+ try {
+ conn.setAutoCommit(false);
+ } catch (SQLException ex) {
+ System.err.println("Failed to configure JDBC connection.");
+ printStackTrace(ex);
+ close(conn);
+ return;
+ }
+
+ System.out.println("Retrieving old data...");
+ try {
+ final Statement stmt = conn.createStatement();
+ final ResultSet oldAssocResult = stmt.executeQuery(String.format(
+ "SELECT * "
+ + "FROM %s "
+ + "JOIN cms_items on %s = item_id "
+ + "WHERE version = 'draft' ",
+ getTableName(),
+ getOwnerIdCol()));
+
+ while (oldAssocResult.next()) {
+ AssocEntry entry = new AssocEntry();
+
+ entry.setOwnerDraftId(oldAssocResult.getBigDecimal(getOwnerIdCol()));
+ entry.setOwnerDraftBundleId(getParentIdFor(entry.getOwnerDraftId(), conn));
+
+ entry.setMemberDraftId(oldAssocResult.getBigDecimal(getMemberIdCol()));
+ entry.setMemberDraftBundleId(getParentIdFor(entry.getMemberDraftId(), conn));
+
+ entry.setOwnerPublicId(getPublicIdFor(entry.getOwnerDraftId(), conn));
+ entry.setOwnerPublicBundleId(getPublicIdFor(entry.getOwnerDraftBundleId(), conn));
+
+ entry.setMemberPublicId(getPublicIdFor(entry.getMemberDraftId(), conn));
+ entry.setMemberPublicBundleId(getPublicIdFor(entry.getMemberDraftBundleId(), conn));
+
+ for (Map.Entry attribute : getAttributes().entrySet()) {
+ entry.addAttribute(attribute.getKey(), oldAssocResult.getString(attribute.getKey()));
+ }
+
+ oldData.add(entry);
+ }
+ } catch (SQLException ex) {
+ System.err.println("Failed to retrieve old data.");
+ printStackTrace(ex);
+ return;
+ }
+
+ try {
+ System.out.println("Droping old table...");
+ final Statement stmt = conn.createStatement();
+ stmt.execute(String.format("DROP TABLE %s", getTableName()));
+ } catch (SQLException ex) {
+ System.err.println("Failed to drop old table.");
+ printStackTrace(ex);
+ rollback(conn);
+ close(conn);
+ return;
+ }
+
+ try {
+ System.out.printf("Creating new table %s...\n", getTableName());
+ final Statement stmt = conn.createStatement();
+
+ final StringBuilder attributesBuilder = new StringBuilder();
+ for (Map.Entry attribute : getAttributes().entrySet()) {
+ if (attributesBuilder.length() > 0) {
+ attributesBuilder.append(",\n");
+ }
+ attributesBuilder.append(attribute.getKey()).append(' ').append(attribute.getValue());
+ }
+ stmt.addBatch(String.format("CREATE TABLE %s ("
+ + "%s integer NOT NULL,"
+ + "%s integer NOT NULL,"
+ + "%s"
+ + ")",
+ getTableName(),
+ getOwnerIdCol(),
+ getMemberIdCol(),
+ attributesBuilder.toString()));
+
+ stmt.addBatch(String.format("ALTER TABLE ONLY %s "
+ + "ADD CONSTRAINT %s "
+ + "PRIMARY KEY (%s, %s)",
+ getTableName(),
+ getPrimaryKeyConstraintName(),
+ getOwnerIdCol(),
+ getMemberIdCol()));
+
+ stmt.addBatch(String.format("ALTER TABLE ONLY %s "
+ + "ADD CONSTRAINT %s "
+ + "FOREIGN KEY (%s)"
+ + "REFERENCES %s(bundle_id)",
+ getTableName(),
+ getOwnerConstraintName(),
+ getOwnerIdCol(),
+ getOwnerTableName()));
+
+ stmt.addBatch(String.format("ALTER TABLE ONLY %s "
+ + "ADD CONSTRAINT %s "
+ + "FOREIGN KEY (%s)"
+ + "REFERENCES %s(bundle_id)",
+ getTableName(),
+ getMemberConstraintName(),
+ getMemberIdCol(),
+ getMemberTableName()));
+
+ stmt.executeBatch();
+
+ } catch (SQLException ex) {
+ System.err.printf("Failed to create new table '%s'.\n", getTableName());
+ printStackTrace(ex);
+ rollback(conn);
+ close(conn);
+ return;
+ }
+
+ try {
+ System.out.println("Filling new table with data...");
+
+ final List processedEntries =
+ new ArrayList();
+ final Statement stmt = conn.createStatement();
+
+ for (AssocEntry entry : oldData) {
+ if (processedEntries.contains(
+ String.format("%s-%s",
+ entry.getOwnerDraftBundleId().toString(),
+ entry.getMemberDraftBundleId().toString()))) {
+ continue;
+ }
+
+ final StringBuilder attributeCols = new StringBuilder();
+ for (Map.Entry attribute : getAttributes().entrySet()) {
+ attributeCols.append(",");
+ attributeCols.append(attribute.getKey());
+ }
+ final StringBuilder attributeValues = new StringBuilder();
+ for (Map.Entry attribute : getAttributes().entrySet()) {
+ attributeValues.append(",");
+ if (attribute.getValue().startsWith("character")) {
+ attributeValues.append('\"');
+ }
+ attributeValues.append(entry.getAttributes().get(attribute.getKey()));
+ if (attribute.getValue().startsWith("character")) {
+ attributeValues.append('\"');
+ }
+ }
+ stmt.addBatch(String.format("INSERT INTO %s ("
+ + "%s,"
+ + "%s"
+ + "%s) "
+ + "VALUES (%s, %s %s)",
+ getTableName(),
+ getOwnerIdCol(),
+ getMemberIdCol(),
+ attributeCols.toString(),
+ entry.getOwnerDraftBundleId().toString(),
+ entry.getMemberDraftBundleId().toString(),
+ attributeValues.toString()));
+ if ((entry.getOwnerPublicBundleId() != null)
+ && (entry.getMemberPublicBundleId() != null)) {
+ stmt.addBatch(String.format("INSERT INTO %s ("
+ + "%s,"
+ + "%s"
+ + "%s) "
+ + "VALUES (%s, %s %s)",
+ getTableName(),
+ getOwnerIdCol(),
+ getMemberIdCol(),
+ attributeCols.toString(),
+ entry.getOwnerPublicBundleId().toString(),
+ entry.getMemberPublicBundleId().toString(),
+ attributeValues.toString()));
+ }
+
+ if (entry.getOwnerPublicId() != null) {
+ stmt.addBatch(String.format("DELETE FROM cms_published_links "
+ + "WHERE pending = %s "
+ + "AND draft_target = %s",
+ entry.getOwnerPublicId().toString(),
+ entry.getMemberDraftId().toString()));
+ }
+
+ if (entry.getMemberPublicId() != null) {
+ stmt.addBatch(String.format("DELETE FROM cms_published_links "
+ + "WHERE pending = %s"
+ + "AND draft_target = %s",
+ entry.getMemberPublicId().toString(),
+ entry.getOwnerDraftId().toString()));
+ }
+
+ processedEntries.add(String.format("%s-%s",
+ entry.getOwnerDraftBundleId().toString(),
+ entry.getMemberDraftBundleId().toString()));
+
+ stmt.executeBatch();
+ }
+ } catch (SQLException ex) {
+ System.err.println("Failed to fill table.");
+ printStackTrace(ex);
+ rollback(conn);
+ close(conn);
+ return;
+ }
+
+ try {
+ conn.commit();
+ } catch (SQLException ex) {
+ System.err.println("Failed to commiting changes.");
+ printStackTrace(ex);
+ rollback(conn);
+ return;
+ }
+
+ close(conn);
+ }
+
+ private BigDecimal getPublicIdFor(final BigDecimal id,
+ final Connection conn)
+ throws SQLException {
+ final Statement stmt = conn.createStatement();
+
+ final ResultSet rs = stmt.executeQuery(String.format(
+ "SELECT item_id FROM cms_items WHERE master_id = %s",
+ id.toString()));
+
+ while (rs.next()) {
+ return rs.getBigDecimal(1);
+ }
+
+ return null;
+ }
+
+ private BigDecimal getParentIdFor(final BigDecimal id,
+ final Connection conn)
+ throws SQLException {
+ final Statement stmt = conn.createStatement();
+
+ final ResultSet rs = stmt.executeQuery(String.format(
+ "SELECT parent_id FROM cms_items WHERE item_id = %s",
+ id.toString()));
+
+ while (rs.next()) {
+ return rs.getBigDecimal(1);
+ }
+
+ return null;
+ }
+
+ private void rollback(final Connection conn) {
+ try {
+ conn.rollback();
+ } catch (SQLException ex1) {
+ System.err.println("Rollback failed.");
+ ex1.printStackTrace(System.err);
+ }
+ }
+
+ private void close(final Connection conn) {
+ try {
+ conn.close();
+ } catch (SQLException ex) {
+ System.err.println("Failed to close JDBC connection.");
+ printStackTrace(ex);
+ }
+ }
+
+ private void printStackTrace(final SQLException ex) {
+ ex.printStackTrace(System.err);
+ if (ex.getNextException() != null) {
+ printStackTrace(ex.getNextException());
+ }
+ }
+
+ private class AssocEntry {
+
+ private BigDecimal ownerDraftId;
+ private BigDecimal memberDraftId;
+ private BigDecimal ownerPublicId;
+ private BigDecimal memberPublicId;
+ private BigDecimal ownerDraftBundleId;
+ private BigDecimal memberDraftBundleId;
+ private BigDecimal ownerPublicBundleId;
+ private BigDecimal memberPublicBundleId;
+ private Map attributes = new HashMap();
+
+ public AssocEntry() {
+ }
+
+ public BigDecimal getOwnerDraftId() {
+ return ownerDraftId;
+ }
+
+ public void setOwnerDraftId(final BigDecimal ownerDraftId) {
+ this.ownerDraftId = ownerDraftId;
+ }
+
+ public BigDecimal getMemberDraftId() {
+ return memberDraftId;
+ }
+
+ public void setMemberDraftId(final BigDecimal memberDraftId) {
+ this.memberDraftId = memberDraftId;
+ }
+
+ public BigDecimal getOwnerPublicId() {
+ return ownerPublicId;
+ }
+
+ public void setOwnerPublicId(final BigDecimal ownerPublicId) {
+ this.ownerPublicId = ownerPublicId;
+ }
+
+ public BigDecimal getMemberPublicId() {
+ return memberPublicId;
+ }
+
+ public void setMemberPublicId(final BigDecimal memberPublicId) {
+ this.memberPublicId = memberPublicId;
+ }
+
+ public BigDecimal getOwnerDraftBundleId() {
+ return ownerDraftBundleId;
+ }
+
+ public void setOwnerDraftBundleId(final BigDecimal ownerDraftBundleId) {
+ this.ownerDraftBundleId = ownerDraftBundleId;
+ }
+
+ public BigDecimal getMemberDraftBundleId() {
+ return memberDraftBundleId;
+ }
+
+ public void setMemberDraftBundleId(final BigDecimal memberDraftBundleId) {
+ this.memberDraftBundleId = memberDraftBundleId;
+ }
+
+ public BigDecimal getMemberPublicBundleId() {
+ return memberPublicBundleId;
+ }
+
+ public void setMemberPublicBundleId(BigDecimal memberPublicBundleId) {
+ this.memberPublicBundleId = memberPublicBundleId;
+ }
+
+ public BigDecimal getOwnerPublicBundleId() {
+ return ownerPublicBundleId;
+ }
+
+ public void setOwnerPublicBundleId(BigDecimal ownerPublicBundleId) {
+ this.ownerPublicBundleId = ownerPublicBundleId;
+ }
+
+ public Map getAttributes() {
+ return Collections.unmodifiableMap(attributes);
+ }
+
+ public void addAttribute(final String name, final String value) {
+ attributes.put(name, value);
+ }
+
+ public void setAttributes(final Map attributes) {
+ this.attributes = attributes;
+ }
+
+ }
+}
diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/AbstractBundleUpgrade.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/AbstractBundleUpgrade.java
new file mode 100644
index 000000000..e7a798b01
--- /dev/null
+++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/AbstractBundleUpgrade.java
@@ -0,0 +1,159 @@
+package com.arsdigita.cms.contenttypes.upgrades;
+
+import com.arsdigita.runtime.RuntimeConfig;
+import com.arsdigita.util.cmd.Program;
+import com.arsdigita.util.jdbc.Connections;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import org.apache.commons.cli.CommandLine;
+
+/**
+ *
+ * @author Jens Pelzetter
+ * @version $Id$
+ */
+public abstract class AbstractBundleUpgrade extends Program {
+
+ public AbstractBundleUpgrade(final String name, final String version, final String usage) {
+ super(name, version, usage);
+ }
+
+ protected abstract String getBundleTableName();
+
+ protected abstract String getContentItemTableName();
+
+ protected abstract String getIdColName();
+
+ protected abstract String getBundleClassName();
+
+ protected abstract String getPrimaryKeyConstraintName();
+
+ protected abstract String getBundleContraintName();
+
+ @Override
+ public void doRun(final CommandLine cmdLine) {
+ System.out.println("Starting upgrade...");
+
+ System.out.println("Trying to get JDBC connection...");
+
+ final Connection conn = Connections.acquire(RuntimeConfig.getConfig().
+ getJDBCURL());
+ try {
+ conn.setAutoCommit(false);
+ } catch (SQLException ex) {
+ System.err.println("Failed to configure JDBC connection.");
+ printStackTrace(ex);
+ close(conn);
+ return;
+ }
+
+ try {
+ System.out.printf("Creating new table %s...\n", getBundleTableName());
+ final Statement stmt = conn.createStatement();
+
+ stmt.addBatch(String.format("CREATE TABLE %s ( "
+ + "bundle_id integer NOT NULL)",
+ getBundleTableName()));
+
+ stmt.addBatch(String.format("ALTER TABLE ONLY %s "
+ + "ADD CONSTRAINT %s "
+ + "PRIMARY KEY (bundle_id);",
+ getBundleTableName(),
+ getPrimaryKeyConstraintName()));
+
+ stmt.addBatch(String.format("ALTER TABLE ONLY %s "
+ + "ADD CONSTRAINT %s "
+ + "FOREIGN KEY (bundle_id) "
+ + "REFERENCES cms_bundles(bundle_id);",
+ getBundleTableName(),
+ getBundleContraintName()));
+
+ stmt.executeBatch();
+
+ } catch (SQLException ex) {
+ System.err.printf("Failed to create table %s.\n",
+ getBundleTableName());
+ printStackTrace(ex);
+ rollback(conn);
+ close(conn);
+ return;
+ }
+
+ try {
+ System.out.println("Filling new tables with data...");
+ final Statement queryPersonsStmt = conn.createStatement();
+ final Statement stmt = conn.createStatement();
+
+ final ResultSet personsRs = queryPersonsStmt.executeQuery(String.format(
+ "SELECT parent_id "
+ + "FROM cms_items "
+ + "JOIN %s "
+ + "ON cms_items.item_id = %s.%s",
+ getBundleTableName(),
+ getBundleTableName(),
+ getIdColName()));
+
+ while (personsRs.next()) {
+ stmt.addBatch(String.format("INSERT INTO %s (bundle_id) "
+ + "VALUES (%d)",
+ getBundleClassName(),
+ personsRs.getInt(1)));
+ stmt.addBatch(String.format(
+ "UPDATE acs_objects "
+ + "SET default_domain_class = '%s',"
+ + "object_type = '%s' "
+ + "WHERE object_id = %d",
+ getBundleClassName(),
+ getBundleClassName(),
+ personsRs.getInt(1)));
+ }
+
+ stmt.executeBatch();
+ } catch (SQLException ex) {
+ System.err.println("Failed to fill tables.");
+ printStackTrace(ex);
+ rollback(conn);
+ close(conn);
+ return;
+ }
+
+ try {
+ conn.commit();
+ } catch (SQLException ex) {
+ System.err.println("Failed to commiting modifications.");
+ printStackTrace(ex);
+ rollback(conn);
+ return;
+ }
+
+ close(conn);
+ }
+
+ private void rollback(final Connection conn) {
+ try {
+ conn.rollback();
+ } catch (SQLException ex1) {
+ System.err.println("Rollback failed.");
+ ex1.printStackTrace(System.err);
+ }
+ }
+
+ private void close(final Connection conn) {
+ try {
+ conn.close();
+ } catch (SQLException ex) {
+ System.err.println("Failed to close JDBC connection.");
+ printStackTrace(ex);
+ }
+ }
+
+ private void printStackTrace(final SQLException ex) {
+ ex.printStackTrace(System.err);
+ if (ex.getNextException() != null) {
+ printStackTrace(ex.getNextException());
+ }
+ }
+
+}
diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/CreateContactBundles.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/CreateContactBundles.java
new file mode 100644
index 000000000..338755c56
--- /dev/null
+++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/CreateContactBundles.java
@@ -0,0 +1,50 @@
+package com.arsdigita.cms.contenttypes.upgrades;
+
+import com.arsdigita.cms.contenttypes.GenericContactBundle;
+
+/**
+ *
+ * @author Jens Pelzetter
+ * @version $Id$
+ */
+public class CreateContactBundles extends AbstractBundleUpgrade {
+
+ public CreateContactBundles() {
+ super("CreateContactBundles", "1.0.0", "");
+ }
+
+ public static void main(final String args[]) {
+ new CreateContactBundles().run(args);
+ }
+
+ @Override
+ protected String getBundleTableName() {
+ return "cms_contact_bundles";
+ }
+
+ @Override
+ protected String getContentItemTableName() {
+ return "cms_contacts";
+ }
+
+ @Override
+ protected String getIdColName() {
+ return "contact_id";
+ }
+
+ @Override
+ protected String getBundleClassName() {
+ return GenericContactBundle.class.getName();
+ }
+
+ @Override
+ protected String getPrimaryKeyConstraintName() {
+ return "cms_cont_bundl_bund_id_p_2p6vp";
+ }
+
+ @Override
+ protected String getBundleContraintName() {
+ return "cms_cont_bundl_bund_id_f_m8aga";
+ }
+
+}
diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/CreateOrgaUnitBundles.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/CreateOrgaUnitBundles.java
new file mode 100644
index 000000000..799e01d48
--- /dev/null
+++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/CreateOrgaUnitBundles.java
@@ -0,0 +1,50 @@
+package com.arsdigita.cms.contenttypes.upgrades;
+
+import com.arsdigita.cms.contenttypes.GenericOrganizationalUnitBundle;
+
+/**
+ *
+ * @author Jens Pelzetter
+ * @version $Id$
+ */
+public class CreateOrgaUnitBundles extends AbstractBundleUpgrade {
+
+ public CreateOrgaUnitBundles() {
+ super("CreateOrgaUnitBundles", "1.0.0", "");
+ }
+
+ public static void main(final String args[]) {
+ new CreateOrgaUnitBundles().run(args);
+ }
+
+ @Override
+ protected String getBundleTableName() {
+ return "cms_orgaunit_bundles";
+ }
+
+ @Override
+ protected String getContentItemTableName() {
+ return "cms_organizationalunits";
+ }
+
+ @Override
+ protected String getIdColName() {
+ return "organizationalunit_id";
+ }
+
+ @Override
+ protected String getBundleClassName() {
+ return GenericOrganizationalUnitBundle.class.getName();
+ }
+
+ @Override
+ protected String getPrimaryKeyConstraintName() {
+ return "cms_orgau_bund_bund_id_p_cfjhf";
+ }
+
+ @Override
+ protected String getBundleContraintName() {
+ return "cms_org_con_map_org_id_f_vdrnx";
+ }
+
+}
diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/CreatePersonBundles.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/CreatePersonBundles.java
new file mode 100644
index 000000000..3878324b1
--- /dev/null
+++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/CreatePersonBundles.java
@@ -0,0 +1,51 @@
+package com.arsdigita.cms.contenttypes.upgrades;
+
+import com.arsdigita.cms.contenttypes.GenericPersonBundle;
+
+/**
+ * Creates new table {@code cms_person_bundles}. Part of upgrade from 6.6.4 to 6.6.5
+ *
+ * @author Jens Pelzetter
+ * @version $Id$
+ */
+public class CreatePersonBundles extends AbstractBundleUpgrade {
+
+ public CreatePersonBundles() {
+ super("CreatePersonBundles", "1.0.0", "");
+ }
+
+ public static void main(final String args[]) {
+ new CreatePersonBundles().run(args);
+ }
+
+ @Override
+ protected String getBundleTableName() {
+ return "cms_person_bundles";
+ }
+
+ @Override
+ protected String getContentItemTableName() {
+ return "cms_persons";
+ }
+
+ @Override
+ protected String getIdColName() {
+ return "person_id";
+ }
+
+ @Override
+ protected String getBundleClassName() {
+ return GenericPersonBundle.class.getName();
+ }
+
+ @Override
+ protected String getPrimaryKeyConstraintName() {
+ return "cms_pers_bundl_bund_id_p_7xuzi";
+ }
+
+ @Override
+ protected String getBundleContraintName() {
+ return "cms_pers_bundl_bund_id_f__rzge";
+ }
+
+}
diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/GenericContactGenericPersonAssocUpgrade.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/GenericContactGenericPersonAssocUpgrade.java
new file mode 100644
index 000000000..e1902c421
--- /dev/null
+++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/GenericContactGenericPersonAssocUpgrade.java
@@ -0,0 +1,71 @@
+package com.arsdigita.cms.contenttypes.upgrades;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ *
+ * @author Jens Pelzetter
+ * @version $Id$
+ */
+public class GenericContactGenericPersonAssocUpgrade extends AbstractAssocUpgrade {
+
+ public GenericContactGenericPersonAssocUpgrade() {
+ super("GenericContactGenericPersonAssocUpgrade", "1.0.0", "");
+ }
+
+ public static void main(final String[] args) {
+ new GenericContactGenericPersonAssocUpgrade().run(args);
+ }
+
+ @Override
+ protected String getTableName() {
+ return "cms_person_contact_map";
+ }
+
+ @Override
+ protected String getOwnerIdCol() {
+ return "person_id";
+ }
+
+ @Override
+ protected String getMemberIdCol() {
+ return "contact_id";
+ }
+
+ @Override
+ protected Map getAttributes() {
+ final Map attributes = new HashMap();
+ attributes.put("link_order", "integer");
+ attributes.put("link_key", "character varying(100)");
+ return attributes;
+ }
+
+ @Override
+ protected String getPrimaryKeyConstraintName() {
+ return "cms_per_con_map_con_id_p_g1cii";
+ }
+
+ @Override
+ protected String getOwnerConstraintName() {
+ return "cms_per_con_map_per_id_f_g82jn";
+ }
+
+ @Override
+ protected String getMemberConstraintName() {
+ return "cms_per_con_map_con_id_f_peoc2";
+ }
+
+ @Override
+ protected String getOwnerTableName() {
+ return "cms_person_bundles";
+ }
+
+ @Override
+ protected String getMemberTableName() {
+ return "cms_contact_bundles";
+ }
+
+
+
+}
diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/GenericOrgaUnitGenericContactAssocUpgrade.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/GenericOrgaUnitGenericContactAssocUpgrade.java
new file mode 100644
index 000000000..f6e655eae
--- /dev/null
+++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/GenericOrgaUnitGenericContactAssocUpgrade.java
@@ -0,0 +1,71 @@
+package com.arsdigita.cms.contenttypes.upgrades;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ *
+ * @author Jens Pelzetter
+ * @version $Id$
+ */
+public class GenericOrgaUnitGenericContactAssocUpgrade extends AbstractAssocUpgrade {
+
+ public GenericOrgaUnitGenericContactAssocUpgrade() {
+ super("GenericOrgaUnitGenericContactAssocUpgrade", "1.0.0", "");
+ }
+
+ public static void main(final String args[]) {
+ new GenericOrgaUnitGenericContactAssocUpgrade().run(args);
+ }
+
+ @Override
+ protected String getTableName() {
+ return "cms_organizationalunits_contact_map";
+ }
+
+ @Override
+ protected String getOwnerIdCol() {
+ return "organizationalunit_id";
+ }
+
+ @Override
+ protected String getMemberIdCol() {
+ return "contact_id";
+ }
+
+ @Override
+ protected Map getAttributes() {
+ final Map attributes = new HashMap();
+ attributes.put("contact_type", "character varying(100)");
+ attributes.put("map_order", "integer");
+ return attributes;
+ }
+
+ @Override
+ protected String getPrimaryKeyConstraintName() {
+ return "cms_org_con_map_con_id_p_1rc4y";
+ }
+
+ @Override
+ protected String getOwnerConstraintName() {
+ return "cms_org_con_map_org_id_f_vdrnx";
+ }
+
+ @Override
+ protected String getMemberConstraintName() {
+ return "cms_org_con_map_con_id_f_9tm3c";
+ }
+
+ @Override
+ protected String getOwnerTableName() {
+ return "cms_orgaunit_bundles";
+ }
+
+ @Override
+ protected String getMemberTableName() {
+ return "cms_contact_bundles";
+ }
+
+
+
+}
diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/GenericOrgaUnitGenericOrgaUnitAssocUpgrade.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/GenericOrgaUnitGenericOrgaUnitAssocUpgrade.java
new file mode 100644
index 000000000..da658416d
--- /dev/null
+++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/GenericOrgaUnitGenericOrgaUnitAssocUpgrade.java
@@ -0,0 +1,70 @@
+package com.arsdigita.cms.contenttypes.upgrades;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ *
+ * @author Jens Pelzetter
+ * @version $Id$
+ */
+public class GenericOrgaUnitGenericOrgaUnitAssocUpgrade extends AbstractAssocUpgrade {
+
+ public GenericOrgaUnitGenericOrgaUnitAssocUpgrade() {
+ super("GenericOrgaUnitGenericOrgaUnitAssocUpgrade", "1.0.0", "");
+ }
+
+ public static void main(final String args[]) {
+ new GenericOrgaUnitGenericOrgaUnitAssocUpgrade().run(args);
+ }
+
+ @Override
+ protected String getTableName() {
+ return "cms_organizationalunits_hierarchy_map";
+ }
+
+ @Override
+ protected String getOwnerIdCol() {
+ return "superior_orgaunit_id";
+ }
+
+ @Override
+ protected String getMemberIdCol() {
+ return "subordinate_orgaunit_id";
+ }
+
+ @Override
+ protected Map getAttributes() {
+ final Map attributes = new HashMap();
+ attributes.put("assoc_type", "character varying(128)");
+ attributes.put("superior_orgaunit_order", "integer");
+ attributes.put("subordinate_orgaunit_order", "integer");
+ return attributes;
+ }
+
+ @Override
+ protected String getPrimaryKeyConstraintName() {
+ return "cms_org_hie_map_sub_or_p_nykpq";
+ }
+
+ @Override
+ protected String getOwnerConstraintName() {
+ return "cms_org_hie_map_sup_or_f_qchkn";
+ }
+
+ @Override
+ protected String getMemberConstraintName() {
+ return "cms_org_hie_map_sub_or_f_xq5is";
+ }
+
+ @Override
+ protected String getOwnerTableName() {
+ return "cms_orgaunit_bundles";
+ }
+
+ @Override
+ protected String getMemberTableName() {
+ return "cms_orgaunit_bundles";
+ }
+
+}
diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/GenericOrgaUnitGenericPersonAssocUpgrade.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/GenericOrgaUnitGenericPersonAssocUpgrade.java
new file mode 100644
index 000000000..984145d62
--- /dev/null
+++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/upgrades/GenericOrgaUnitGenericPersonAssocUpgrade.java
@@ -0,0 +1,69 @@
+package com.arsdigita.cms.contenttypes.upgrades;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ *
+ * @author Jens Pelzetter
+ * @version $Id$
+ */
+public class GenericOrgaUnitGenericPersonAssocUpgrade extends AbstractAssocUpgrade {
+
+ public GenericOrgaUnitGenericPersonAssocUpgrade() {
+ super("GenericOrgaUnitGenericPersonAssocUpgrade", "1.0.0", "");
+ }
+
+ public static void main(final String args[]) {
+ new GenericContactGenericPersonAssocUpgrade().run(args);
+ }
+
+ @Override
+ protected String getTableName() {
+ return "cms_organizationalunits_person_map";
+ }
+
+ @Override
+ protected String getOwnerIdCol() {
+ return "organizationalunit_id";
+ }
+
+ @Override
+ protected String getMemberIdCol() {
+ return "person_id";
+ }
+
+ @Override
+ protected Map getAttributes() {
+ final Map attributes = new HashMap();
+ attributes.put("role_name", "character varying(100)");
+ attributes.put("status", "character varying(100)");
+ return attributes;
+ }
+
+ @Override
+ protected String getPrimaryKeyConstraintName() {
+ return "cms_org_per_map_org_id_p_km6_m";
+ }
+
+ @Override
+ protected String getOwnerConstraintName() {
+ return "cms_org_per_map_org_id_f_ducb2";
+ }
+
+ @Override
+ protected String getMemberConstraintName() {
+ return "cms_org_per_map_per_id_f_hrpzh";
+ }
+
+ @Override
+ protected String getOwnerTableName() {
+ return "cms_orgaunit_bundles";
+ }
+
+ @Override
+ protected String getMemberTableName() {
+ return "cms_person_bundles";
+ }
+
+}
diff --git a/ccm-sci-types-institute/application.xml b/ccm-sci-types-institute/application.xml
index eadd1b55d..3fd652867 100644
--- a/ccm-sci-types-institute/application.xml
+++ b/ccm-sci-types-institute/application.xml
@@ -2,7 +2,7 @@