DuplicateObjectException beim Publizieren verlinkter Elemente behoben.
git-svn-id: https://svn.libreccm.org/ccm/trunk@585 8810af33-2d31-482b-a856-94f89814c4dfmaster
parent
9f3d3ffc65
commit
c43cdd9616
|
|
@ -271,8 +271,7 @@ public class ContentBundle extends ContentItem {
|
||||||
* the primary instance
|
* the primary instance
|
||||||
* @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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
@ -264,8 +265,8 @@ class PublishedLink extends DomainObject {
|
||||||
Property prop = ot.getProperty(propertyName);
|
Property prop = ot.getProperty(propertyName);
|
||||||
Assert.exists(prop, propertyName + " for type " + ot.getQualifiedName() + ", ID: " + src.get("id"));
|
Assert.exists(prop, propertyName + " for type " + ot.getQualifiedName() + ", ID: " + src.get("id"));
|
||||||
if (prop.isCollection()) {
|
if (prop.isCollection()) {
|
||||||
DataAssociation da = (DataAssociation) src.get(propertyName);
|
DataAssociation da = (DataAssociation) src.get(propertyName);
|
||||||
da.add(target);
|
da.add(target);
|
||||||
} else {
|
} else {
|
||||||
src.set(propertyName,target);
|
src.set(propertyName,target);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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});
|
||||||
ev.dispatch(this);
|
try {
|
||||||
|
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);
|
||||||
|
|
||||||
|
|
@ -212,7 +231,7 @@ class Expander extends Event.Switch {
|
||||||
// also called by session
|
// also called by session
|
||||||
private void clear(Object obj, Property prop) {
|
private void clear(Object obj, Property prop) {
|
||||||
PersistentCollection pc =
|
PersistentCollection pc =
|
||||||
(PersistentCollection) m_ssn.get(obj, prop);
|
(PersistentCollection) m_ssn.get(obj, prop);
|
||||||
Cursor c = pc.getDataSet().getCursor();
|
Cursor c = pc.getDataSet().getCursor();
|
||||||
while (c.next()) {
|
while (c.next()) {
|
||||||
expand(new RemoveEvent(m_ssn, obj, prop, c.get()));
|
expand(new RemoveEvent(m_ssn, obj, prop, c.get()));
|
||||||
|
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue