SciPublicationsAbout asset: It is now possible to filter a list of publications for discussed and discussing publications

git-svn-id: https://svn.libreccm.org/ccm/trunk@2618 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2014-04-18 08:30:49 +00:00
parent 993b73d5de
commit 3933c21e6d
6 changed files with 182 additions and 13 deletions

View File

@ -20,7 +20,8 @@
model com.arsdigita.cms.contentassets; model com.arsdigita.cms.contentassets;
import com.arsdigita.cms.contenttypes.PublicationBundle; import com.arsdigita.cms.contenttypes.PublicationBundle;
import com.arsdigita.kernel.ACSObjects; import com.arsdigita.kernel.ACSObject;
import com.arsdigita.cms.ContentItem;
association { association {
@ -36,3 +37,20 @@ association {
Integer[0..1] publicationsOrder = ca_publications_about.publications_order INTEGER; Integer[0..1] publicationsOrder = ca_publications_about.publications_order INTEGER;
} }
object type SciPublicationsAbout extends ACSObject {
String[0..1] discusses = ca_publications_about_asset.discusses;
String[0..1] discussedBy = ca_publications_about_asset.discussed_by;
reference key ( ca_publications_about_asset.about_id);
}
association {
composite ContentItem[1..1] owner = join ca_publications_about_asset.owner_id
to cms_items.item_id;
component SciPublicationsAbout[0..1] publicationsAbout = join cms_items.item_id
to ca_publications_about_asset.owner_id;
}

View File

@ -0,0 +1,117 @@
/*
* Copyright (c) 2010 Jens Pelzetter
*
* 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.contentassets;
import com.arsdigita.cms.ItemCollection;
import com.arsdigita.cms.contenttypes.Publication;
import com.arsdigita.cms.contenttypes.PublicationBundle;
import com.arsdigita.kernel.ACSObject;
import com.arsdigita.persistence.DataObject;
/**
*
* @author Jens Pelzetter <jens@jp-digital.de>
* @version $Id$
*/
public class SciPublicationsAbout extends ACSObject {
public static final String BASE_DATA_OBJECT_TYPE
= "com.arsdigita.cms.contentassets.SciPublicationsAbout";
public static final String DISCUSSES = "discusses";
public static final String DISCUSSED_BY = "discussedBy";
public static final String OWNER = "owner";
public SciPublicationsAbout() {
super(BASE_DATA_OBJECT_TYPE);
}
public SciPublicationsAbout(final String type) {
super(type);
}
public SciPublicationsAbout(final DataObject dataObject) {
super(dataObject);
}
public static SciPublicationsAbout create(final Publication owner) {
final PublicationBundle ownerBundle = owner.getPublicationBundle();
final ItemCollection instances = ownerBundle.getInstances();
Publication instance;
while (instances.next()) {
instance = (Publication) instances.getContentItem();
createForInstance(instance);
}
return new SciPublicationsAbout((DataObject) owner.get(PUBLICATIONS_ABOUT));
}
public static final String PUBLICATIONS_ABOUT = "publicationsAbout";
private static void createForInstance(final Publication instance) {
final SciPublicationsAbout about = new SciPublicationsAbout();
about.set("owner", instance);
about.update();
about.save();
}
public String getDiscussedPublications() {
return (String) get(DISCUSSES);
}
public String getDiscussingPublications() {
return (String) get(DISCUSSED_BY);
}
protected void update() {
final Publication owner = new Publication((DataObject) get(OWNER));
final SciPublicationsAboutService service = new SciPublicationsAboutService();
final PublicationCollection discussedPublications = service.getDiscussedPublications(owner);
final StringBuilder discussedBuilder = new StringBuilder();
while (discussedPublications.next()) {
discussedBuilder.append(discussedPublications.getPublication().getTitle());
discussedBuilder.append(';');
}
final PublicationCollection discussingPublications = service.
getDiscussingPublications(owner);
final StringBuilder discussingBuilder = new StringBuilder();
while (discussingPublications.next()) {
discussingBuilder.append(discussingPublications.getPublication().getTitle());
discussingBuilder.append(';');
}
final PublicationBundle bundle = owner.getPublicationBundle();
final ItemCollection instances = bundle.getInstances();
Publication instance;
SciPublicationsAbout about;
while(instances.next()) {
instance = (Publication) instances.getContentItem();
about = new SciPublicationsAbout((DataObject) instance.get(PUBLICATIONS_ABOUT));
about.set(DISCUSSES, discussedBuilder.toString());
about.set(DISCUSSED_BY, discussingBuilder.toString());
}
}
}

View File

@ -26,9 +26,13 @@ import com.arsdigita.cms.contenttypes.Publication;
import com.arsdigita.cms.contenttypes.ui.PublicationExtraXmlGenerator; import com.arsdigita.cms.contenttypes.ui.PublicationExtraXmlGenerator;
import com.arsdigita.cms.ui.authoring.AuthoringKitWizard; import com.arsdigita.cms.ui.authoring.AuthoringKitWizard;
import com.arsdigita.db.DbHelper; import com.arsdigita.db.DbHelper;
import com.arsdigita.domain.DomainObject;
import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.domain.DomainObjectInstantiator;
import com.arsdigita.domain.DomainObjectTraversalAdapter; import com.arsdigita.domain.DomainObjectTraversalAdapter;
import com.arsdigita.domain.xml.TraversalHandler; import com.arsdigita.domain.xml.TraversalHandler;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.persistence.DataObject;
import com.arsdigita.persistence.pdl.ManifestSource; import com.arsdigita.persistence.pdl.ManifestSource;
import com.arsdigita.persistence.pdl.NameFilter; import com.arsdigita.persistence.pdl.NameFilter;
import com.arsdigita.runtime.CompoundInitializer; import com.arsdigita.runtime.CompoundInitializer;
@ -58,6 +62,15 @@ public class SciPublicationsAboutInitializer extends CompoundInitializer {
super.init(event); super.init(event);
DomainObjectFactory.registerInstantiator(SciPublicationsAbout.BASE_DATA_OBJECT_TYPE,
new DomainObjectInstantiator() {
@Override
protected DomainObject doNewInstance(final DataObject dataObject) {
return new SciPublicationsAbout(dataObject);
}
});
final String traversal = "/WEB-INF/traversal-adapters/com/arsdigita/cms/contentassets/" final String traversal = "/WEB-INF/traversal-adapters/com/arsdigita/cms/contentassets/"
+ "SciPublicationsAbout.xml"; + "SciPublicationsAbout.xml";
XML.parseResource(traversal, new TraversalHandler() { XML.parseResource(traversal, new TraversalHandler() {

View File

@ -21,6 +21,7 @@ package com.arsdigita.cms.contentassets;
import com.arsdigita.cms.contenttypes.Publication; import com.arsdigita.cms.contenttypes.Publication;
import com.arsdigita.cms.contenttypes.PublicationBundle; import com.arsdigita.cms.contenttypes.PublicationBundle;
import com.arsdigita.persistence.DataCollection; import com.arsdigita.persistence.DataCollection;
import com.arsdigita.persistence.DataObject;
/** /**
* This class provides some convenient methods for dealing with the About asset/mixin. * This class provides some convenient methods for dealing with the About asset/mixin.
@ -32,6 +33,7 @@ public class SciPublicationsAboutService {
public static final String DISCUSSED_BY = "discussedBy"; public static final String DISCUSSED_BY = "discussedBy";
public static final String DISCUSSING = "discusses"; public static final String DISCUSSING = "discusses";
private static final String PUBLICATIONS_ABOUT = "publicationsAbout";
/** /**
* Get all publications which are discussed by the provided publication. * Get all publications which are discussed by the provided publication.
@ -59,6 +61,23 @@ public class SciPublicationsAboutService {
final PublicationBundle discussedBundle = discussed.getPublicationBundle(); final PublicationBundle discussedBundle = discussed.getPublicationBundle();
discussingBundle.add(DISCUSSING, discussedBundle); discussingBundle.add(DISCUSSING, discussedBundle);
final DataObject discussingAboutDobj = (DataObject) discussing.get(PUBLICATIONS_ABOUT);
if (discussingAboutDobj == null) {
SciPublicationsAbout.create(discussing);
} else {
final SciPublicationsAbout discussingAbout = new SciPublicationsAbout(
discussingAboutDobj);
discussingAbout.update();
}
final DataObject discussedAboutDobj = (DataObject) discussed.get(PUBLICATIONS_ABOUT);
if (discussedAboutDobj == null) {
SciPublicationsAbout.create(discussed);
} else {
final SciPublicationsAbout discussedAbout = new SciPublicationsAbout(discussedAboutDobj);
discussedAbout.update();
}
} }
/** /**
@ -79,6 +98,7 @@ public class SciPublicationsAboutService {
* Retrieves all publications which are discussing the provided publication. * Retrieves all publications which are discussing the provided publication.
* *
* @param discussed * @param discussed
*
* @return * @return
*/ */
public PublicationCollection getDiscussingPublications(final Publication discussed) { public PublicationCollection getDiscussingPublications(final Publication discussed) {
@ -104,4 +124,5 @@ public class SciPublicationsAboutService {
discussedBundle.remove(DISCUSSED_BY, discussingBundle); discussedBundle.remove(DISCUSSED_BY, discussingBundle);
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2010 Jens Pelzetter * Copyright (c) 2014 Jens Pelzetter
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License * modify it under the terms of the GNU Lesser General Public License

View File

@ -307,7 +307,7 @@
<ul> <ul>
<xsl:for-each select="./volumes/publication"> <xsl:for-each select="./volumes/publication">
<xsl:sort select="./@volume" data-type="number" order="descending"/> <xsl:sort select="./@volumeNr" data-type="number" order="descending"/>
<xsl:sort select="./yearOfPublication" data-type="number" order="descending"/> <xsl:sort select="./yearOfPublication" data-type="number" order="descending"/>
<xsl:sort select="./title" data-type="text"/> <xsl:sort select="./title" data-type="text"/>
<li> <li>