diff --git a/ccm-cms/pdl/com/arsdigita/content-section/PublishedAssociation.pdl b/ccm-cms/pdl/com/arsdigita/content-section/PublishedAssociation.pdl deleted file mode 100644 index 13cb5fa1b..000000000 --- a/ccm-cms/pdl/com/arsdigita/content-section/PublishedAssociation.pdl +++ /dev/null @@ -1,14 +0,0 @@ -//$Id$ - -model com.arsdigita.cms; - -object type PublishedAssociation { - composite ContentItem[1..1] draftA = join cms_published_associations.draft_a to cms_items.item_id; - composite ContentItem[1..1] draftB = join cms_published_associations.draft_b to cms_items.item_id; - String[1..1] propertyA = cms_published_associations.property_a VARCHAR(100); - String[1..1] propertyB = cms_published_associations.property_b VARCHAR(100); - //composite ContentItem[1..1] pendingA = join cms_published_associations.pending_a to cms_items.item_id; - //composite ContentItem[1..1] pendingB = join cms_published_associations.pending_b to cms_items.item_id; - Blob[0..1] associationAttributes = cms_published_associations.association_attributes BLOB; - object key (draftA, draftB, propertyA, propertyB); -} \ No newline at end of file diff --git a/ccm-cms/src/com/arsdigita/cms/AssociationCopier.java b/ccm-cms/src/com/arsdigita/cms/AssociationCopier.java index c22452ec7..8dd5fc630 100644 --- a/ccm-cms/src/com/arsdigita/cms/AssociationCopier.java +++ b/ccm-cms/src/com/arsdigita/cms/AssociationCopier.java @@ -10,10 +10,11 @@ import com.arsdigita.persistence.metadata.Property; */ public interface AssociationCopier { - boolean handlesProperty(Property property); - void copy(DomainObject source, - DomainObject target, - DomainObject value, - Property property); + boolean copyReverseProperty(CustomCopy source, + DomainObject target, + Property property, + DomainObject value, + ItemCopier copier); + } diff --git a/ccm-cms/src/com/arsdigita/cms/AssociationCopierDefaultImpl.java b/ccm-cms/src/com/arsdigita/cms/AssociationCopierDefaultImpl.java deleted file mode 100644 index 4c98c17e8..000000000 --- a/ccm-cms/src/com/arsdigita/cms/AssociationCopierDefaultImpl.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.arsdigita.cms; - -import com.arsdigita.domain.DomainObject; -import com.arsdigita.persistence.metadata.Property; -import java.util.HashMap; -import java.util.Map; - -/** - * - * @author Jens Pelzetter - * @version $Id$ - */ -public class AssociationCopierDefaultImpl implements AssociationCopier { - - final Map handledProperties = - new HashMap(); - - public void addHandledProperty(final String name, - final String type, - final String reverse, - final String reverseType) { - final HandledProperty prop = new HandledProperty(); - prop.setName(name); - prop.setType(type); - prop.setReverse(reverse); - prop.setReverseType(reverseType); - handledProperties.put(name, prop); - } - - public boolean handlesProperty(final Property property) { - return handledProperties.containsKey(property.getName()); - } - - public void copy(final DomainObject source, - final DomainObject target, - final DomainObject value, - final Property property) { - final HandledProperty propData = handledProperties.get( - property.getName()); - if (propData == null) { - throw new IllegalArgumentException(String.format( - "Illegal call for this method. Property '%s' is not handled" - + "by this AssociationCopier.", property.getName())); - } - - //Create PublishedAssociation here. - final HandledProperty handledProperty = handledProperties.get(property. - getName()); - if (handledProperty == null) { - throw new IllegalArgumentException(String.format( - "Property '%s' " - + "is not handled by this AssociationCopier.", - property.getName())); - } - - final ContentItem sourceItem = (ContentItem) source; - final ContentItem valueItem = (ContentItem) value; - - PublishedAssociation.create(sourceItem, - valueItem, - property.getName(), - handledProperty.getReverse()); - } - - private class HandledProperty { - - private String name; - private String type; - private String reverse; - private String reverseType; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getReverse() { - return reverse; - } - - public void setReverse(String reverse) { - this.reverse = reverse; - } - - public String getReverseType() { - return reverseType; - } - - public void setReverseType(String reverseType) { - this.reverseType = reverseType; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - } -} diff --git a/ccm-cms/src/com/arsdigita/cms/ContentItem.java b/ccm-cms/src/com/arsdigita/cms/ContentItem.java index 8f5991dbb..edaa44050 100755 --- a/ccm-cms/src/com/arsdigita/cms/ContentItem.java +++ b/ccm-cms/src/com/arsdigita/cms/ContentItem.java @@ -371,7 +371,7 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { /** * @return the base PDL object type for this item. Child classes should - * override this method to return the correct value + * override this method to return the correct value */ @Override public String getBaseDataObjectType() { @@ -382,6 +382,7 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { * Publicized getter method for use by metadata forms. * * @param key + * * @return */ @Override @@ -392,8 +393,7 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { /** * Public setter method for use by metadata forms. * - * @param key - * @param value + * @param key param value */ @Override public void set(final String key, final Object value) { @@ -403,8 +403,8 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { /** * Public add for use by metadata forms. * - * @param propertyName - * @param dobj + * @param propertyName param dobj + * * @return */ @Override @@ -415,8 +415,7 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { /** * Public remove for use by metadata forms * - * @param propertyName - * @param dobj + * @param propertyName param dobj */ @Override public void remove(String propertyName, DomainObject dobj) { @@ -694,6 +693,7 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { * * @param includeSelf a * boolean value. + * * @return the items on the path to the root folder. */ public ItemCollection getPathInfo(boolean includeSelf) { @@ -761,8 +761,7 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { * true if this item is a * DRAFT version. * - * @return - * true if this item is a + * @return < code>true if this item is a * DRAFT version */ public boolean isDraftVersion() { @@ -800,6 +799,7 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { * * @return the working version representation of the * ContentItem, possibly this item + * * @deprecated use {@link #getDraftVersion()} instead */ public ContentItem getWorkingVersion() { @@ -811,8 +811,7 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { * true if this item is a * PENDING version. * - * @return - * true if + * @return < code>true if * this is one of the pending versions */ public boolean isPendingVersion() { @@ -915,8 +914,7 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { * true if this item is a * LIVE version. * - * @return - * true if + * @return < code>true if * this is the live version */ public boolean isLiveVersion() { @@ -1067,8 +1065,7 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { * not necessarily the live version nor is this method to be confused with * isPublished. * - * @return - * true if this content item has a live + * @return < code>true if this content item has a live * version, or if it is the live version */ public boolean isLive() { @@ -1079,7 +1076,7 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { * Makes an item live or not live. * * @param version the version which should become live, null to make the - * item non-live + * item non-live */ public void setLive(final ContentItem version) { if (s_log.isDebugEnabled()) { @@ -1142,8 +1139,7 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { s_log.debug("Deleting old live version"); oldVersion.delete(); - PublishedLink.refreshOnUnpublish(this); - PublishedAssociation.refreshOnUnPublish(this); + PublishedLink.refreshOnUnpublish(this); } if (parent instanceof ContentBundle || parent instanceof Folder) { @@ -1171,8 +1167,7 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { save(); - PublishedLink.updateLiveLinks(version); - PublishedAssociation.updateLiveAssociations(version); + PublishedLink.updateLiveLinks(version); save(); // publish item (as template or html pages) to the file @@ -1186,9 +1181,9 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { /** * Schedules an item for publication. * - * @param cycleDef The lifecycle definition + * @param cycleDef The lifecycle definition * @param startDate The time to schedule the start of the lifecycle. If - * null, use the current time as the start date. + * null, use the current time as the start date. * * @return the new pending version */ @@ -1546,6 +1541,7 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { * 'non-finalness' of this method should be considered deprecated. * * @return the live version for this item + * * @see #copyServicesFrom(ContentItem) */ public ContentItem copy() { @@ -1561,10 +1557,11 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { * associations from the copy to point to the copies of original items.

