blob: b021b9d65af150ceea5da0c1938ec63266ee94de [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.util;
import java.util.Calendar;
import java.util.Collection;
import java.util.Comparator;
import java.util.Date;
import java.util.Map;
import java.util.TimeZone;
/**
* Manager for copying and proxying second class objects. Second class
* objects are those that are often used as fields of persistent or
* transactional instances, and which can themselves be modified without
* resetting the owning class' field. Because these types can change without
* an explicit call to the owning persistence capable instance, special care
* must be taken to ensure that their state is managed correctly.
* Specifically, they must be copied when saving state for rollback, and they
* must be proxied for any instance whose state is managed by a state manager,
* where proxying involves creating a second class object that automaticlly
* notifies its owning instance whenever it is modified. Generally, this
* factory is only used by the implementation; second class object handling
* is transparent to client code.
*
* @author Abe White
*/
public interface ProxyManager {
/**
* Return a new array of the same component type as the given array
* and containing the same elements. Works for both primitive and
* object array types.
*/
Object copyArray(Object orig);
/**
* Return a copy of the given date with the same information.
*/
Date copyDate(Date orig);
/**
* Return a new date proxy.
*/
Proxy newDateProxy(Class type);
/**
* Return a copy of the given calendar with the same information.
*/
Calendar copyCalendar(Calendar orig);
/**
* Return a new calendar proxy.
*/
Proxy newCalendarProxy(Class type, TimeZone timeZone);
/**
* Return a new collection of the same type as the given one
* with a copy of all contained elements.
*/
Collection copyCollection(Collection orig);
/**
* Return a proxy for the given collection type. The returned collection
* will allow only addition of elements assignable from the given
* element type and will use the given comparator, if it is not null.
*/
Proxy newCollectionProxy(Class type, Class elementType,
Comparator compare, boolean autoOff);
/**
* Return a new map of the same type as the given one
* with a copy of all contained key/value pairs.
*/
Map copyMap(Map orig);
/**
* Return a proxy for the given map type. The returned map will
* allow only addition of keys/values assignable from the given
* keyType/valueType, and will use the given comparator, if it is not null.
*/
Proxy newMapProxy(Class type, Class keyType, Class valueType,
Comparator compare, boolean autoOff);
/**
* Return a copy of the given object with the same information, or null if
* this manager cannot copy the object.
*
* @since 0.2.5
*/
Object copyCustom(Object orig);
/**
* Return a proxy for the given object, or null if this manager cannot
* proxy the object.
*
* @since 0.2.5
*/
Proxy newCustomProxy (Object obj, boolean autoOff);
/**
* Returns whether this proxy manager is enabled for delayed collection
* loading. Delayed collection loading provides the ability to do simple,
* non-indexed add or remove operations on a lazy collection without
* loading the collection. The collection is loaded when necessary, such
* as iteration, indexed operations, isEmpty, or size.
*
* @since 2.2.1
*/
boolean getDelayCollectionLoading();
}