/*
* Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.cms;
import com.arsdigita.persistence.metadata.Property;
/**
* This interface represents an item which may be a component of a
* ContentItem but may not itself extend ContentItem. Implementing
* CustomCopy is not necessary for a component to be
* published. However, only CustomCopy objects can override default
* attribute/role copying behavior via its copyProperty method. Only
* DomainObjects should implement this interface.
*
*/
public interface CustomCopy {
/**
* Copy the specified property (attribute or association) from the
* specified source item. This method almost completely overrides
* the metadata-driven methods in ObjectCopier. If
* the property in question is an association to
* ContentItem(s), this method should only
* call FooContentItem newChild = copier.copy(srcItem, this,
* riginalChild, property); An attempt to call any other
* method in order to copy the child will most likely have
* disastrous consequences. In fact, this copier method should
* generally be called for any DomainObject copies, later making
* custom changes, unless the copying behavior itself is different
* from the default (or the item should not be copied at all at
* this point).
*
*
* If a subclass of a class which implements CustomCopy overrides
* this method, it should return super.copyProperty
* for properties which do not need custom behavior in order to
* indicate that it is not interested in handling the property in
* any special way.
*
* For example, the {@link Article} class extends
* ContentItem. It defines an association to 0..n
* {@link ImageAsset}. Unfortunately, the association has
* "order_n" and "caption" link attributes, which cannot be copied
* automatically, since the persistence system doesn't know enough
* about them. The following sample code from the {@link Article}
* class ensures that images are copied correctly (note that this
* example no longer applies to the Article case, so it remains as
* a general example):
*
*
* * @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. * @return true if the property was copied; false to indicate * that regular metadata-driven methods should be used * to copy the property. */ boolean copyProperty(final CustomCopy source, final Property property, final ItemCopier copier); }* protected boolean copyProperty(CustomCopy srcItem, Property property, ItemCopier copier) { * String attrName = property.getName(); * // We only care about copying images; all other properties should * // be handled in a default manner * if (!attrName.equals(IMAGES)) * return super.copyProperty(srcItem, property, copier); * * // The source item is guaranteed to be of the correct type * Article src = (Article)srcItem; * * // Retrieve images from the source * ImageAssetCollection srcImages = src.getImages(); * * // Copy each image using the passed-in copier * while(srcImages.next()) { * ImageAsset srcImage = srcImages.getImage(); * * // Images may be shared between items, and so they are not * // composite. Thus, we are going to pass false to the object * // copier in the second parameter * ImageAsset newImage = * (ImageAsset)copier.copy(srcItem, this, srcImage, property); * * // Add the new image to the new item * addImage(newImage, src.getCaption(srcImage)); * } * * // Tell the automated copying service that we have handled this * // property * return true; * } *