* NOTE: This method will save the item and all of its unpublished subitems. * - * @param newParent The new parent item for this item + * @param newParent The new parent item for this item * @param copyServices Copy services if true * * @return the new copy of the item + * * @see #copyServicesFrom(ContentItem) */ final public ContentItem copy(final ContentItem newParent, @@ -1617,6 +1614,7 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { * language of the copy. * * @param language + * * @return */ protected ContentItem makeCopy(String language) { @@ -1645,6 +1643,7 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { * * @param source the * ContentItem whose services will be copied + * * @see #copy() */ public void copyServicesFrom(final ContentItem source) { @@ -1660,7 +1659,8 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { * subitems. * * @param cycle the lifecycle to use. A null cycle implies that a live - * version should be created. + * version should be created. + * * @return the new pending version for this item */ protected ContentItem createPendingVersion(final Lifecycle cycle) { @@ -1705,10 +1705,12 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { } setLive(pending); + ContentBundle draftBundle = getBundle(); ContentBundle liveBundle = pending.getBundle(); - if (draftBundle != null && liveBundle != null && !liveBundle. - isLiveVersion()) { + if ((draftBundle != null) + && (liveBundle != null) + && (!liveBundle.isLiveVersion())) { draftBundle.promotePendingVersion(liveBundle); } @@ -1842,12 +1844,13 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { * false to indicate that the copier should continue to handle * the association normally. * - * @param source the source CustomCopy item + * @param source the source CustomCopy item * @param property the property to copy - * @param copier a temporary class that is able to copy a child item - * correctly. + * @param copier a temporary class that is able to copy a child item + * correctly. + * * @return true if the property was copied; false to indicate that regular - * metadata-driven methods should be used to copy the property. + * metadata-driven methods should be used to copy the property. */ public boolean copyProperty(final CustomCopy source, final Property property, @@ -1884,8 +1887,8 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { if (parent instanceof ContentBundle) { final ContentBundle bundle = (ContentBundle) parent; - final ContentBundle oldLiveBundle = (ContentBundle) bundle. - getPublicVersion(); + final ContentBundle oldLiveBundle = + (ContentBundle) bundle.getPublicVersion(); //jensp 2012-03-07 Changes to the ContentBundle were not //published because the ContentBundle was not republished. //Moved the next lines out of the if below to enable @@ -1925,7 +1928,8 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { final ItemCollection instances = oldLiveBundle. getInstances(); while (instances.next()) { - liveBundle.addInstance(instances.getContentItem()); + liveBundle.addInstance( + instances.getContentItem()); } } @@ -1956,7 +1960,7 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { * processing of services. * * @return true to tell the object copier to stop copying services for this - * item, false otherwise + * item, false otherwise */ public boolean copyServices(ContentItem srcItem) { return false; @@ -2209,7 +2213,7 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { * generators returned by this method will may be null.

