blob: 5036e44f836f259ed629e10402443c4ca90586dd [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openjpa.event;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Collection;
import java.util.Collections;
import org.apache.openjpa.lib.util.Localizer;
import org.apache.openjpa.util.UserException;
/**
* Event type to hold the IDs of additions, updates, and
* deletes. This event type is also fully serializable for remote communication.
*
* @since 0.3.0
* @author Patrick Linskey
* @author Abe White
*/
public class RemoteCommitEvent
implements Externalizable {
/**
* Names of added classes, updated and deleted Object IDs.
*/
public static final int PAYLOAD_OIDS = 0;
/**
* Names of added classes, added, updated and deleted Object IDs.
*/
public static final int PAYLOAD_OIDS_WITH_ADDS = 1;
/**
* Names of added, updated, and deleted classes only.
*/
public static final int PAYLOAD_EXTENTS = 2;
/**
* The local {@link BrokerFactory} detected that local data is out of date
* with the data store. Stale object IDs will be in t he updated set,
* although it is possible that records were actually deleted, rather than
* updated.
*
* @since 1.0.0
*/
public static final int PAYLOAD_LOCAL_STALE_DETECTION = 3;
private static final Localizer s_loc = Localizer.forPackage
(RemoteCommitEvent.class);
private int _payload = PAYLOAD_OIDS;
private Collection _addIds = null;
private Collection _addClasses = null;
private Collection _updates = null;
private Collection _deletes = null;
/**
* Constructor used during externalization.
*/
public RemoteCommitEvent() {
}
/**
* Constructor. All collections will be proxied with unmodifiable views.
*
* @param payloadType PAYLOAD constant for type of data in this event
* @param addIds set of object IDs for added instances, or null
* @param addClasses set of class names for added instances
* @param updates set of class names or object IDs for updated instances
* @param deletes set of class names or object IDs for deleted instances
*/
public RemoteCommitEvent(int payloadType, Collection addIds,
Collection addClasses, Collection updates, Collection deletes) {
_payload = payloadType;
if (addIds != null)
_addIds = Collections.unmodifiableCollection(addIds);
if (addClasses != null)
_addClasses = Collections.unmodifiableCollection(addClasses);
if (updates != null)
_updates = Collections.unmodifiableCollection(updates);
if (deletes != null)
_deletes = Collections.unmodifiableCollection(deletes);
}
/**
* The event PAYLOAD constant.
*/
public int getPayloadType() {
return _payload;
}
/**
* When the event type is PAYLOAD_OIDS_WITH_ADDS, return the set of
* object IDs for added objects. This will only be callable when the
* backward compatability property transmitAddObjectIds is true.
*/
public Collection getPersistedObjectIds() {
if (_payload != PAYLOAD_OIDS_WITH_ADDS) {
if (_payload == PAYLOAD_OIDS)
throw new UserException(s_loc.get("no-added-oids"));
throw new UserException(s_loc.get("extent-only-event"));
}
return (_addIds == null) ? Collections.EMPTY_LIST : _addIds;
}
/**
* When the event type is not PAYLOAD_EXTENTS, return the set of
* object IDs for updated objects. When the event type is
* PAYLOAD_LOCAL_STALE_DETECTION, items in this list may actually have
* been deleted from the database.
*/
public Collection getUpdatedObjectIds() {
if (_payload == PAYLOAD_EXTENTS)
throw new UserException(s_loc.get("extent-only-event"));
return (_updates == null) ? Collections.EMPTY_LIST : _updates;
}
/**
* When the event type is not PAYLOAD_EXTENTS, return the set of
* object IDs for deleted objects.
*/
public Collection getDeletedObjectIds() {
if (_payload == PAYLOAD_EXTENTS)
throw new UserException(s_loc.get("extent-only-event"));
return (_deletes == null) ? Collections.EMPTY_LIST : _deletes;
}
/**
* For all event types, return the set of class names for
* the classes of inserted objects.
*/
public Collection getPersistedTypeNames() {
return (_addClasses == null) ? Collections.EMPTY_LIST : _addClasses;
}
/**
* When the event type is PAYLOAD_EXTENTS, return the set of class
* names for the classes of updated objects.
*/
public Collection getUpdatedTypeNames() {
if (_payload != PAYLOAD_EXTENTS)
throw new UserException(s_loc.get("nonextent-event"));
return (_updates == null) ? Collections.EMPTY_LIST : _updates;
}
/**
* When the event type is PAYLOAD_EXTENTS, return the set of class
* names for the classes of deleted objects.
*/
public Collection getDeletedTypeNames() {
if (_payload != PAYLOAD_EXTENTS)
throw new UserException(s_loc.get("nonextent-event"));
return (_deletes == null) ? Collections.EMPTY_LIST : _deletes;
}
public void writeExternal(ObjectOutput out)
throws IOException {
out.writeInt(_payload);
out.writeObject(_addClasses);
if (_payload == PAYLOAD_OIDS_WITH_ADDS)
out.writeObject(_addIds);
out.writeObject(_updates);
out.writeObject(_deletes);
}
public void readExternal(ObjectInput in)
throws IOException {
try {
_payload = in.readInt();
_addClasses = (Collection) in.readObject();
if (_payload == PAYLOAD_OIDS_WITH_ADDS)
_addIds = (Collection) in.readObject();
_updates = (Collection) in.readObject();
_deletes = (Collection) in.readObject();
} catch (ClassNotFoundException cnfe) {
// ### do something
}
}
}