/* * 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.stanbol.entityhub.servicesapi.yard; import org.apache.stanbol.entityhub.servicesapi.mapping.FieldMapper; import org.apache.stanbol.entityhub.servicesapi.model.Representation; import org.apache.stanbol.entityhub.servicesapi.site.Site; /** * The Cache is a mediator between a {@link Yard} storing the cached information * and the {@link Site} acting as access point to a referenced * information source.<p> * This interface provides also access to the configuration of the cache. * This includes meta data needed to decide if requested information can be * retrieved by using the cache or if data need to be requested directly by the * referenced site. This includes mainly cached fields used {@link CacheStrategy} * for fields as well as cached languages. This may be extended in future * versions.<p> * It is important, that the configuration of the cache is stored within the * {@link Yard} together with all the other cached information, because it MUST * BE possible to copy&paste cached information to an other Entityhub instance. This * requirements enables the initialisation of a Cache only based on the * information stored within the cache.<p> * Cache instances should be instantiated automatically by {@link Site}s * based on there configuration. The only parameter needed for the initialisation * of a {@link Cache} is the id of the yard ({@link Yard#getId()}). However * note that the Cache is not responsible to create, configure nor activate the * {@link Yard}. If the {@link Yard} for an cache is not active the cache * returns <code>false</code> on calls to {@link #isAvailable()}. * * @author Rupert Westenthaler * */ public interface Cache extends Yard { /** * Key used to store the id of the Yard used as cache */ String CACHE_YARD = "org.apache.stanbol.entityhub.yard.cacheYardId"; /** * The ID used to store the configuration used for the creation of the cache. * This configuration can only be changed by updating all the cached items. */ String BASE_CONFIGURATION_URI = "urn:org.apache.stanbol:entityhub.yard:cache:config.base"; /** * The ID used to store the configuration used for the creation of * new items in the cache. This configuration is called additional, because * it can only define additional information to be cached. This restriction * is important because the base base configuration is used to determine * if queries can be answered by the cache. So it MUST BE ensured that also * documents updated in the cache confirm to the base configuration. */ String ADDITIONAL_CONFIGURATION_URI = "urn:org.apache.stanbol:entityhub.yard:cache:config.additional"; /** * The field used to store the fieldMappings of a CacheConfiguration */ String FIELD_MAPPING_CONFIG_FIELD = "urn:org.apache.stanbol:entityhub.yard:cache:fieldMappings"; /** * Returns the cache strategy for the given Field.<p> * <ul> * <li>{@link CacheStrategy#all} indicates that this field is cached for all * Representations within the cache. * <li>{@link CacheStrategy#used} indicates that this field is only present * for some Representations within the cache. * <li>{@link CacheStrategy#none} indicates that this field is ignored by * the cache. * </ul> * @param field the field * @return the cache strategy for this field */ CacheStrategy isField(String field); /** * Returns the cache strategy for the given Language<p> * <ul> * <li>{@link CacheStrategy#all} indicates that this language is cached for all * Representations within the cache. * <li>{@link CacheStrategy#used} indicates that this language is only present * for some Representations within the cache. * <li>{@link CacheStrategy#none} indicates that this language is ignored by * the cache. * </ul> * @param lang the language * @return the cache strategy for this language */ CacheStrategy isLanguage(String lang); /** * They key used to configure the cache strategy */ String CACHE_STRATEGY = "org.apache.stanbol.entityhub.yard.cache.strategy"; /** * The strategy used by this Cache.<p> * <li>{@link CacheStrategy#all} indicates that one can assume that this cache * holds at least some data for all Representations of the cached referenced * site. * <li>{@link CacheStrategy#used} indicates that this cache holds only * previously used entities of the referenced site. * <li>{@link CacheStrategy#none} indicates that this cache holds no data * of the ReferencedSite. This value is normally not used by a real cache * implementation. * </ul> * One needs to use {@link #isField(String)} and {@link #isLanguage(String)} * to check how specific fields are treated by the cahce.<p> * e.g. a cache may store dc:titel and dc:author for all documents, but all * other fields only for previously used items. In such cases this method * would return {@link CacheStrategy#all} but a call to * <code>isField("dc:description")</code> would return * {@link CacheStrategy#used}.<p> * This would indicate, that queries for titles and authors could be * executed by using the cache. Queries that also searches for * dc:descriptions would need to be performed directly on the referenced * site. * @return the strategy */ CacheStrategy strategy(); /** * Getter for the state of the Yard configured to store cached information * @return <code>true</code> if the yard used by this cache is available * (active). */ boolean isAvailable(); /** * Key used to configure additional mappings for a cache */ String ADDITIONAL_MAPPINGS = "org.apache.stanbol.entityhub.yard.cache.additionalMappings"; // Design decision: Base Mappings MUST NOT be configurable via OSGI Properties // /** // * Key used to configure the base mappings for a cache // */ // String BASE_MAPPINGS = "org.apache.stanbol.entityhub.yard.cache.baseMappings"; /** * Sets the base mappings to the parsed field mapper and stores the new * configuration to the yard. If the {@link #baseMapper} is <code>null</code> this * method removes any existing configuration from the yard.<p> * <b>NOTE: (Expert Usage only)</b>Take care if using this method! The base * configuration MUST BE in correspondence with the cached data! Typically * this configuration is set by the code that creates a Full-Cache * ({@link CacheStrategy#all}) for an entity source (referenced site) and is * not modified later on. Changes to the base configuration usually requires * all entities in the cache to be updated!<p> * @param fieldMapper the fieldMapper holding the new base field mapping * configuration * @throws YardException on any error while storing the new configuration. * The new configuration is not set if storage is not successful to prevent * an configuration that do not correspond with the cached information in the * yard. */ void setBaseMappings(FieldMapper fieldMapper) throws YardException; /** * Sets the additional field mappings for a cache. This mapping defines * fields that are cached in addition to that defined by the base mapping when * {@link Representation} of entities are stored/updated in the cache.<p> * Changing the additional mappings will only influence documents stored/ * updated in the cache after the change. Already cached documents are not * affected changed. This means, that by changing this configuration a * cache will contain documents written by using different configurations. * To avoid that one needs to delete all documents in the cache.<p> * However changes to this configuration can not affect the base configuration * of the cache, because base mappings cannot be undone by this configuration. * <p> * Note that typically Caches used for {@link Site}s using the * {@link CacheStrategy#used} do not define any base configuration. Also note * that setting the additional mappings to <code>null</code> means:<ul> * <li> using the base configuration if one is present or * <li> storing all data of the parsed Representations if no base configuration * is present. * </ul> * @param fieldMapper the fieldMapper holding the new additional field mapping * configuration * @throws YardException on any error while storing the new configuration. * The new configuration is not set if storage is not successful to prevent * an configuration that do not correspond with the cached information in the * yard. */ void setAdditionalMappings(FieldMapper fieldMapper) throws YardException; /** * Getter for the additional mappings used by this Cache. Modifications on the * returned object do not have any influence on the mappings, because this * method returns a clone. Use {@link #setAdditionalMappings(FieldMapper)} to * change the used additional mappings. However make sure you understand the * implications of changing the base mappings as described in the * documentation of the setter method * @return A clone of the additional mappings or <code>null</code> if no * additional mappings are defined */ FieldMapper getAdditionalMappings(); /** * Getter for the base mappings used by this Cache. Modifications on the * returned object do not have any influence on the mappings, because this * method returns a clone. Use {@link #setBaseMappings(FieldMapper)} to * change the used base mappings. However make sure you understand the * implications of changing the base mappings as described in the * documentation of the setter method * @return A clone of the base mappings or <code>null</code> if no base * mappings are defined */ FieldMapper getBaseMappings(); }