Assoziation PublicationWithPublisher <-> Publisher optimiert (Ticket #1194)

git-svn-id: https://svn.libreccm.org/ccm/trunk@1573 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2012-04-06 13:48:39 +00:00
parent d3749d6919
commit f80728caa4
14 changed files with 321 additions and 45 deletions

View File

@ -29,7 +29,7 @@ object type CollectedVolume extends PublicationWithPublisher {
//Moved to publication Boolean[0..1] reviewed = ct_collected_volume.reviewed BIT;
}
object type CollectedVolumeBundle extends PublicationBundle {
object type CollectedVolumeBundle extends PublicationWithPublisherBundle {
reference key (ct_collected_volume_bundles.bundle_id);
}

View File

@ -33,16 +33,20 @@ object type PublicationWithPublisher extends Publication {
reference key (ct_publication_with_publisher.publication_with_publisher_id);
}
association {
PublicationWithPublisher[0..n] publication = join ct_publisher.publisher_id
to ct_publication_with_publisher_publisher_map.publisher_id,
join ct_publication_with_publisher_publisher_map.publication_id
to ct_publication_with_publisher.publication_with_publisher_id;
object type PublicationWithPublisherBundle extends PublicationBundle {
reference key (ct_publication_with_publisher_bundles.bundle_id);
}
Publisher[0..n] publisher = join ct_publication_with_publisher.publication_with_publisher_id
association {
PublicationWithPublisherBundle[0..n] publication = join ct_publisher_bundles.bundle_id
to ct_publication_with_publisher_publisher_map.publisher_id,
join ct_publication_with_publisher_publisher_map.publication_id
to ct_publication_with_publisher_bundles.bundle_id;
PublisherBundle[0..n] publisher = join ct_publication_with_publisher_bundles.bundle_id
to ct_publication_with_publisher_publisher_map.publication_id,
join ct_publication_with_publisher_publisher_map.publisher_id
to ct_publisher.publisher_id;
to ct_publisher_bundles.bundle_id;
Integer[0..1] publisherOrder = ct_publication_with_publisher_publisher_map.publisher_order INTEGER;
}

View File

@ -32,4 +32,8 @@ object type Publisher extends GenericOrganizationalUnit {
reference key (ct_publisher.publisher_id);
}
object type PublisherBundle extends GenericOrganizationalUnitBundle {
reference key (ct_publisher_bundles.bundle_id);
}

View File

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

View File

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

View File

@ -11,7 +11,7 @@
classname="com.arsdigita.cms.contenttypes.PublicationWithPublisher"
mode="hidden">
<ctd:authoring-kit createComponent="com.arsdigita.cms.contenttypes.ui.PublicationCreate">
<ctd:authoring-kit createComponent="com.arsdigita.cms.contenttypes.ui.PublicationWithPublisherCreate">
<ctd:authoring-step
labelKey="publications.ui.publication_with_publishers_properties.title"

View File

@ -66,7 +66,7 @@ public class PublicationBundle extends ContentBundle {
final ItemCopier copier) {
final String attribute = property.getName();
if (copier.getCopyType() == ItemCopier.VERSION_COPY) {
final Publication pubBundle = (Publication) source;
final PublicationBundle pubBundle = (PublicationBundle) source;
if (AUTHORS.equals(attribute)) {
final DataCollection authors = (DataCollection) pubBundle.get(

View File

@ -83,6 +83,10 @@ public class PublicationWithPublisher extends Publication {
super(type);
}
public PublicationWithPublisherBundle getPublicationWithPublisherBundle() {
return (PublicationWithPublisherBundle) getContentBundle();
}
/**
* Returns the ISBN of the publication.
*
@ -102,7 +106,7 @@ public class PublicationWithPublisher extends Publication {
set(ISBN, isbn);
}
public Integer getVolume() {
public Integer getVolume() {
return (Integer) get(VOLUME);
}
@ -140,21 +144,29 @@ public class PublicationWithPublisher extends Publication {
* @return The publisher of the publication.
*/
public Publisher getPublisher() {
DataCollection collection;
// DataCollection collection;
//
// collection = (DataCollection) get(PUBLISHER);
//
// if (0 == collection.size()) {
// return null;
// } else {
// DataObject dobj;
//
// collection.next();
// dobj = collection.getDataObject();
// collection.close();
//
// return (Publisher) DomainObjectFactory.newInstance(dobj);
// }
collection = (DataCollection) get(PUBLISHER);
return (Publisher) getPublicationWithPublisherBundle().getPublisher().
getPrimaryInstance();
}
if (0 == collection.size()) {
return null;
} else {
DataObject dobj;
collection.next();
dobj = collection.getDataObject();
collection.close();
return (Publisher) DomainObjectFactory.newInstance(dobj);
}
public Publisher getPublisher(final String language) {
return (Publisher) getPublicationWithPublisherBundle().getPublisher().
getInstance(language);
}
/**
@ -163,18 +175,20 @@ public class PublicationWithPublisher extends Publication {
* @param publisher The publisher of the publication.
*/
public void setPublisher(Publisher publisher) {
final Publisher oldPublisher;
// final Publisher oldPublisher;
//
// oldPublisher = getPublisher();
// if (oldPublisher != null) {
// remove(PUBLISHER, oldPublisher);
// }
//
// if (null != publisher) {
// Assert.exists(publisher, Publisher.class);
// DataObject link = add(PUBLISHER, publisher);
// link.set("publisherOrder", 1);
// link.save();
// }
oldPublisher = getPublisher();
if (oldPublisher != null) {
remove(PUBLISHER, oldPublisher);
}
if (null != publisher) {
Assert.exists(publisher, Publisher.class);
DataObject link = add(PUBLISHER, publisher);
link.set("publisherOrder", 1);
link.save();
}
getPublicationWithPublisherBundle().setPublisher(publisher);
}
}

View File

@ -0,0 +1,129 @@
package com.arsdigita.cms.contenttypes;
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 PublicationWithPublisherBundle extends PublicationBundle {
public static final String BASE_DATA_OBJECT_TYPE =
"com.arsdigita.cms.contentttypes.PublicationWithPublisherBundle";
public static final String PUBLISHER = "publisher";
public static final String PUBLISHER_ORDER = "publisherOrder";
public PublicationWithPublisherBundle(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 PublicationWithPublisherBundle(final OID oid)
throws DataObjectNotFoundException {
super(oid);
}
public PublicationWithPublisherBundle(final BigDecimal id)
throws DataObjectNotFoundException {
super(new OID(BASE_DATA_OBJECT_TYPE, id));
}
public PublicationWithPublisherBundle(final DataObject dobj) {
super(dobj);
}
public PublicationWithPublisherBundle(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 PublicationWithPublisherBundle pubBundle = (PublicationWithPublisherBundle) source;
if (PUBLISHER.equals(attribute)) {
final DataCollection publishers = (DataCollection) pubBundle.get(PUBLISHER);
while(publishers.next()) {
createPublisherAssoc(publishers);
}
return true;
} else {
return super.copyProperty(source, property, copier);
}
} else {
return super.copyProperty(source, property, copier);
}
}
private void createPublisherAssoc(final DataCollection publishers) {
final PublisherBundle draftPublisher = (PublisherBundle) DomainObjectFactory.newInstance(
publishers.getDataObject());
final PublisherBundle livePublisher = (PublisherBundle) draftPublisher.getLiveVersion();
if (livePublisher != null) {
final DataObject link = add(PUBLISHER, livePublisher);
link.set(PUBLISHER_ORDER,
publishers.get("link." + PUBLISHER_ORDER));
link.save();
}
}
public PublisherBundle getPublisher() {
final DataCollection collection = (DataCollection) get(PUBLISHER);
if (collection.size() == 0) {
return null;
} else {
final DataObject dobj;
collection.next();
dobj = collection.getDataObject();
collection.close();
return (PublisherBundle) DomainObjectFactory.newInstance(dobj);
}
}
public void setPublisher(final Publisher publisher) {
final PublisherBundle oldPublisher = getPublisher();
if (oldPublisher != null) {
remove(PUBLISHER, oldPublisher);
}
if (publisher != null) {
Assert.exists(publisher, Publisher.class);
final DataObject link = add(PUBLISHER,
publisher.getPublisherBundle());
link.set(PUBLISHER_ORDER, Integer.valueOf(1));
link.save();
}
}
}

View File

@ -58,6 +58,10 @@ public class Publisher extends GenericOrganizationalUnit {
super(type);
}
public PublisherBundle getPublisherBundle() {
return (PublisherBundle) getContentBundle();
}
public String getPublisherName() {
return (String) get(PUBLISHER_NAME);
}

View File

@ -0,0 +1,97 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
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
*/
public class PublisherBundle extends ContentBundle {
public static final String BASE_DATA_OBJECT_TYPE =
"com.arsdigita.cms.contenttypes.PublisherBundle";
public static final String PUBLICATION = "publication";
public PublisherBundle(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 PublisherBundle(final OID oid) throws DataObjectNotFoundException {
super(oid);
}
public PublisherBundle(final BigDecimal id)
throws DataObjectNotFoundException {
super(new OID(BASE_DATA_OBJECT_TYPE, id));
}
public PublisherBundle(final DataObject dobj) {
super(dobj);
}
public PublisherBundle(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 PublisherBundle publisherBundle = (PublisherBundle) source;
if (PUBLICATION.equals(attribute)) {
final DataCollection publications = (DataCollection) publisherBundle.get(PUBLICATION);
while(publications.next()) {
createPublicationAssoc(publications);
}
return true;
} else {
return super.copyProperty(source, property, copier);
}
} else {
return super.copyProperty(source, property, copier);
}
}
private void createPublicationAssoc(final DataCollection publications) {
final PublicationWithPublisherBundle draftPublication = (PublicationWithPublisherBundle) DomainObjectFactory.newInstance(publications.getDataObject());
final PublicationWithPublisherBundle livePublication = (PublicationWithPublisherBundle) draftPublication.getLiveVersion();
if (livePublication != null) {
final DataObject link = add(PUBLICATION, livePublication);
link.set("publisherOrder",
publications.get("link.publisherOrder"));
link.save();
}
}
}

View File

@ -11,7 +11,7 @@ import com.arsdigita.cms.ui.authoring.CreationSelector;
* @author Jens Pelzetter
* @version $Id$
*/
public class CollectedVolumeCreate extends PublicationCreate {
public class CollectedVolumeCreate extends PublicationWithPublisherCreate {
public CollectedVolumeCreate(final ItemSelectionModel itemModel,
final CreationSelector parent) {

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.PublicationBundle;
import com.arsdigita.cms.contenttypes.PublicationWithPublisherBundle;
import com.arsdigita.cms.ui.authoring.CreationSelector;
/**
*
* @author Jens Pelzetter
* @version $Id$
*/
public class PublicationWithPublisherCreate extends PublicationCreate {
public PublicationWithPublisherCreate(final ItemSelectionModel itemModel,
final CreationSelector parent) {
super(itemModel, parent);
}
@Override
public PublicationBundle createBundle(final ContentItem primary) {
return new PublicationWithPublisherBundle(primary);
}
}

View File

@ -17,6 +17,7 @@ import com.arsdigita.cms.Folder;
import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.cms.contenttypes.GenericOrganizationalUnitBundle;
import com.arsdigita.cms.contenttypes.Publisher;
import com.arsdigita.cms.contenttypes.PublisherBundle;
import com.arsdigita.cms.ui.authoring.ApplyWorkflowFormSection;
import com.arsdigita.cms.ui.authoring.CreationSelector;
import com.arsdigita.cms.ui.authoring.LanguageWidget;
@ -94,9 +95,7 @@ public class PublisherCreate extends PageCreate {
item.setLaunchDate((Date) data.get(LAUNCH_DATE));
}
final GenericOrganizationalUnitBundle bundle =
new GenericOrganizationalUnitBundle(
item);
final PublisherBundle bundle = new PublisherBundle(item);
bundle.setParent(folder);
bundle.setContentSection(section);
bundle.save();