/*
 * 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.conf;


import org.apache.openjpa.lib.conf.Configurable;
import org.apache.openjpa.lib.conf.Configuration;

/**
 * Responsible for marshalling and unmarshalling objects between memory and
 * durable cache.
 *
 * @since 1.1.0
 */
public interface CacheMarshaller {

    /**
     * Load and return an instance of the type handled by this marshaller.
     * If the type implements {@link Configurable}, then this method will invoke
     * {@link Configurable#setConfiguration}, 
     * {@link Configurable#startConfiguration()}, and
     * {@link Configurable#endConfiguration()} on the instance before returning.
     */
    public Object load();

    /**
     * Store <code>o</code> into the cache.
     */
    public void store(Object o);

    /**
     * The id that this marshaller is responsible for.
     * A value for this parameter is required.
     */
    public void setId(String id);

    /**
     * The id that this marshaller is responsible for.
     */
    public String getId();

    /**
     * The {@link ValidationPolicy} that this marshaller should use.
     * A value for this parameter is required. The class will be instantiated
     * via the {@link org.apache.openjpa.lib.conf.Configurations} mechanism, ensuring that if the class
     * implements {@link Configurable} or {@link org.apache.openjpa.lib.conf.GenericConfigurable}, it will
     * be taken through the appropriate lifecycle.
     */
    public void setValidationPolicy(String policy)
        throws InstantiationException, IllegalAccessException;

    /**
     * Validation policies are responsible for computing whether or not a
     * cached data structure is valid for the current context.
     * <p/>
     * <code>getValidCachedData(getCacheableData(o), conf)</code> should
     * return an object equivalent to <code>o</code> in the expected case.
     * <p/>
     * Implementations of this class will often also implement
     * {@link Configurable} in order to receive the current
     * {@link Configuration}.
     */
    public interface ValidationPolicy {
        /**
         * Returns an object that this policy considers to be valid, based
         * on <code>o</code>. If <code>o</code> is not valid, this method
         * will return <code>null</code>.
         */
        public Object getValidData(Object o);

        /**
         * Return an object that the {@link CacheMarshaller} should store.
         */
        public Object getCacheableData(Object o);
    }
}