libreccm-legacy/ccm-cms/src/com/arsdigita/cms/ArticleImageAssociation.java

253 lines
8.7 KiB
Java
Executable File

/*
* Copyright (C) 2001-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.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.SessionManager;
import com.arsdigita.persistence.metadata.Property;
import com.arsdigita.util.Assert;
import com.arsdigita.versioning.VersionedACSObject;
import java.math.BigDecimal;
/**
* This class associates an Article and an Image with a particular
* caption.
*
* @author Jack Chung (flattop@arsdigita.com)
* @version $Revision: #17 $ $Date: 2004/08/17 $
*/
public class ArticleImageAssociation extends ContentItem {
public static final String versionId = "$Id: ArticleImageAssociation.java 287 2005-02-22 00:29:02Z sskracic $ by $Author: sskracic $, $DateTime: 2004/08/17 23:15:09 $";
public static final String BASE_DATA_OBJECT_TYPE =
"com.arsdigita.cms.ArticleImageAssociation";
protected static final String ARTICLE = "captionArticle";
protected static final String IMAGE = "imageAsset";
protected static final String CAPTION = "caption";
protected static final String ARTICLE_ID = "articleId";
protected static final String IMAGE_ID = "imageId";
/**
* Default constructor.
**/
public ArticleImageAssociation() {
super(BASE_DATA_OBJECT_TYPE);
}
/**
* Constructor. The contained <code>DataObject</code> is retrieved
* from the persistent storage mechanism with an <code>OID</code>
* specified by <i>oid</i>.
*
* @param oid The <code>OID</code> for the retrieved
* <code>DataObject</code>.
**/
public ArticleImageAssociation(OID oid) throws DataObjectNotFoundException {
super(oid);
}
public ArticleImageAssociation(DataObject obj) {
super(obj);
}
public ArticleImageAssociation(String type) {
super(type);
}
/**
* This returns the association object that is specified by
* the passed in IDs or it returns null if no such association exists
*/
public static ArticleImageAssociation retrieveAssociation
(BigDecimal articleID, BigDecimal imageID) {
DataCollection collection = SessionManager.getSession().retrieve
(BASE_DATA_OBJECT_TYPE);
collection.addEqualsFilter(ARTICLE_ID, articleID);
collection.addEqualsFilter(IMAGE_ID, imageID);
// no deleted associations, please
collection.addEqualsFilter(VersionedACSObject.IS_DELETED, new BigDecimal(0));
if (collection.next()) {
ArticleImageAssociation association =
new ArticleImageAssociation(collection.getDataObject());
collection.close();
return association;
}
return null;
}
/**
* This returns true if the image is associated with at least one article.
*/
public static boolean imageHasDirectAssociation
(BigDecimal imageID) {
DataCollection collection = SessionManager.getSession().retrieve
(BASE_DATA_OBJECT_TYPE);
collection.addEqualsFilter(IMAGE_ID, imageID);
// no deleted associations, please
collection.addEqualsFilter(VersionedACSObject.IS_DELETED, new BigDecimal(0));
if (collection.next()) {
collection.close();
return true;
}
return false;
}
/**
* This returns true if the image is associated with at least one article.
*/
public static boolean imageHasAssociation
(BigDecimal imageID) {
try {
ImageAsset asset = (ImageAsset) DomainObjectFactory.newInstance
(new OID(ImageAsset.BASE_DATA_OBJECT_TYPE, imageID));
return asset == null ? false : imageHasAssociation(asset);
} catch (DataObjectNotFoundException e) {
// can't find asset, return false
return false;
}
}
/**
* This returns true if the image is associated with at least one article, checking both liveand draft versions
*/
public static boolean imageHasAssociation
(ImageAsset image) {
Assert.assertNotNull(image);
boolean returnValue = imageHasDirectAssociation(image.getID());
if (!returnValue) {
if (!image.getVersion().equals(ContentItem.DRAFT)) {
ContentItem item = image.getWorkingVersion();
if (item != null)
returnValue = imageHasDirectAssociation(item.getID());
}
}
if (!returnValue) {
if (!image.getVersion().equals(ContentItem.PENDING)) {
ItemCollection pendingVersions = image.getPendingVersions();
while(pendingVersions.next()) {
ContentItem item = pendingVersions.getContentItem();
returnValue = returnValue || imageHasDirectAssociation(item.getID());
}
}
}
if (!returnValue) {
if (!image.getVersion().equals(ContentItem.LIVE)) {
ContentItem item = image.getLiveVersion();
if (item != null)
returnValue = imageHasDirectAssociation(item.getID());
}
}
DataCollection collection = SessionManager.getSession().retrieve
(BASE_DATA_OBJECT_TYPE);
collection.addEqualsFilter(IMAGE_ID, image.getID());
// no deleted associations, please
collection.addEqualsFilter(VersionedACSObject.IS_DELETED, new BigDecimal(0));
if (collection.next()) {
collection.close();
return true;
}
return false;
}
public BigDecimal getArticleID() {
return (BigDecimal) get(ARTICLE_ID);
}
public Article getArticle() {
DataCollection col = SessionManager.getSession().retrieve(ARTICLE);
if (col.next()) {
Article art = new Article(col.getDataObject());
col.close();
return art;
}
return null;
}
public void setArticle(Article article) {
setAssociation(ARTICLE, article);
}
public BigDecimal getImageID() {
return (BigDecimal) get(IMAGE_ID);
}
public ImageAsset getImage() {
return (ImageAsset) DomainObjectFactory.
newInstance((DataObject) get(IMAGE));
}
public void setImage(ImageAsset image) {
setAssociation(IMAGE, image);
}
public String getCaption() {
return (String) get(CAPTION);
}
public void setCaption(String caption) {
set(CAPTION, caption);
}
/**
* Auto-publish the associated ReusableImageAssociation if it is not yet live
*
* @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.
*/
public boolean copyProperty(final CustomCopy source,
final Property property,
final ItemCopier copier) {
String attribute = property.getName();
// don't copy these attributes. they're controlled by explicit associations
if (IMAGE_ID.equals(attribute) || ARTICLE_ID.equals(attribute)) {
return true;
}
if (copier.getCopyType() == ItemCopier.VERSION_COPY
&& IMAGE.equals(attribute)) {
ImageAsset image = ((ArticleImageAssociation)source).getImage();
if (image != null) {
ImageAsset liveImage = (ImageAsset) image.getLiveVersion();
if (liveImage == null) {
liveImage = (ImageAsset) image.createLiveVersion();
}
}
// This method only makes sure that the ReusableImageAsset
// is auto-published. It still returns false so that the
// copier can generate PublishedLink objects appropriately.
return false;
}
return super.copyProperty(source, property, copier);
}
}