diff --git a/ccm-cms-dabinpersonimporter/application.xml b/ccm-cms-dabinpersonimporter/application.xml index ae573d9f1..1d81d015b 100644 --- a/ccm-cms-dabinpersonimporter/application.xml +++ b/ccm-cms-dabinpersonimporter/application.xml @@ -10,9 +10,10 @@ - + - + + diff --git a/ccm-cms-dabinpersonimporter/src/com/arsdigita/cms/dabin/PersonImporter.java b/ccm-cms-dabinpersonimporter/src/com/arsdigita/cms/dabin/PersonImporter.java index b31c69bc6..006520577 100644 --- a/ccm-cms-dabinpersonimporter/src/com/arsdigita/cms/dabin/PersonImporter.java +++ b/ccm-cms-dabinpersonimporter/src/com/arsdigita/cms/dabin/PersonImporter.java @@ -1,9 +1,19 @@ package com.arsdigita.cms.dabin; import com.arsdigita.categorization.Category; +import com.arsdigita.cms.ContentBundle; import com.arsdigita.cms.ContentPage; import com.arsdigita.cms.ContentSection; import com.arsdigita.cms.Folder; +import com.arsdigita.cms.contentassets.RelatedLink; +import com.arsdigita.cms.contenttypes.Address; +import com.arsdigita.cms.contenttypes.Contact; +import com.arsdigita.cms.contenttypes.GenericContactEntry; +import com.arsdigita.cms.contenttypes.GenericPerson; +import com.arsdigita.cms.contenttypes.Link; +import com.arsdigita.cms.contenttypes.Person; +import com.arsdigita.cms.contenttypes.SciAuthor; +import com.arsdigita.cms.contenttypes.SciMember; import com.arsdigita.cms.lifecycle.Lifecycle; import com.arsdigita.cms.lifecycle.LifecycleDefinition; import com.arsdigita.cms.lifecycle.LifecycleDefinitionCollection; @@ -14,6 +24,7 @@ import com.arsdigita.persistence.TransactionContext; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.sql.Connection; import java.sql.DriverManager; @@ -38,14 +49,26 @@ public class PersonImporter extends Program { private Properties config; private Connection connection = null; private ContentSection membersSection; + private ContentSection membersContactsSection; private ContentSection authorsSection; + private ContentSection authorsContactsSection; private ContentSection personsSection; + private ContentSection personsContactsSection; + private ContentSection addressSection; private LifecycleDefinition membersLifecycle; + private LifecycleDefinition membersContactsLifecycle; private LifecycleDefinition authorsLifecycle; + private LifecycleDefinition authorsContactsLifecycle; private LifecycleDefinition personsLifecycle; + private LifecycleDefinition personsContactsLifecycle; + private LifecycleDefinition addressLifecycle; private Folder membersFolder; + private Folder membersContactsFolder; private Folder authorsFolder; + private Folder authorsContactsFolder; private Folder personsFolder; + private Folder personsContactsFolder; + private Folder addressFolder; private Category membersActiveCategory; private Category membersFormerCategory; private Category membersAssociatedCategory; @@ -116,34 +139,68 @@ public class PersonImporter extends Program { membersSection = getContentSection(config.getProperty( "members.contentsection")); + membersContactsSection = getContentSection(config.getProperty( + "members.contacts.contentsection")); authorsSection = getContentSection(config.getProperty( "members.contentsection")); + authorsContactsSection = getContentSection(config.getProperty( + "members.contacts.contentsection")); personsSection = getContentSection(config.getProperty( "members.contentsection")); + personsContactsSection = getContentSection(config.getProperty( + "members.contacts.contentsection")); + addressSection = getContentSection((config.getProperty( + "address.contentsection"))); LifecycleDefinitionCollection lifecycles = membersSection. getLifecycleDefinitions(); while (lifecycles.next()) { membersLifecycle = lifecycles.getLifecycleDefinition(); } + lifecycles = membersContactsSection.getLifecycleDefinitions(); + while (lifecycles.next()) { + membersContactsLifecycle = lifecycles.getLifecycleDefinition(); + } lifecycles = authorsSection.getLifecycleDefinitions(); while (lifecycles.next()) { authorsLifecycle = lifecycles.getLifecycleDefinition(); } + lifecycles = authorsContactsSection.getLifecycleDefinitions(); + while (lifecycles.next()) { + authorsContactsLifecycle = lifecycles.getLifecycleDefinition(); + } lifecycles = personsSection.getLifecycleDefinitions(); while (lifecycles.next()) { personsLifecycle = lifecycles.getLifecycleDefinition(); } + lifecycles = personsContactsSection.getLifecycleDefinitions(); + while (lifecycles.next()) { + personsContactsLifecycle = lifecycles.getLifecycleDefinition(); + } final String membersFolderPath = config.getProperty("members.folder"); + final String membersContactsFolderPath = config.getProperty( + "members.contacts.folder"); final String authorsFolderPath = config.getProperty("authors.folder"); + final String authorsContactsFolderPath = config.getProperty( + "authors.contacts.folder"); final String personsFolderPath = config.getProperty("persons.folder"); + final String personsContactsFolderPath = config.getProperty( + "persons.contacts.folder"); + final String addressFolderPath = config.getProperty("address.folder"); membersFolder = getOrCreateFolder(membersSection, membersFolderPath); + membersContactsFolder = getOrCreateFolder(membersContactsSection, + membersContactsFolderPath); authorsFolder = getOrCreateFolder(authorsSection, authorsFolderPath); + authorsContactsFolder = getOrCreateFolder(authorsContactsSection, + authorsContactsFolderPath); personsFolder = getOrCreateFolder(personsSection, personsFolderPath); + personsContactsFolder = getOrCreateFolder(personsContactsSection, + personsContactsFolderPath); + addressFolder = getOrCreateFolder(addressSection, addressFolderPath); membersActiveCategory = new Category(new BigDecimal(config.getProperty( "members.active.category"))); @@ -185,7 +242,7 @@ public class PersonImporter extends Program { final Statement stmt = connection.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); - + final ResultSet result = stmt.executeQuery("SELECT Abteilung_Id, Name " + "FROM abteilung " @@ -250,13 +307,33 @@ public class PersonImporter extends Program { System.out.println("Configuration values:"); System.out.println("---------------------"); - System.out.printf("membersSection = %s\n", membersSection.getName()); - System.out.printf("authorsSection = %s\n", authorsSection.getName()); - System.out.printf("personsSection = %s\n", personsSection.getName()); + System.out.printf("membersSection = %s\n", membersSection. + getName()); + System.out.printf("membersContactsSection = %s\n", + membersContactsSection.getName()); + System.out.printf("authorsSection = %s\n", authorsSection. + getName()); + System.out.printf("authorsContactsSection = %s\n", + authorsContactsSection.getName()); + System.out.printf("personsSection = %s\n", personsSection. + getName()); + System.out.printf("personsContactsSection = %s\n", + personsContactsSection.getName()); System.out.println(""); - System.out.printf("membersFolder = %s\n", membersFolder.getPath()); - System.out.printf("authorsFolder = %s\n", authorsFolder.getPath()); - System.out.printf("personsFolder = %s\n", personsFolder.getPath()); + System.out.printf("membersFolder = %s\n", + membersFolder.getPath()); + System.out.printf("membersContactsFolder = %s\n", + membersFolder.getPath()); + System.out.printf("authorsFolder = %s\n", + authorsFolder.getPath()); + System.out.printf("authorsContactsFolder = %s\n", + authorsFolder.getPath()); + System.out.printf("personsFolder = %s\n", + personsFolder.getPath()); + System.out.printf("personsContactsFolder = %s\n", + personsFolder.getPath()); + System.out.printf("addressFolder = %s\n", + addressFolder.getPath()); System.out.println(""); System.out.printf("membersActiveCategory = %s\n", membersActiveCategory.getName()); @@ -323,38 +400,274 @@ public class PersonImporter extends Program { + "JOIN abteilunglink " + "ON person.Person_Id = abteilunglink.Person_Id " + "ORDER BY person.Name"); - + result.last(); final long number = result.getRow(); result.beforeFirst(); - System.out.printf("Found %d persons in the DaBIn database.", number); - + System.out.printf("Found %d persons in the DaBIn database.\n", + number); + int i = 1; - while (result.next()) { - System.out.printf("Processing person '%d' of '%d':\n", i, number); - System.out.printf("\tPerson_Id = %s\n", - result.getString("person.Person_Id")); - System.out.printf("\tAnrede = %s\n", - result.getString("person.Anrede")); - System.out.printf("\tName = %s\n", - result.getString("person.Name")); - System.out.printf("\tVorname = %s\n", - result.getString("person.Vorname")); - System.out.printf("\tAnstellung = %s\n", - result.getString("person.Anstellung")); - System.out.printf("\tEigenschaft = %s\n", - result.getString("person.Eigenschaft")); - System.out.printf("\tAngaben = %s\n", - result.getString("person.Angaben")); - System.out.printf("\tAbteilung_Id = %s\n", - result.getString("abteilunglink.Abteilung_Id")); - System.out.println(""); - - i++; + + final TransactionContext tctx = SessionManager.getSession(). + getTransactionContext(); + + tctx.beginTxn(); + + System.out.println("Creating address..."); + final Address address = new Address(); + address.setName(config.getProperty("address.name")); + address.setTitle(config.getProperty("address.title")); + address.setAddress(config.getProperty("address.data")); + address.setPostalCode(config.getProperty("address.code")); + address.setCity(config.getProperty("address.city")); + address.setIsoCountryCode(config.getProperty("address.country")); + address.setLanguage("de"); + + final ContentBundle addressBundle = new ContentBundle(address); + addressBundle.setDefaultLanguage("de"); + + address.setContentSection(addressSection); + addressBundle.setContentSection(addressSection); + addressFolder.addItem(addressBundle); + + try { + while (result.next()) { + System.out.printf("Processing person '%d' of '%d':\n", i, + number); + System.out.printf("\tPerson_Id = %s\n", + result.getString("person.Person_Id")); + System.out.printf("\tAnrede = %s\n", + result.getString("person.Anrede")); + System.out.printf("\tName = %s\n", + result.getString("person.Name")); + System.out.printf("\tVorname = %s\n", + result.getString("person.Vorname")); + System.out.printf("\tAnstellung = %s\n", + result.getString("person.Anstellung")); + System.out.printf("\tEigenschaft = %s\n", + result.getString("person.Eigenschaft")); + System.out.printf("\tAngaben = %s\n", + result.getString("person.Angaben")); + System.out.printf("\tAbteilung_Id = %s\n", + result.getString( + "abteilunglink.Abteilung_Id")); + System.out.println(""); + + GenericPerson person; + ContentSection section; + ContentSection contactsSection; + Folder folder; + Folder contactsFolder; + LifecycleDefinition lifecycleDefinition; + LifecycleDefinition contactLifecycleDefinition; + Category category = null; + if ("Aktiv".equals(result.getString("person.Eigenschaft"))) { + person = new SciMember(); + section = membersSection; + folder = membersFolder; + contactsSection = membersContactsSection; + contactsFolder = membersContactsFolder; + category = membersActiveCategory; + lifecycleDefinition = membersLifecycle; + contactLifecycleDefinition = membersContactsLifecycle; + category = membersActiveCategory; + } else if ("Ehemalig".equals(result.getString( + "person.Eigenschaft"))) { + person = new SciMember(); + section = membersSection; + folder = membersFolder; + contactsSection = membersContactsSection; + contactsFolder = membersContactsFolder; + category = membersFormerCategory; + lifecycleDefinition = membersLifecycle; + contactLifecycleDefinition = membersContactsLifecycle; + category = membersFormerCategory; + } else if ("Assoziert".equals(result.getString( + "person.Eigenschaft"))) { + person = new SciMember(); + section = membersSection; + folder = membersFolder; + contactsSection = membersContactsSection; + contactsFolder = membersContactsFolder; + category = membersAssociatedCategory; + lifecycleDefinition = membersLifecycle; + category = membersAssociatedCategory; + contactLifecycleDefinition = membersContactsLifecycle; + } else if ("Autor".equals(result.getString( + "person.Eigenschaft"))) { + person = new SciAuthor(); + section = authorsSection; + folder = authorsFolder; + contactsSection = authorsContactsSection; + contactsFolder = authorsContactsFolder; + lifecycleDefinition = authorsLifecycle; + contactLifecycleDefinition = authorsContactsLifecycle; + } else { + person = new Person(); + section = personsSection; + folder = personsFolder; + contactsSection = personsContactsSection; + contactsFolder = personsContactsFolder; + lifecycleDefinition = personsLifecycle; + contactLifecycleDefinition = personsContactsLifecycle; + } + + person.setSurname(result.getString("person.Name")); + person.setGivenName(result.getString("person.Vorname")); + person.setTitlePre(result.getString("person.Anrede")); + person.setDabinId(result.getInt("person.Person_Id")); + person.setLanguage("de"); + person.setContentSection(section); + person.setLifecycle(createLifecycle(lifecycleDefinition)); + person.save(); + + resolveDuplicateNameAndTitle(person, folder); + + ContentBundle personBundle = new ContentBundle(person); + personBundle.setDefaultLanguage("de"); + personBundle.setContentSection(section); + folder.addItem(personBundle); + personBundle.setLifecycle(createLifecycle( + lifecycleDefinition)); + personBundle.save(); + + + if (category != null) { + category.addChild(personBundle); + } + + if ("Aktiv".equals(result.getString("person.Eigenschaft")) + || "Ehemalig".equals(result.getString( + "person.Eigenschaft")) + || "Assoziert".equals(result.getString( + "person.Eigenschaft"))) { + if (!result.getString("abteilunglink.Abteilung_Id"). + isEmpty()) { + Category depCat = null; + + if ("Aktiv".equals(result.getString( + "person.Eigenschaft"))) { + depCat = + membersActiveDepartmentCategories.get(result. + getString("abteilunglink.Abteilung_Id")); + } else if ("Ehemalig".equals(result.getString( + "person.Eigenschaft"))) { + depCat = + membersFormerDepartmentCategories.get(result. + getString("abteilunglink.Abteilung_Id")); + } else if ("Assoziert".equals(result.getString( + "person.Eigenscahaft"))) { + depCat = membersAssociatedDepartmentCategories. + get(result.getString( + "abteilunglink.Abteilung_Id")); + } + + if (depCat != null) { + depCat.addChild(personBundle); + } + } + } + + if (!result.getString("person.Angaben").isEmpty()) { + Contact contact = new Contact(); + contact.setLanguage("de"); + contact.setName(String.format("kontakt-%s", person. + getName())); + contact.setTitle(String.format("Kontakt %s", person. + getTitle())); + contact.setPerson(person, "commonContact"); + + + final String[] contactData = + result.getString("person.Angaben").split( + "\n"); + String homepage = null; + for (String token : contactData) { + String key; + String value; + + if (token.indexOf("=") < 0) { + System.err.printf("Warning: Invalid contact entry: '%s'" + + "Skiping.", token); + continue; + } + key = token.substring(0, token.indexOf('=')).trim(); + value = + token.substring(token.indexOf('=') + 1).trim(); + + if ("Raum_1".equals(key)) { + contact.addContactEntry( + new GenericContactEntry(contact, + "office", + value, + "")); + } else if ("Tel_1".equals(key) + && value.startsWith("Fax: ")) { + contact.addContactEntry(new GenericContactEntry( + contact, + "fax", + value.substring(6), + "")); + } else if ("Tel_1".equals(key)) { + contact.addContactEntry( + new GenericContactEntry(contact, + "phoneOffice", + value, + "")); + } else if ("eMail_1".equals(key)) { + contact.addContactEntry( + new GenericContactEntry(contact, + "email", + value, + "")); + } else if ("WWW_1".equals(key)) { + contact.addContactEntry( + new GenericContactEntry(contact, + "homepage", + value, + "")); + homepage = value; + } + } + + contact.setAddress(address); + + contact.setContentSection(contactsSection); + contact.setLifecycle(createLifecycle( + contactLifecycleDefinition)); + ContentBundle contactBundle = new ContentBundle(contact); + contactBundle.setDefaultLanguage("de"); + contactBundle.setContentSection(contactsSection); + contactsFolder.addItem(contactBundle); + contactBundle.save(); + + if (homepage != null) { + RelatedLink homepageLink; + homepageLink = new RelatedLink(); + homepageLink.setTitle("Persönliche Homepage"); + homepageLink.setTargetType(Link.EXTERNAL_LINK); + homepageLink.setTargetURI(homepage); + homepageLink.setLinkListName("NONE"); + homepageLink.setLinkOwner(person); + homepageLink.save(); + } + } + + i++; + } + + tctx.commitTxn(); + } catch (UnsupportedEncodingException ex) { + System.err.println("Error: "); + ex.printStackTrace(System.err); + return; + } finally { + if (tctx.inTxn()) { + tctx.abortTxn(); + } } - - } catch (SQLException ex) { System.err.println("Failed to load departments."); ex.printStackTrace(System.err);