/* * 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 } } }