DuplicateObjectException beim Publizieren verlinkter Elemente behoben.

git-svn-id: https://svn.libreccm.org/ccm/trunk@585 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2010-10-22 07:31:58 +00:00
parent 9f3d3ffc65
commit c43cdd9616
3 changed files with 45 additions and 25 deletions

View File

@ -272,7 +272,6 @@ public class ContentBundle extends ContentItem {
* @see #addInstance(ContentItem) * @see #addInstance(ContentItem)
*/ */
public final ContentItem getPrimaryInstance() { public final ContentItem getPrimaryInstance() {
System.out.printf("ContentBundle.getPrimaryInstance() for default lang %s\n", getDefaultLanguage());
return getInstance(getDefaultLanguage()); return getInstance(getDefaultLanguage());
} }

View File

@ -34,6 +34,7 @@ import com.arsdigita.persistence.SessionManager;
import com.arsdigita.persistence.metadata.ObjectType; import com.arsdigita.persistence.metadata.ObjectType;
import com.arsdigita.persistence.metadata.Property; import com.arsdigita.persistence.metadata.Property;
import com.arsdigita.util.Assert; import com.arsdigita.util.Assert;
import com.redhat.persistence.DuplicateObjectException;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;

View File

@ -30,6 +30,7 @@ import java.util.Iterator;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.log4j.Logger;
/** /**
* Expands events. Each top level call to Session creates an exapnder and uses * Expands events. Each top level call to Session creates an exapnder and uses
@ -40,6 +41,7 @@ import java.util.Map;
*/ */
class Expander extends Event.Switch { class Expander extends Event.Switch {
private static final Logger s_log = Logger.getLogger(Expander.class);
final private Session m_ssn; final private Session m_ssn;
final private Collection m_deleting = new HashSet(); final private Collection m_deleting = new HashSet();
final private List m_deletes = new LinkedList(); final private List m_deletes = new LinkedList();
@ -54,8 +56,8 @@ class Expander extends Event.Switch {
private void addEvent(Event ev) { private void addEvent(Event ev) {
if (m_pending == null) { if (m_pending == null) {
throw new IllegalStateException throw new IllegalStateException(
("using expander after call to finish"); "using expander after call to finish");
} }
ev.prepare(); ev.prepare();
@ -67,21 +69,26 @@ class Expander extends Event.Switch {
} }
private void addEvents(List l) { private void addEvents(List l) {
for (Iterator it = l.iterator(); it.hasNext(); ) { for (Iterator it = l.iterator(); it.hasNext();) {
addEvent((Event) it.next()); addEvent((Event) it.next());
} }
} }
final void expand(Event ev) { final void expand(Event ev) {
try { try {
Session.trace(ev.getName(), new Object[] { ev }); Session.trace(ev.getName(), new Object[]{ev});
try {
ev.dispatch(this); ev.dispatch(this);
} catch (DuplicateObjectException ex) {
s_log.warn("Duplicate object exception: ", ex);
s_log.warn("This is maybe an error, but not in all cases.");
}
} catch (RuntimeException re) { } catch (RuntimeException re) {
if (re instanceof ProtoException) { if (re instanceof ProtoException) {
ProtoException pe = (ProtoException) re; ProtoException pe = (ProtoException) re;
if (pe.isInternal()) { if (pe.isInternal()) {
throw new UncheckedWrapperException throw new UncheckedWrapperException(
("internal persistence exception", pe); "internal persistence exception", pe);
} else { } else {
pe.setInternal(true); pe.setInternal(true);
} }
@ -126,12 +133,12 @@ class Expander extends Event.Switch {
addEvent(e); addEvent(e);
PropertyMap props = a.getProperties(obj); PropertyMap props = a.getProperties(obj);
for (Iterator it = props.entrySet().iterator(); it.hasNext(); ) { for (Iterator it = props.entrySet().iterator(); it.hasNext();) {
Map.Entry me = (Map.Entry) it.next(); Map.Entry me = (Map.Entry) it.next();
Event ev; Event ev;
try { try {
ev = new SetEvent ev = new SetEvent(m_ssn, obj, (Property) me.getKey(), me.
(m_ssn, obj, (Property) me.getKey(), me.getValue()); getValue());
} catch (TypeException te) { } catch (TypeException te) {
te.setInternal(false); te.setInternal(false);
throw te; throw te;
@ -143,18 +150,22 @@ class Expander extends Event.Switch {
public void onDelete(DeleteEvent e) { public void onDelete(DeleteEvent e) {
final Object obj = e.getObject(); final Object obj = e.getObject();
if (m_ssn.isDeleted(obj) || isBeingDeleted(obj)) { return; } if (m_ssn.isDeleted(obj) || isBeingDeleted(obj)) {
return;
}
beginDelete(obj); beginDelete(obj);
ObjectType type = m_ssn.getObjectType(obj); ObjectType type = m_ssn.getObjectType(obj);
for (Iterator it = type.getRoles().iterator(); it.hasNext(); ) { for (Iterator it = type.getRoles().iterator(); it.hasNext();) {
Role role = (Role) it.next(); Role role = (Role) it.next();
if (role.isCollection()) { clear(obj, role); } if (role.isCollection()) {
clear(obj, role);
}
} }
for (Iterator it = type.getRoles().iterator(); it.hasNext(); ) { for (Iterator it = type.getRoles().iterator(); it.hasNext();) {
Role role = (Role) it.next(); Role role = (Role) it.next();
if (!role.isCollection() && m_ssn.get(obj, role) != null) { if (!role.isCollection() && m_ssn.get(obj, role) != null) {
@ -178,8 +189,12 @@ class Expander extends Event.Switch {
} }
if (role.isReversable()) { if (role.isReversable()) {
if (old != null) { reverseUpdateOld(e, old); } if (old != null) {
if (value != null) { reverseUpdateNew(e); } reverseUpdateOld(e, old);
}
if (value != null) {
reverseUpdateNew(e);
}
} }
addEvent(e); addEvent(e);
@ -193,14 +208,18 @@ class Expander extends Event.Switch {
public void onAdd(AddEvent e) { public void onAdd(AddEvent e) {
Role role = (Role) e.getProperty(); Role role = (Role) e.getProperty();
if (role.isReversable()) { reverseUpdateNew(e); } if (role.isReversable()) {
reverseUpdateNew(e);
}
addEvent(e); addEvent(e);
} }
public void onRemove(RemoveEvent e) { public void onRemove(RemoveEvent e) {
Role role = (Role) e.getProperty(); Role role = (Role) e.getProperty();
if (role.isReversable()) { reverseUpdateOld(e, e.getArgument()); } if (role.isReversable()) {
reverseUpdateOld(e, e.getArgument());
}
addEvent(e); addEvent(e);
@ -233,7 +252,9 @@ class Expander extends Event.Switch {
expand(new DeleteEvent(m_ssn, containee)); expand(new DeleteEvent(m_ssn, containee));
if (me) { undelete(container); } if (me) {
undelete(container);
}
} }
/** /**
@ -309,5 +330,4 @@ class Expander extends Event.Switch {
return m_ssn.getSessionKey(o1).equals(m_ssn.getSessionKey(o2)); return m_ssn.getSessionKey(o1).equals(m_ssn.getSessionKey(o2));
} }
} }
} }