/***************************************************************** * 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.cayenne.access; import java.io.Serializable; import java.util.Collection; import java.util.LinkedList; import java.util.List; import org.apache.cayenne.PersistenceState; import org.apache.cayenne.Persistent; import org.apache.cayenne.util.PersistentObjectList; /** * A list that holds objects for to-many relationships. All operations, except for * resolving the list from DB, are not synchronized. The safest way to implement custom * synchronization is to synchronize on parent ObjectStore. */ public class ToManyList extends PersistentObjectList implements Serializable { /** * Creates ToManyList. * * @since 1.1 */ public ToManyList(Persistent source, String relationship) { super(source, relationship); // if source is new, set object list right away if (isTransientParent()) { objectList = new LinkedList(); } } // ==================================================== // Standard List Methods. // ==================================================== @Override public int hashCode() { return 15 + resolvedObjectList().hashCode(); } // ==================================================== // Tracking list modifications, and resolving it // on demand // ==================================================== @Override protected boolean shouldAddToRemovedFromUnresolvedList(Object object) { // No point in adding a new or transient object -- these will never be fetched // from the database. if (object instanceof Persistent) { Persistent dataObject = (Persistent) object; if ((dataObject.getPersistenceState() == PersistenceState.TRANSIENT) || (dataObject.getPersistenceState() == PersistenceState.NEW)) { return false; } } return true; } @Override public String toString() { return getClass().getName() + "@" + System.identityHashCode(this); } @Override protected void postprocessAdd(Collection collection) { // no need for this operation for DataObjects... } @Override protected void postprocessRemove(Collection collection) { // no need for this operation for DataObjects... } @Override protected void postprocessAdd(Object addedObject) { // no need for this operation for DataObjects... } @Override protected void postprocessRemove(Object removedObject) { // no need for this operation for DataObjects... } @Override protected void updateReverse(List resolved) { // no need for this operation for DataObjects... } }