org.apache.solr.core.TransientSolrCoreCache.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.solr.core.TransientSolrCoreCache.java

Source

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

import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Observable;
import java.util.Set;

import org.apache.http.annotation.Experimental;

/**
 * The base class for custom transient core maintenance. Any custom plugin that want's to take control of transient
 * caches (i.e. any core defined with transient=true) should override this class.
 *
 * Register your plugin in solr.xml similarly to:
 *
 *   <transientCoreCacheFactory name="transientCoreCacheFactory" class="TransientSolrCoreCacheFactoryDefault">
 *        <int name="transientCacheSize">4</int>
 *   </transientCoreCacheFactory>
 *
 *
 * WARNING: There is quite a bit of higher-level locking done by the CoreContainer to avoid various race conditions
 *          etc. You should _only_ manipulate them within the method calls designed to change them. E.g.
 *          only add to the transient core descriptors in addTransientDescriptor etc.
 *          
 *          Trust the higher-level code (mainly SolrCores and CoreContainer) to call the appropriate operations when
 *          necessary and to coordinate shutting down cores, manipulating the internal structures and the like..
 *          
 *          The only real action you should _initiate_ is to close a core for whatever reason, and do that by 
 *          calling notifyObservers(coreToClose); The observer will call back to removeCore(name) at the appropriate 
 *          time. There is no need to directly remove the core _at that time_ from the transientCores list, a call
 *          will come back to this class when CoreContainer is closing this core.
 *          
 *          CoreDescriptors are read-once. During "core discovery" all valid descriptors are enumerated and added to
 *          the appropriate list. Thereafter, they are NOT re-read from disk. In those situations where you want
 *          to re-define the coreDescriptor, maintain a "side list" of changed core descriptors. Then override
 *          getTransientDescriptor to return your new core descriptor. NOTE: assuming you've already closed the
 *          core, the _next_ time that core is required getTransientDescriptor will be called and if you return the
 *          new core descriptor your re-definition should be honored. You'll have to maintain this list for the
 *          duration of this Solr instance running. If you persist the coreDescriptor, then next time Solr starts
 *          up the new definition will be read.
 *          
 *
 *  If you need to manipulate the return, for instance block a core from being loaded for some period of time, override
 *  say getTransientDescriptor and return null.
 *  
 *  In particular, DO NOT reach into the transientCores structure from a method called to manipulate core descriptors
 *  or vice-versa.
 */
public abstract class TransientSolrCoreCache extends Observable {

    // Gets the core container that encloses this cache.
    public abstract CoreContainer getContainer();

    // Add the newly-opened core to the list of open cores.
    public abstract SolrCore addCore(String name, SolrCore core);

    // Return the names of all possible cores, whether they are currently loaded or not.
    public abstract Set<String> getAllCoreNames();

    // Return the names of all currently loaded cores
    public abstract Set<String> getLoadedCoreNames();

    // Remove a core from the internal structures, presumably it 
    // being closed. If the core is re-opened, it will be readded by CoreContainer.
    public abstract SolrCore removeCore(String name);

    // Get the core associated with the name. Return null if you don't want this core to be used.
    public abstract SolrCore getCore(String name);

    // reutrn true if the cache contains the named core.
    public abstract boolean containsCore(String name);

    // This method will be called when the container is to be shut down. It should return all
    // transient solr cores and clear any internal structures that hold them.
    public abstract Collection<SolrCore> prepareForShutdown();

    // These methods allow the implementation to maintain control over the core descriptors.

    // This method will only be called during core discovery at startup.
    public abstract void addTransientDescriptor(String rawName, CoreDescriptor cd);

    // This method is used when opening cores and the like. If you want to change a core's descriptor, override this
    // method and return the current core descriptor.
    public abstract CoreDescriptor getTransientDescriptor(String name);

    // Remove the core descriptor from your list of transient descriptors.
    public abstract CoreDescriptor removeTransientDescriptor(String name);

    // Find all the names a specific core is mapped to. Should not return null, return empty set instead.
    @Experimental
    public List<String> getNamesForCore(SolrCore core) {
        return Collections.emptyList();
    }

    /**
     * Must be called in order to free resources!
     */
    public abstract void close();

    // These two methods allow custom implementations to communicate arbitrary information as necessary.
    public abstract int getStatus(String coreName);

    public abstract void setStatus(String coreName, int status);
}