- Journal ist nicht mehr Publication abgeleitet, sondern direkt von ContentPage (Tickets #1061 und #1063)

- Assoziation Journal <-> ArticleInJournal optimiert (Ticket #1116)


git-svn-id: https://svn.libreccm.org/ccm/trunk@1571 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2012-04-06 08:20:24 +00:00
parent 674402d624
commit cec7fb12a2
13 changed files with 462 additions and 79 deletions

View File

@ -13,7 +13,6 @@ import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.parameters.DateParameter;
import com.arsdigita.bebop.parameters.ParameterModel;
import com.arsdigita.bebop.util.GlobalizationUtil;
import com.arsdigita.cms.ContentBundle;
import com.arsdigita.cms.ContentPage;
import com.arsdigita.cms.ContentSection;
import com.arsdigita.cms.ContentType;

View File

@ -31,5 +31,8 @@ object type ArticleInCollectedVolume extends Publication {
reference key (ct_article_in_collected_volume.article_id);
}
object type ArticleInJournalBundle extends PublicationBundle {
reference key (ct_article_in_journal_bundles.bundle_id);
}

View File

@ -20,27 +20,33 @@
model com.arsdigita.cms.contenttypes;
import com.arsdigita.cms.ContentPage;
import com.arsdigita.cms.ContentBundle;
//PDL definition for a journal
object type Journal extends Publication {
object type Journal extends ContentPage {
Integer[0..1] firstYear = ct_journal.firstyear INTEGER;
Integer[0..1] lastYear = ct_journal.lastyear INTEGER;
String[0..1] issn = ct_journal.issn VARCHAR(9);
reference key (ct_journal.journal_id);
}
object type JournalBundle extends ContentBundle {
reference key (ct_journal_bundles.bundle_id);
}
association {
Journal[0..n] journal = join ct_article_in_journal.article_in_journal_id
to ct_journal_article_map.article_in_journal_id,
join ct_journal_article_map.journal_id
to ct_journal.journal_id;
JournalBundle[0..n] journal = join ct_article_in_journal_bundles.bundle_id
to ct_journal_article_map.article_in_journal_id,
join ct_journal_article_map.journal_id
to ct_journal_bundles.bundle_id;
ArticleInJournal[0..n] articles = join ct_journal.journal_id
ArticleInJournalBundle[0..n] articles = join ct_journal_bundles.bundle_id
to ct_journal_article_map.journal_id,
join ct_journal_article_map.article_in_journal_id
to ct_article_in_journal.article_in_journal_id;
to ct_article_in_journal_bundles.bundle_id;
Integer[0..1] articleOrder = ct_journal_article_map.article_order INTEGER;
}

View File

@ -10,7 +10,7 @@
objectType="com.arsdigita.cms.contenttypes.ArticleInJournal"
classname="com.arsdigita.cms.contenttypes.ArticleInJournal">
<ctd:authoring-kit createComponent="com.arsdigita.cms.contenttypes.ui.PublicationCreate">
<ctd:authoring-kit createComponent="com.arsdigita.cms.contenttypes.ui.ArticleInJournalCreate">
<ctd:authoring-step
labelKey="publications.ui.articleInJournal_properties.title"

View File

@ -10,7 +10,7 @@
objectType="com.arsdigita.cms.contenttypes.Journal"
classname="com.arsdigita.cms.contenttypes.Journal">
<ctd:authoring-kit createComponent="com.arsdigita.cms.contenttypes.ui.PublicationCreate">
<ctd:authoring-kit createComponent="com.arsdigita.cms.contenttypes.ui.JournalCreate">
<ctd:authoring-step
labelKey="publications.ui.articleInJournal_properties.title"

View File

@ -31,9 +31,10 @@ import java.util.Date;
/**
*
* @author Jens Pelzetter
* @version $Id$
*/
public class ArticleInJournal extends Publication {
public static final String VOLUME = "volume";
public static final String ISSUE = "issue";
public static final String PAGES_FROM = "pagesFrom";
@ -63,7 +64,11 @@ public class ArticleInJournal extends Publication {
public ArticleInJournal(String type) {
super(type);
}
public ArticleInJournalBundle getArticleInJournalBundle() {
return (ArticleInJournalBundle) getContentBundle();
}
public Integer getVolume() {
return (Integer) get(VOLUME);
}
@ -95,7 +100,7 @@ public class ArticleInJournal extends Publication {
public void setPagesTo(Integer pagesTo) {
set(PAGES_TO, pagesTo);
}
public Date getPublicationDate() {
return (Date) get(PUBLICATION_DATE);
}
@ -104,46 +109,55 @@ public class ArticleInJournal extends Publication {
set(PUBLICATION_DATE, publicationDate);
}
/* public Boolean getReviewed() {
return (Boolean) get(REVIEWED);
}
public void setReviewed(Boolean reviewed) {
set(REVIEWED, reviewed);
}*/
/* public Boolean getReviewed() {
return (Boolean) get(REVIEWED);
}
public void setReviewed(Boolean reviewed) {
set(REVIEWED, reviewed);
}*/
public Journal getJournal() {
DataCollection collection;
// DataCollection collection;
//
// collection = (DataCollection) get(JOURNAL);
//
// if (collection.size() == 0) {
// return null;
// } else {
// DataObject dobj;
//
// collection.next();
// dobj = collection.getDataObject();
// collection.close();
//
// return (Journal) DomainObjectFactory.newInstance(dobj);
// }
collection = (DataCollection) get(JOURNAL);
if (collection.size() == 0) {
return null;
} else {
DataObject dobj;
collection.next();
dobj = collection.getDataObject();
collection.close();
return (Journal) DomainObjectFactory.newInstance(dobj);
}
return (Journal) getArticleInJournalBundle().getJournal().
getPrimaryInstance();
}
public void setJournal(Journal journal) {
Journal oldJournal;
public Journal getJournal(final String language) {
return (Journal) getArticleInJournalBundle().getJournal().getInstance(
language);
}
oldJournal = getJournal();
if (oldJournal != null) {
remove(JOURNAL, oldJournal);
}
if (journal != null) {
Assert.exists(journal, Journal.class);
DataObject link = add(JOURNAL, journal);
link.set(Journal.ARTICLE_ORDER,
Integer.valueOf((int) journal.getArticles().size()));
link.save();
}
}
public void setJournal(final Journal journal) {
// Journal oldJournal;
//
// oldJournal = getJournal();
// if (oldJournal != null) {
// remove(JOURNAL, oldJournal);
// }
//
// if (journal != null) {
// Assert.exists(journal, Journal.class);
// DataObject link = add(JOURNAL, journal);
// link.set(Journal.ARTICLE_ORDER,
// Integer.valueOf((int) journal.getArticles().size()));
// link.save();
// }
getArticleInJournalBundle().setJournal(journal);
}
}

View File

@ -0,0 +1,128 @@
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;
/**
*
* @author Jens Pelzetter
* @version $Id$
*/
public class ArticleInJournalBundle extends PublicationBundle {
public static final String BASE_DATA_OBJECT_TYPE = "com.arsdigita.cms.contentttypes.ArticleInJournalBundle";
public static final String JOURNAL = "JOURNAL";
public ArticleInJournalBundle(final ContentItem primary) {
super(BASE_DATA_OBJECT_TYPE);
Assert.exists(primary, ContentItem.class);
setDefaultLanguage(primary.getLanguage());
setContentType(primary.getContentType());
addInstance(primary);
setName(primary.getName());
}
public ArticleInJournalBundle(final OID oid)
throws DataObjectNotFoundException {
super(oid);
}
public ArticleInJournalBundle(final BigDecimal id)
throws DataObjectNotFoundException {
super(new OID(BASE_DATA_OBJECT_TYPE, id));
}
public ArticleInJournalBundle(final DataObject dobj) {
super(dobj);
}
public ArticleInJournalBundle(final String type) {
super(type);
}
@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 ArticleInJournalBundle articleBundle = (ArticleInJournalBundle) source;
if (JOURNAL.equals(attribute)) {
final DataCollection journals = (DataCollection) articleBundle.get(JOURNAL);
while(journals.next()) {
createJournalAssoc(journals);
}
return true;
} else {
return super.copyProperty(source, property, copier);
}
} else {
return super.copyProperty(source, property, copier);
}
}
private void createJournalAssoc(final DataCollection journals) {
final JournalBundle draftJournal = (JournalBundle) DomainObjectFactory.newInstance(journals.getDataObject());
final JournalBundle liveJournal = (JournalBundle) draftJournal.getLiveVersion();
if (liveJournal != null) {
final DataObject link = add(JOURNAL, liveJournal);
link.set(JournalBundle.ARTICLE_ORDER,
journals.get(ArticleInJournalCollection.LINKORDER));
link.save();
}
}
public JournalBundle getJournal() {
final DataCollection collection = (DataCollection) get(JOURNAL);
if (collection.size() == 0) {
return null;
} else {
final DataObject dobj;
collection.next();
dobj = collection.getDataObject();
collection.close();
return (JournalBundle) DomainObjectFactory.newInstance(dobj);
}
}
public void setJournal(final Journal journal) {
final JournalBundle oldJournal = getJournal();
if (oldJournal != null) {
remove(JOURNAL, oldJournal);
}
if (journal != null) {
Assert.exists(journal, JournalBundle.class);
final DataObject link = add(JOURNAL, journal.getJournalBundle());
link.set(JournalBundle.ARTICLE_ORDER,
Integer.valueOf((int) journal.getArticles().size()));
link.save();
}
}
}

View File

@ -19,6 +19,7 @@
*/
package com.arsdigita.cms.contenttypes;
import com.arsdigita.cms.ContentBundle;
import com.arsdigita.domain.DomainCollection;
import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.persistence.DataCollection;
@ -28,6 +29,7 @@ import org.apache.log4j.Logger;
/**
*
* @author Jens Pelzetter
* @version $Id$
*/
public class ArticleInJournalCollection extends DomainCollection {
@ -150,7 +152,18 @@ public class ArticleInJournalCollection extends DomainCollection {
}
public ArticleInJournal getArticle() {
return (ArticleInJournal) DomainObjectFactory.newInstance(m_dataCollection.
getDataObject());
//return (ArticleInJournal) DomainObjectFactory.newInstance(m_dataCollection.
// getDataObject());
final ContentBundle bundle = (ContentBundle) DomainObjectFactory.
newInstance(m_dataCollection.getDataObject());
return (ArticleInJournal) bundle.getPrimaryInstance();
}
public ArticleInJournal getArticle(final String language) {
final ContentBundle bundle = (ContentBundle) DomainObjectFactory.
newInstance(m_dataCollection.getDataObject());
return (ArticleInJournal) bundle.getInstance(language);
}
}

View File

@ -19,20 +19,21 @@
*/
package com.arsdigita.cms.contenttypes;
import com.arsdigita.cms.ContentPage;
import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.persistence.DataCollection;
import com.arsdigita.persistence.DataObject;
import com.arsdigita.persistence.OID;
import com.arsdigita.util.Assert;
import java.math.BigDecimal;
/**
*
* @author Jens Pelzetter
* @version $Id$
*/
public class Journal extends Publication {
public class Journal extends ContentPage {
public static final String ISSN = "issn";
public static final String FIRST_YEAR = "firstYear";
public static final String LAST_YEAR = "lastYear";
public static final String ARTICLES = "articles";
public static final String ARTICLE_ORDER = "articleOrder";
@ -43,53 +44,70 @@ public class Journal extends Publication {
this(BASE_DATA_OBJECT_TYPE);
}
public Journal(BigDecimal id) throws DataObjectNotFoundException {
public Journal(final BigDecimal id) throws DataObjectNotFoundException {
this(new OID(BASE_DATA_OBJECT_TYPE, id));
}
public Journal(OID oid) throws DataObjectNotFoundException {
public Journal(final OID oid) throws DataObjectNotFoundException {
super(oid);
}
public Journal(DataObject dobj) {
public Journal(final DataObject dobj) {
super(dobj);
}
public Journal(String type) {
public Journal(final String type) {
super(type);
}
public JournalBundle getJournalBundle() {
return (JournalBundle) getContentBundle();
}
public String getISSN() {
return (String) get(ISSN);
}
public void setISSN(String issn) {
public void setISSN(final String issn) {
set(ISSN, issn);
}
public Integer getFirstYear() {
return (Integer) get(FIRST_YEAR);
}
public void setFirstYear(final Integer firstYear) {
set(FIRST_YEAR, firstYear);
}
public Integer getLastYear() {
return (Integer) get(LAST_YEAR);
}
public void setLastYear(Integer lastYear) {
public void setLastYear(final Integer lastYear) {
set(LAST_YEAR, lastYear);
}
public ArticleInJournalCollection getArticles() {
return new ArticleInJournalCollection((DataCollection) get(ARTICLES));
//return new ArticleInJournalCollection((DataCollection) get(ARTICLES));
return getJournalBundle().getArticles();
}
public void addArticle(ArticleInJournal article) {
Assert.exists(article, ArticleInJournal.class);
public void addArticle(final ArticleInJournal article) {
//Assert.exists(article, ArticleInJournal.class);
DataObject link = add(ARTICLES, article);
//DataObject link = add(ARTICLES, article);
link.set(ARTICLE_ORDER, Integer.valueOf((int) getArticles().size()));
//link.set(ARTICLE_ORDER, Integer.valueOf((int) getArticles().size()));
getJournalBundle().addArticle(article);
}
public void removeArticle(ArticleInJournal article) {
Assert.exists(article, ArticleInCollectedVolume.class);
remove(ARTICLES, article);
//Assert.exists(article, ArticleInCollectedVolume.class);
//remove(ARTICLES, article);
getJournalBundle().removeArticle(article);
}
public boolean hasArticles() {

View File

@ -0,0 +1,118 @@
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;
/**
*
* @author Jens Pelzetter
* @version $Id$
*/
public class JournalBundle extends ContentBundle {
public static final String BASE_DATA_OBJECT_TYPE =
"com.arsdigita.cms.contenttypes.JournalBundle";
public static final String ARTICLES = "articles";
public static final String ARTICLE_ORDER = "articleOrder";
public JournalBundle(final ContentItem primary) {
super(BASE_DATA_OBJECT_TYPE);
Assert.exists(primary, ContentItem.class);
setDefaultLanguage(primary.getLanguage());
setContentType(primary.getContentType());
addInstance(primary);
setName(primary.getName());
}
public JournalBundle(final OID oid) throws DataObjectNotFoundException {
super(oid);
}
public JournalBundle(final BigDecimal id)
throws DataObjectNotFoundException {
super(new OID(BASE_DATA_OBJECT_TYPE, id));
}
public JournalBundle(final DataObject dobj) {
super(dobj);
}
public JournalBundle(final String type) {
super(type);
}
@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 JournalBundle journalBundle = (JournalBundle) source;
if (ARTICLES.equals(attribute)) {
final DataCollection articles = (DataCollection) journalBundle.
get(ARTICLES);
while (articles.next()) {
createArticleAssoc(articles);
}
return true;
} else {
return super.copyProperty(source, property, copier);
}
} else {
return super.copyProperty(source, property, copier);
}
}
private void createArticleAssoc(final DataCollection articles) {
final ArticleInJournalBundle draftArticle =
(ArticleInJournalBundle) DomainObjectFactory.
newInstance(articles.getDataObject());
final ArticleInJournalBundle liveArticle =
(ArticleInJournalBundle) draftArticle.
getLiveVersion();
if (liveArticle != null) {
final DataObject link = add(ARTICLES, liveArticle);
link.set(ARTICLE_ORDER, articles.get(
ArticleInJournalCollection.LINKORDER));
link.save();
}
}
public ArticleInJournalCollection getArticles() {
return new ArticleInJournalCollection((DataCollection) get(ARTICLES));
}
public void addArticle(final ArticleInJournal article) {
Assert.exists(article, ArticleInJournal.class);
final DataObject link = add(ARTICLES,
article.getArticleInJournalBundle());
link.set(ARTICLE_ORDER, Integer.valueOf((int) getArticles().size()));
}
public void removeArticle(final ArticleInJournal article) {
Assert.exists(article, ArticleInJournal.class);
remove(ARTICLES, article.getArticleInJournalBundle());
}
}

View File

@ -0,0 +1,25 @@
package com.arsdigita.cms.contenttypes.ui;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.cms.contenttypes.ArticleInJournalBundle;
import com.arsdigita.cms.contenttypes.PublicationBundle;
import com.arsdigita.cms.ui.authoring.CreationSelector;
/**
*
* @author Jens Pelzetter
* @version $Id$
*/
public class ArticleInJournalCreate extends PublicationCreate {
public ArticleInJournalCreate(final ItemSelectionModel itemModel,
final CreationSelector parent) {
super(itemModel, parent);
}
@Override
protected PublicationBundle createBundle(final ContentItem primary) {
return new ArticleInJournalBundle(primary);
}
}

View File

@ -0,0 +1,57 @@
package com.arsdigita.cms.contenttypes.ui;
import com.arsdigita.bebop.FormData;
import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.FormSection;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.ContentPage;
import com.arsdigita.cms.ContentSection;
import com.arsdigita.cms.Folder;
import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.cms.contenttypes.JournalBundle;
import com.arsdigita.cms.ui.authoring.CreationSelector;
import com.arsdigita.cms.ui.authoring.PageCreate;
import java.util.Date;
/**
*
* @author Jens Pelzetter
* @version $Id$
*/
public class JournalCreate extends PageCreate {
public JournalCreate(final ItemSelectionModel itemModel,
final CreationSelector parent) {
super(itemModel, parent);
}
@Override
public void process(final FormSectionEvent fse) throws FormProcessException {
final FormData data = fse.getFormData();
final PageState state = fse.getPageState();
final ContentSection section = m_parent.getContentSection(state);
final Folder folder = m_parent.getFolder(state);
final ContentPage item = createContentPage(state);
item.setLanguage((String) data.get(LANGUAGE));
item.setName((String) data.get(NAME));
if (!ContentSection.getConfig().getHideLaunchDate()) {
item.setLaunchDate((Date) data.get(LAUNCH_DATE));
}
final JournalBundle bundle = createBundle(item);
bundle.setParent(folder);
bundle.setContentSection(section);
bundle.save();
m_workflowSection.applyWorkflow(state, item);
m_parent.editItem(state, item);
}
protected JournalBundle createBundle(final ContentItem primary) {
return new JournalBundle(primary);
}
}

View File

@ -86,9 +86,9 @@ public class PublicationXmlHelper {
generateInternetArticleXml(publicationElem);
}
if (publication instanceof Journal) {
/*if (publication instanceof Journal) {
generateJournalXml(publicationElem);
}
}*/
if (publication instanceof Monograph) {
generateMonographXml(publicationElem);
@ -294,15 +294,17 @@ public class PublicationXmlHelper {
}
private void generateJournalLinkXml(final Element publicationElem,
ArticleInJournal article) {
Journal journal = article.getJournal();
final ArticleInJournal article) {
final Journal journal = article.getJournal();
if (journal != null) {
Element journalElem = publicationElem.newChildElement("journal");
PublicationXmlHelper xmlHelper = new PublicationXmlHelper(
journalElem,
journal);
xmlHelper.generateXml(false);
final Element journalElem = publicationElem.newChildElement("journal");
//PublicationXmlHelper xmlHelper = new PublicationXmlHelper(
// journalElem,
// journal);
//xmlHelper.generateXml(false);
final Element nameElem = journalElem.newChildElement("name");
nameElem.setText(journal.getTitle());
}
}
@ -371,12 +373,12 @@ public class PublicationXmlHelper {
}
private void generateJournalXml(final Element publicationElem) {
/*private void generateJournalXml(final Element publicationElem) {
final Journal journal = (Journal) publication;
generateXmlElement(publicationElem, "lastYear", journal.getLastYear());
generateXmlElement(publicationElem, "issn", journal.getISSN());
}
}*/
private void generateMonographXml(final Element publicationElem) {
final Monograph monograph = (Monograph) publication;