* * @return A list of all extra XML Generators for lists views of this - * content item. + * content item. */ public List getExtraListXMLGenerators() { return new ArrayList(); diff --git a/ccm-cms/src/com/arsdigita/cms/PublishedAssociation.java b/ccm-cms/src/com/arsdigita/cms/PublishedAssociation.java deleted file mode 100644 index 5fae3d707..000000000 --- a/ccm-cms/src/com/arsdigita/cms/PublishedAssociation.java +++ /dev/null @@ -1,233 +0,0 @@ -package com.arsdigita.cms; - -import com.arsdigita.domain.DomainObject; -import com.arsdigita.persistence.DataCollection; -import com.arsdigita.persistence.DataObject; -import com.arsdigita.persistence.OID; -import com.arsdigita.persistence.Session; -import com.arsdigita.persistence.SessionManager; -import com.arsdigita.persistence.metadata.Property; -import com.arsdigita.util.UncheckedWrapperException; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -/** - * - * @author Jens Pelzetter - * @version $Id$ - */ -public class PublishedAssociation extends DomainObject { - - private static final String DRAFT_A = "draftA"; - private static final String DRAFT_B = "draftA"; - private static final String PROPERTY_A = "propertyA"; - private static final String PROPERTY_B = "propertyB"; - //private static final String PENDING_A = "pendingA"; - //private static final String PENDING_B = "pendingA"; - private static final String ATTRIBUTES = "associationAttributes"; - public static final String BASE_DATA_OBJECT_TYPE = - "com.arsdigita.cms.PublishedAssociation"; - - protected PublishedAssociation() { - super(BASE_DATA_OBJECT_TYPE); - } - - protected PublishedAssociation(final DataObject dobj) { - super(dobj); - } - - protected PublishedAssociation(final OID oid) { - super(oid); - } - - @Override - protected String getBaseDataObjectType() { - return BASE_DATA_OBJECT_TYPE; - } - - protected static PublishedAssociation create(final ContentItem draftA, - final ContentItem draftB, - final String propertyA, - final String propertyB) { - //Check if the association is already saved. - final Session session = SessionManager.getSession(); - final DataCollection assocsA = session.retrieve(BASE_DATA_OBJECT_TYPE); - assocsA.addEqualsFilter(DRAFT_A + ".id", draftA.getID()); - assocsA.addEqualsFilter(DRAFT_B + ".id", draftB.getID()); - assocsA.addEqualsFilter(PROPERTY_A, propertyA); - assocsA.addEqualsFilter(PROPERTY_B, propertyB); - - if (assocsA.size() == 1) { - assocsA.next(); - final DataObject dobj = assocsA.getDataObject(); - assocsA.close(); - return new PublishedAssociation(dobj); - } else if (assocsA.size() > 1) { - throw new UncheckedWrapperException( - "Something very strange has occurred. There is more than " - + "one PublishedAssociation for a association."); - } - - //Maybe draftA and draftB are switched - final DataCollection assocsB = session.retrieve(BASE_DATA_OBJECT_TYPE); - assocsB.addEqualsFilter(DRAFT_A + ".id", draftB.getID()); - assocsB.addEqualsFilter(DRAFT_B + ".id", draftA.getID()); - assocsB.addEqualsFilter(PROPERTY_A, propertyB); - assocsB.addEqualsFilter(PROPERTY_B, propertyA); - - if (assocsB.size() == 1) { - assocsB.next(); - final DataObject dobj = assocsB.getDataObject(); - assocsB.close(); - return new PublishedAssociation(dobj); - } else if (assocsB.size() > 1) { - throw new UncheckedWrapperException( - "Something very strange has occurred. There is more than " - + "one PublishedAssociation for a association."); - } - - //No existing entry found, crate new one. - - final PublishedAssociation assoc = new PublishedAssociation(); - assoc.set(DRAFT_A, draftA); - assoc.set(DRAFT_B, draftB); - assoc.set(PROPERTY_A, propertyA); - assoc.set(PROPERTY_B, PROPERTY_B); - - if (draftA.getObjectType().getProperty(propertyA).isCollection()) { - final DataCollection coll = (DataCollection) draftA.get( - propertyA + "@link"); - - while (coll.next()) { - DataObject linkObj = coll.getDataObject(); - - if (draftB.getOID().equals(((DataObject) linkObj.getOID().get( - propertyA)).getOID())) { - assoc.saveAssociationAttributes(linkObj); - coll.close(); - } - } - } - - assoc.save(); - - return assoc; - } - - protected static void updateLiveAssociations(final ContentItem item) { - final Session session = SessionManager.getSession(); - final ContentItem draftItem = item.getDraftVersion(); - final ContentItem liveItem = draftItem.getLiveVersion(); - - final DataCollection assocsA = session.retrieve(BASE_DATA_OBJECT_TYPE); - assocsA.addEqualsFilter(DRAFT_A + ".id", draftItem.getID()); - processAssociations(assocsA, liveItem); - - final DataCollection assocsB = session.retrieve(BASE_DATA_OBJECT_TYPE); - assocsB.addEqualsFilter(DRAFT_B + ".id", draftItem.getID()); - processAssociations(assocsB, liveItem); - } - - private static void processAssociations(final DataCollection associations, - final ContentItem liveItem) { - while (associations.next()) { - processAssociation(new PublishedAssociation( - associations.getDataObject()), liveItem); - } - } - - private static void processAssociation( - final PublishedAssociation association, - final ContentItem liveItem) { - final ContentItem otherDraft = (ContentItem) association.get(DRAFT_B); - final ContentItem otherLive = otherDraft.getLiveVersion(); - - if (otherLive != null) { - createAssociation(liveItem, - (String) association.get(PROPERTY_A), - otherLive, - (byte[]) association.get(ATTRIBUTES)); - } - } - - private static void createAssociation(final ContentItem itemA, - final String propertyA, - final ContentItem itemB, - final byte[] associationAttributes) { - final DataObject association = itemA.add(propertyA, itemB); - setAttributesForLiveAssociation(association, associationAttributes); - } - - protected static void refreshOnUnPublish(final ContentItem item) { - //Nothing to do - } - - private void saveAssociationAttributes(final DataObject assocObj) { - final Iterator properties = assocObj.getObjectType(). - getDeclaredProperties(); - final Map assocAttrs = new HashMap(); - - while (properties.hasNext()) { - processAttribute(assocObj, assocAttrs, (Property) properties.next()); - } - - if (!assocAttrs.isEmpty()) { - final ByteArrayOutputStream data = new ByteArrayOutputStream(); - try { - final ObjectOutputStream out = new ObjectOutputStream(data); - out.writeObject(assocAttrs); - } catch (IOException ex) { - throw new UncheckedWrapperException(ex); - } - - set(ATTRIBUTES, data.toByteArray()); - } - } - - private void processAttribute(final DataObject assocObj, - final Map assocAttrs, - final Property property) { - final String name = property.getName(); - - // Teste Property: Es darf kein Key und muß ein simples Attribute sein - if (property.isAttribute() && !property.isKeyProperty()) { - final Object value = assocObj.get(name); - assocAttrs.put(name, value); - } - } - - private static void setAttributesForLiveAssociation( - final DataObject association, byte[] attributes) { - if (attributes != null) { - final ByteArrayInputStream data; - final ObjectInputStream in; - final Map assocAttrs; - - data = new ByteArrayInputStream(attributes); - try { - in = new ObjectInputStream(data); - assocAttrs = (Map) in.readObject(); - } catch (IOException ex) { - throw new UncheckedWrapperException(ex); - } catch (ClassNotFoundException ex) { - throw new UncheckedWrapperException(ex); - } - - if (assocAttrs != null) { - for(Map.Entry entry : assocAttrs.entrySet()) { - if(association.getObjectType().hasDeclaredProperty(entry.getKey()) - && association.getSession() != null) { - association.set(entry.getKey(), entry.getValue()); - } - - } - } - } - } -} diff --git a/ccm-cms/src/com/arsdigita/cms/VersionCopier.java b/ccm-cms/src/com/arsdigita/cms/VersionCopier.java index 616a3e835..0d446b07d 100755 --- a/ccm-cms/src/com/arsdigita/cms/VersionCopier.java +++ b/ccm-cms/src/com/arsdigita/cms/VersionCopier.java @@ -74,6 +74,7 @@ class VersionCopier extends ObjectCopier { * ContentItem)} in order to transfer the categories and other services. * * @param item the item to be copied + * * @return a copy of the item */ @Override @@ -168,7 +169,7 @@ class VersionCopier extends ObjectCopier { * @param source the * DomainObject being copied * @param target the new copy - * @param prop the + * @param prop the * Property currently under consideration */ @Override @@ -196,56 +197,49 @@ class VersionCopier extends ObjectCopier { item.assertDraft(); } - if ((item instanceof AssociationCopier) - && ((AssociationCopier) item).handlesProperty(prop)) { - final AssociationCopier assocCopier = (AssociationCopier) item; - assocCopier.copy(source, target, target, prop); - + + + if (prop.isComponent()) { + s_log.debug("The property is a component; creating a " + + "live or pending version"); + + final ContentItem copy = createVersion(item); + + m_trace.exit("copy", copy); + + return copy; + } else if (m_traversedComponents.contains(object)) { + final DomainObject copy = copy(object); + + m_trace.exit("copy", copy); + + return copy; + } else if (prop.isRequired()) { + Assert.fail( + "1..1 associations to non-component top-level ContentItems are not allowed"); return null; } else { + s_log.debug("The property is not a component; creating " + + "PublishedLink for the item"); - if (prop.isComponent()) { - s_log.debug("The property is a component; creating a " - + "live or pending version"); - - final ContentItem copy = createVersion(item); - - m_trace.exit("copy", copy); - - return copy; - } else if (m_traversedComponents.contains(object)) { - final DomainObject copy = copy(object); - - m_trace.exit("copy", copy); - - return copy; - } else if (prop.isRequired()) { - Assert.fail( - "1..1 associations to non-component top-level ContentItems are not allowed"); - return null; + if (source instanceof ContentItem) { + PublishedLink.create( + (ContentItem) getCopy(m_topLevelSourceOID), + target, + prop.getName(), + item, + (ContentItem) source); } else { - s_log.debug("The property is not a component; creating " - + "PublishedLink for the item"); - - if (source instanceof ContentItem) { - PublishedLink.create( - (ContentItem) getCopy(m_topLevelSourceOID), - target, - prop.getName(), - item, - (ContentItem) source); - } else { - PublishedLink.create( - (ContentItem) getCopy(m_topLevelSourceOID), - target, - prop.getName(), - item, - null); - } - m_trace.exit("copy", null); - - return null; + PublishedLink.create( + (ContentItem) getCopy(m_topLevelSourceOID), + target, + prop.getName(), + item, + null); } + m_trace.exit("copy", null); + + return null; } } else { s_log.debug("The property is not a content item; using " diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericContact.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericContact.java index 8095c858f..2fcc25fed 100644 --- a/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericContact.java +++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericContact.java @@ -39,27 +39,31 @@ public class GenericContact extends ContentPage implements RelationAttributeInterface { private static final Logger logger = Logger.getLogger(GenericContact.class); - /** PDL property names */ + /** + * PDL property names + */ public static final String PERSON = "person"; // public static final String CONTACT_TYPE = ""; public static final String ADDRESS = "address"; public static final String CONTACT_ENTRIES = "contactentries"; - public static final String CONTACTS_KEY = GenericPersonContactCollection.CONTACTS_KEY; - - private static final String RELATION_ATTRIBUTES = "person.link_key:GenericContactTypes;contactentries.key:GenericContactEntryKeys"; - + public static final String CONTACTS_KEY = + GenericPersonContactCollection.CONTACTS_KEY; + private static final String RELATION_ATTRIBUTES = + "person.link_key:GenericContactTypes;contactentries.key:GenericContactEntryKeys"; // Config private static final GenericContactConfig s_config = - new GenericContactConfig(); + new GenericContactConfig(); static { logger.debug("Static initializer is starting..."); s_config.load(); logger.debug("Static initializer finished"); } - /** Data object type for this domain object */ + /** + * Data object type for this domain object + */ public static final String BASE_DATA_OBJECT_TYPE = - "com.arsdigita.cms.contenttypes.GenericContact"; + "com.arsdigita.cms.contenttypes.GenericContact"; public GenericContact() { super(BASE_DATA_OBJECT_TYPE); @@ -81,7 +85,7 @@ public class GenericContact extends ContentPage implements public GenericContact(String type) { super(type); - //unsetPerson(); + //unsetPerson(); } @Override @@ -90,7 +94,7 @@ public class GenericContact extends ContentPage implements Assert.exists(getContentType(), ContentType.class); } - + /** * Retrieves the current configuration */ @@ -101,47 +105,43 @@ public class GenericContact extends ContentPage implements public GenericContactBundle getGenericContactBundle() { return (GenericContactBundle) getContentBundle(); } - + /////////////////////////////////////////////////////////////// // accessors // Get the person for this contact public GenericPerson getPerson() { - /*DataCollection collection; + /* + * DataCollection collection; + * + * collection = (DataCollection) get(PERSON); + * + * if (collection.size() == 0) { return null; } else { DataObject dobj; + * + * collection.next(); dobj = collection.getDataObject(); + * + * // Close Collection to prevent an open ResultSet collection.close(); + * + * return (GenericPerson) DomainObjectFactory.newInstance(dobj); + } + */ - collection = (DataCollection) get(PERSON); - - if (collection.size() == 0) { - return null; - } else { - DataObject dobj; - - collection.next(); - dobj = collection.getDataObject(); - - // Close Collection to prevent an open ResultSet - collection.close(); - - return (GenericPerson) DomainObjectFactory.newInstance(dobj); - }*/ - return getGenericContactBundle().getPerson(); } // Set the person for this contact public void setPerson(GenericPerson person, String contactType) { //set(PERSON, person); - /*if (getPerson() != null) { - unsetPerson(); + /* + * if (getPerson() != null) { unsetPerson(); } + * + * if (person != null) { Assert.exists(person, GenericPerson.class); + * DataObject link = add(PERSON, person); + * link.set(GenericPerson.CONTACTS_KEY, contactType); + * link.set(GenericPerson.CONTACTS_ORDER, new + * BigDecimal(person.getContacts().size())); link.save(); } + */ - if (person != null) { - Assert.exists(person, GenericPerson.class); - DataObject link = add(PERSON, person); - link.set(GenericPerson.CONTACTS_KEY, contactType); - link.set(GenericPerson.CONTACTS_ORDER, new BigDecimal(person.getContacts().size())); - link.save(); - }*/ - getGenericContactBundle().setPerson(person, contactType); } @@ -157,12 +157,12 @@ public class GenericContact extends ContentPage implements // Unset the address for this contact public void unsetPerson() { //set(PERSON, null); - /*GenericPerson oldPerson; - oldPerson = getPerson(); - if (oldPerson != null) { - remove(PERSON, oldPerson); - }*/ - + /* + * GenericPerson oldPerson; oldPerson = getPerson(); if (oldPerson != + * null) { remove(PERSON, oldPerson); + } + */ + getGenericContactBundle().unsetPerson(); } @@ -204,8 +204,8 @@ public class GenericContact extends ContentPage implements GenericPerson person = getPerson(); - if(person != null) { - GenericPersonContactCollection collection = person.getContacts(); + if (person != null) { + GenericPersonContactCollection collection = person.getContacts(); collection.next(); String contactType = (String) collection.getContactType(); @@ -221,8 +221,8 @@ public class GenericContact extends ContentPage implements public void setContactType(String contactType) { GenericPerson person = getPerson(); - if(person != null) { - GenericPersonContactCollection collection = person.getContacts(); + if (person != null) { + GenericPersonContactCollection collection = person.getContacts(); collection.next(); DataObject link = (DataObject) collection.get("link"); link.set(CONTACTS_KEY, contactType); @@ -249,9 +249,9 @@ public class GenericContact extends ContentPage implements @Override public boolean hasRelationAttributeProperty(String propertyName) { StringTokenizer strTok = new StringTokenizer(RELATION_ATTRIBUTES, ";"); - while(strTok.hasMoreTokens()) { + while (strTok.hasMoreTokens()) { String token = strTok.nextToken(); - if(token.startsWith(propertyName + ".")) { + if (token.startsWith(propertyName + ".")) { return true; } } @@ -266,10 +266,11 @@ public class GenericContact extends ContentPage implements @Override public String getRelationAttributeKeyName(String propertyName) { StringTokenizer strTok = new StringTokenizer(RELATION_ATTRIBUTES, ";"); - while(strTok.hasMoreTokens()) { + while (strTok.hasMoreTokens()) { String token = strTok.nextToken(); - if(token.startsWith(propertyName + ".")) { - return token.substring(token.indexOf(".") + 1, token.indexOf(":")); + if (token.startsWith(propertyName + ".")) { + return token.substring(token.indexOf(".") + 1, + token.indexOf(":")); } } return null; @@ -278,9 +279,9 @@ public class GenericContact extends ContentPage implements @Override public String getRelationAttributeName(String propertyName) { StringTokenizer strTok = new StringTokenizer(RELATION_ATTRIBUTES, ";"); - while(strTok.hasMoreTokens()) { + while (strTok.hasMoreTokens()) { String token = strTok.nextToken(); - if(token.startsWith(propertyName + ".")) { + if (token.startsWith(propertyName + ".")) { return token.substring(token.indexOf(":") + 1); } } @@ -291,5 +292,4 @@ public class GenericContact extends ContentPage implements public String getRelationAttributeKey(String propertyName) { return null; } - } diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericContactBundle.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericContactBundle.java index ede378c56..db6c4dcb0 100644 --- a/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericContactBundle.java +++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericContactBundle.java @@ -2,11 +2,14 @@ package com.arsdigita.cms.contenttypes; import com.arsdigita.cms.ContentBundle; import com.arsdigita.cms.ContentItem; +import com.arsdigita.cms.CustomCopy; +import com.arsdigita.cms.ItemCopier; import com.arsdigita.domain.DataObjectNotFoundException; import com.arsdigita.domain.DomainObjectFactory; import com.arsdigita.persistence.DataCollection; import com.arsdigita.persistence.DataObject; import com.arsdigita.persistence.OID; +import com.arsdigita.persistence.metadata.Property; import com.arsdigita.util.Assert; import java.math.BigDecimal; @@ -15,7 +18,8 @@ import java.math.BigDecimal; * @author Jens Pelzetter * @version $Id$ */ -public class GenericContactBundle extends ContentBundle { +public class GenericContactBundle + extends ContentBundle { public static final String BASE_DATA_OBJECT_TYPE = "com.arsdigita.cms.contenttypes.GenericContactBundle"; @@ -30,26 +34,85 @@ public class GenericContactBundle extends ContentBundle { setContentType(primary.getContentType()); addInstance(primary); - super.setName(primary.getName()); + super.setName(primary.getName()); } public GenericContactBundle(final OID oid) throws DataObjectNotFoundException { - super(oid); + super(oid); } public GenericContactBundle(final BigDecimal id) throws DataObjectNotFoundException { - super(new OID(BASE_DATA_OBJECT_TYPE, id)); + super(new OID(BASE_DATA_OBJECT_TYPE, id)); } public GenericContactBundle(final DataObject dobj) { - super(dobj); + super(dobj); } public GenericContactBundle(final String type) { super(type); } + + /** + *

Copy association properties. These are for example the associations + * between GenericPerson and GenericContact, or between + * GenericOrganizationalUnit and GenericPerson.

+ * + * @param source param property param copier + * @param property + * @param copier + * + * @return + */ + @Override + public boolean copyProperty(final CustomCopy source, + final Property property, + final ItemCopier copier) { + final String attribute = property.getName(); + if (copier.getCopyType() == ItemCopier.VERSION_COPY) { + final GenericContactBundle contactBundle = + (GenericContactBundle) source; + + if (PERSON.equals(attribute)) { + + final DataCollection persons = (DataCollection) contactBundle. + get(PERSON); + + while (persons.next()) { + createPersonAssoc(persons); + } + + return true; + } else { + return super.copyProperty(source, property, copier); + } + } else { + return super.copyProperty(source, property, copier); + } + } + + private void createPersonAssoc(final DataCollection persons) { + final GenericPersonBundle draftPerson = + (GenericPersonBundle) DomainObjectFactory. + newInstance( + persons.getDataObject()); + final GenericPersonBundle livePerson = + (GenericPersonBundle) draftPerson. + getLiveVersion(); + + if (livePerson != null) { + final DataObject link = add(PERSON, livePerson); + + link.set(GenericPerson.CONTACTS_KEY, + persons.get(GenericPersonContactCollection.CONTACTS_KEY)); + link.set(GenericPerson.CONTACTS_ORDER, + persons.get(GenericPersonContactCollection.CONTACTS_ORDER)); + + link.save(); + } + } public GenericPerson getPerson() { DataCollection collection; @@ -90,7 +153,7 @@ public class GenericContactBundle extends ContentBundle { } } - public void unsetPerson() { + public void unsetPerson() { GenericPerson oldPerson; oldPerson = getPerson(); if (oldPerson != null) { diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericPerson.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericPerson.java index a489c2eda..4076fa50a 100644 --- a/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericPerson.java +++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericPerson.java @@ -18,19 +18,18 @@ */ package com.arsdigita.cms.contenttypes; -import com.arsdigita.cms.ContentType; import com.arsdigita.cms.ContentPage; +import com.arsdigita.cms.ContentType; import com.arsdigita.cms.LanguageInvariantContentItem; import com.arsdigita.cms.RelationAttributeInterface; import com.arsdigita.domain.DataObjectNotFoundException; import com.arsdigita.domain.DomainObjectFactory; -import com.arsdigita.persistence.DataCollection; import com.arsdigita.persistence.DataObject; import com.arsdigita.persistence.OID; import com.arsdigita.util.Assert; import java.math.BigDecimal; -import java.util.StringTokenizer; import java.util.Date; +import java.util.StringTokenizer; /** * Basic GenericPerson Contenttype for OpenCCM. @@ -55,14 +54,18 @@ public class GenericPerson extends ContentPage implements public static final String ALIAS = "alias"; public static final String DABIN_ID = "dabinId"; private static final String RELATION_ATTRIBUTES = - "contacts.link_key:GenericContactType"; - /** Data object type for this domain object */ + "contacts.link_key:GenericContactType"; + /** + * Data object type for this domain object + */ public static final String BASE_DATA_OBJECT_TYPE = "com.arsdigita.cms.contenttypes.GenericPerson"; + /** * Default constructor. This creates a new (empty) GenericPerson. - **/ + * + */ public GenericPerson() { this(BASE_DATA_OBJECT_TYPE); } @@ -72,21 +75,21 @@ public class GenericPerson extends ContentPage implements } public GenericPerson(OID id) throws DataObjectNotFoundException { - super(id); + super(id); } public GenericPerson(DataObject obj) { - super(obj); + super(obj); } public GenericPerson(String type) { - super(type); + super(type); } - + public GenericPersonBundle getGenericPersonBundle() { return (GenericPersonBundle) getContentBundle(); } - + @Override public void beforeSave() { super.beforeSave(); @@ -94,7 +97,9 @@ public class GenericPerson extends ContentPage implements Assert.exists(getContentType(), ContentType.class); } - /* accessors *****************************************************/ + /* + * accessors **************************************************** + */ public String getSurname() { return (String) get(SURNAME); } @@ -148,25 +153,26 @@ public class GenericPerson extends ContentPage implements } public GenericPerson getAlias() { - return (GenericPerson) DomainObjectFactory.newInstance((DataObject) get(ALIAS)); + return (GenericPerson) DomainObjectFactory.newInstance((DataObject) get( + ALIAS)); } - + public void setAlias(final GenericPerson alias) { set(ALIAS, alias); } - + public void unsetAlias() { set(ALIAS, null); } - + public Integer getDabinId() { - return (Integer)get(DABIN_ID); + return (Integer) get(DABIN_ID); } - + public void setDabinId(final Integer dabinId) { set(DABIN_ID, dabinId); } - + /** * A convenient method which combines {@code titlePre}, {@code givenName), * {@code surname} and {@code titlePost}. @@ -213,19 +219,21 @@ public class GenericPerson extends ContentPage implements // Get all contacts for this person public GenericPersonContactCollection getContacts() { //return new GenericPersonContactCollection( - // (DataCollection) get(CONTACTS)); + // (DataCollection) get(CONTACTS)); return getGenericPersonBundle().getContacts(); } // Add a contact for this person - public void addContact(final GenericContact contact, + public void addContact(final GenericContact contact, final String contactType) { - /* Assert.exists(contact, GenericContact.class); - - DataObject link = add(CONTACTS, contact); - - link.set(CONTACTS_KEY, contactType); - link.set(CONTACTS_ORDER, BigDecimal.valueOf(getContacts().size()));*/ + /* + * Assert.exists(contact, GenericContact.class); + * + * DataObject link = add(CONTACTS, contact); + * + * link.set(CONTACTS_KEY, contactType); link.set(CONTACTS_ORDER, + * BigDecimal.valueOf(getContacts().size())); + */ getGenericPersonBundle().addContact(contact, contactType); } @@ -316,13 +324,13 @@ public class GenericPerson extends ContentPage implements public String getRelationAttributeKey(String propertyName) { return null; } - + @Override public String getSearchSummary() { return getFullName(); } - + public boolean isLanguageInvariant() { return true; - } + } } diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericPersonBundle.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericPersonBundle.java index 6f704d5b6..b66f3eda5 100644 --- a/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericPersonBundle.java +++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericPersonBundle.java @@ -2,10 +2,15 @@ package com.arsdigita.cms.contenttypes; import com.arsdigita.cms.ContentBundle; import com.arsdigita.cms.ContentItem; +import com.arsdigita.cms.CustomCopy; +import com.arsdigita.cms.ItemCopier; import com.arsdigita.domain.DataObjectNotFoundException; +import com.arsdigita.domain.DomainObject; +import com.arsdigita.domain.DomainObjectFactory; import com.arsdigita.persistence.DataCollection; import com.arsdigita.persistence.DataObject; import com.arsdigita.persistence.OID; +import com.arsdigita.persistence.metadata.Property; import com.arsdigita.util.Assert; import java.math.BigDecimal; @@ -14,7 +19,8 @@ import java.math.BigDecimal; * @author Jens Pelzetter * @version $Id$ */ -public class GenericPersonBundle extends ContentBundle { +public class GenericPersonBundle + extends ContentBundle { public final static String BASE_DATA_OBJECT_TYPE = "com.arsdigita.cms.contenttypes.GenericPersonBundle"; @@ -31,24 +37,24 @@ public class GenericPersonBundle extends ContentBundle { setContentType(primary.getContentType()); addInstance(primary); - super.setName(primary.getName()); + super.setName(primary.getName()); } public GenericPersonBundle(final OID oid) throws DataObjectNotFoundException { - super(oid); + super(oid); } public GenericPersonBundle(final BigDecimal id) throws DataObjectNotFoundException { - super(new OID(BASE_DATA_OBJECT_TYPE, id)); + super(new OID(BASE_DATA_OBJECT_TYPE, id)); } public GenericPersonBundle(final DataObject dobj) { - super(dobj); + super(dobj); } public GenericPersonBundle(final String type) { - super(type); + super(type); } public GenericPersonContactCollection getContacts() { @@ -57,7 +63,7 @@ public class GenericPersonBundle extends ContentBundle { } // Add a contact for this person - public void addContact(final GenericContact contact, + public void addContact(final GenericContact contact, final String contactType) { Assert.exists(contact, GenericContact.class); @@ -76,4 +82,49 @@ public class GenericPersonBundle extends ContentBundle { public boolean hasContacts() { return !this.getContacts().isEmpty(); } + + @Override + public boolean copyProperty(final CustomCopy source, + final Property property, + final ItemCopier copier) { + final String attribute = property.getName(); + final GenericPersonBundle personBundle = + (GenericPersonBundle) source; + if (copier.getCopyType() == ItemCopier.VERSION_COPY) { + if (CONTACTS.equals(attribute)) { + final DataCollection contacts = (DataCollection) personBundle. + get(CONTACTS); + + while (contacts.next()) { + createContactAssoc(contacts); + } + + return true; + } else { + return super.copyProperty(source, property, copier); + } + } else { + return super.copyProperty(source, property, copier); + } + } + + private void createContactAssoc(final DataCollection contacts) { + final GenericContactBundle draftContact = + (GenericContactBundle) DomainObjectFactory. + newInstance(contacts.getDataObject()); + final GenericContactBundle liveContact = + (GenericContactBundle) draftContact. + getLiveVersion(); + + if (liveContact != null) { + final DataObject link = add(CONTACTS, liveContact); + + link.set(GenericPersonContactCollection.CONTACTS_KEY, contacts.get( + CONTACTS_KEY)); + link.set(GenericPersonContactCollection.CONTACTS_ORDER, + contacts.get(CONTACTS_ORDER)); + + link.save(); + } + } } diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericPersonContactCollection.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericPersonContactCollection.java index a20cd0d7c..73532f5d7 100644 --- a/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericPersonContactCollection.java +++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericPersonContactCollection.java @@ -180,20 +180,11 @@ public class GenericPersonContactCollection extends DomainCollection { } public GenericAddress getAddress() { - /* - * return (GenericAddress) DomainObjectFactory.newInstance((DataObject) - * m_dataCollection. getDataObject().get( - GenericContact.ADDRESS)); - */ + return getContact().getAddress(); } - public GenericContactEntryCollection getContactEntries() { - /* - * return new GenericContactEntryCollection((DataCollection) - * m_dataCollection. getDataObject().get( - GenericContact.CONTACT_ENTRIES)); - */ + public GenericContactEntryCollection getContactEntries() { return getContact().getContactEntries(); } }