/** * 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.handler.admin; import org.apache.lucene.index.IndexReader; import org.apache.lucene.util.IOUtils; import org.apache.solr.common.SolrException; import org.apache.solr.common.params.CoreAdminParams; import org.apache.solr.common.params.CoreAdminParams.CoreAdminAction; import org.apache.solr.common.params.SolrParams; import org.apache.solr.common.params.UpdateParams; import org.apache.solr.common.util.NamedList; import org.apache.solr.common.util.SimpleOrderedMap; import org.apache.solr.core.*; import org.apache.solr.handler.RequestHandlerBase; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.request.LocalSolrQueryRequest; import org.apache.solr.response.SolrQueryResponse; import org.apache.solr.search.SolrIndexSearcher; import org.apache.solr.util.RefCounted; import org.apache.solr.util.SolrPluginUtils; import org.apache.solr.update.MergeIndexesCommand; import org.apache.solr.update.UpdateHandler; import org.apache.solr.update.processor.UpdateRequestProcessor; import org.apache.solr.update.processor.UpdateRequestProcessorChain; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; import java.util.Date; import java.util.Iterator; import java.util.Properties; /** * @version $Id: CoreAdminHandler.java 1171306 2011-09-15 22:43:33Z janhoy $ * @since solr 1.3 */ public class CoreAdminHandler{ } // //public class CoreAdminHandler extends RequestHandlerBase { // protected static Logger log = LoggerFactory.getLogger(CoreAdminHandler.class); // protected final CoreContainer coreContainer; // // public CoreAdminHandler() { // super(); // // Unlike most request handlers, CoreContainer initialization // // should happen in the constructor... // this.coreContainer = null; // } // // // /** // * Overloaded ctor to inject CoreContainer into the handler. // * // * @param coreContainer Core Container of the solr webapp installed. // */ // public CoreAdminHandler(final CoreContainer coreContainer) { // this.coreContainer = coreContainer; // } // // // @Override // final public void init(NamedList args) { // throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, // "CoreAdminHandler should not be configured in solrconf.xml\n" + // "it is a special Handler configured directly by the RequestDispatcher"); // } // // /** // * The instance of CoreContainer this handler handles. This should be the CoreContainer instance that created this // * handler. // * // * @return a CoreContainer instance // */ // public CoreContainer getCoreContainer() { // return this.coreContainer; // } // // @Override // public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception { // // Make sure the cores is enabled // CoreContainer cores = getCoreContainer(); // if (cores == null) { // throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, // "Core container instance missing"); // } // boolean doPersist = false; // // // Pick the action // SolrParams params = req.getParams(); // CoreAdminAction action = CoreAdminAction.STATUS; // String a = params.get(CoreAdminParams.ACTION); // if (a != null) { // action = CoreAdminAction.get(a); // if (action == null) { // doPersist = this.handleCustomAction(req, rsp); // } // } // if (action != null) { // switch (action) { // case CREATE: { // doPersist = this.handleCreateAction(req, rsp); // break; // } // // case RENAME: { // doPersist = this.handleRenameAction(req, rsp); // break; // } // // case ALIAS: { // throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "'ALIAS' is not supported " + // req.getParams().get(CoreAdminParams.ACTION)); // } // // case UNLOAD: { // doPersist = this.handleUnloadAction(req, rsp); // break; // } // // case STATUS: { // doPersist = this.handleStatusAction(req, rsp); // break; // // } // // case PERSIST: { // doPersist = this.handlePersistAction(req, rsp); // break; // } // // case RELOAD: { // doPersist = this.handleReloadAction(req, rsp); // break; // } // // case SWAP: { // doPersist = this.handleSwapAction(req, rsp); // break; // } // // case MERGEINDEXES: { // doPersist = this.handleMergeAction(req, rsp); // break; // } // // default: { // doPersist = this.handleCustomAction(req, rsp); // break; // } // case LOAD: // break; // } // } // // Should we persist the changes? // if (doPersist) { // cores.persist(); // rsp.add("saved", cores.getConfigFile().getAbsolutePath()); // } // rsp.setHttpCaching(false); // } // // protected boolean handleMergeAction(SolrQueryRequest req, SolrQueryResponse rsp) throws IOException { // SolrParams params = req.getParams(); // String cname = params.required().get(CoreAdminParams.CORE); // SolrCore core = coreContainer.getCore(cname); // // SolrCore[] sourceCores = null; // RefCounted<SolrIndexSearcher>[] searchers = null; // // stores readers created from indexDir param values // IndexReader[] readersToBeClosed = null; // if (core != null) { // try { // String[] dirNames = params.getParams(CoreAdminParams.INDEX_DIR); // if (dirNames == null || dirNames.length == 0) { // String[] sources = params.getParams("srcCore"); // if (sources == null || sources.length == 0) // throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, // "At least one indexDir or srcCore must be specified"); // // sourceCores = new SolrCore[sources.length]; // for (int i = 0; i < sources.length; i++) { // String source = sources[i]; // SolrCore srcCore = coreContainer.getCore(source); // if (srcCore == null) // throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, // "Core: " + source + " does not exist"); // sourceCores[i] = srcCore; // } // } else { // readersToBeClosed = new IndexReader[dirNames.length]; // DirectoryFactory dirFactory = core.getDirectoryFactory(); // for (int i = 0; i < dirNames.length; i++) { // readersToBeClosed[i] = IndexReader.open(dirFactory.open(dirNames[i]), true); // } // } // // IndexReader[] readers = null; // if (readersToBeClosed != null) { // readers = readersToBeClosed; // } else { // readers = new IndexReader[sourceCores.length]; // searchers = new RefCounted[sourceCores.length]; // for (int i = 0; i < sourceCores.length; i++) { // SolrCore solrCore = sourceCores[i]; // // record the searchers so that we can decref // searchers[i] = solrCore.getSearcher(UpdateHandler.UPDATEPARTION,false,false); // readers[i] = searchers[i].get().getIndexReader(); // } // } // // UpdateRequestProcessorChain processorChain = // core.getUpdateProcessingChain(SolrPluginUtils.resolveUpdateChainParam(params, log)); // SolrQueryRequest wrappedReq = new LocalSolrQueryRequest(core, req.getParams()); // UpdateRequestProcessor processor = // processorChain.createProcessor(wrappedReq, rsp); // // processor.processMergeIndexes(new MergeIndexesCommand(readers)); // } finally { // if (searchers != null) { // for (RefCounted<SolrIndexSearcher> searcher : searchers) { // if (searcher != null) searcher.decref(); // } // } // if (sourceCores != null) { // for (SolrCore solrCore : sourceCores) { // if (solrCore != null) solrCore.close(); // } // } // if (readersToBeClosed != null) IOUtils.closeWhileHandlingException(readersToBeClosed); // core.close(); // } // } // return coreContainer.isPersistent(); // } // // /** // * Handle Custom Action. // * <p/> // * This method could be overridden by derived classes to handle custom actions. <br> By default - this method throws a // * solr exception. Derived classes are free to write their derivation if necessary. // */ // protected boolean handleCustomAction(SolrQueryRequest req, SolrQueryResponse rsp) { // throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Unsupported operation: " + // req.getParams().get(CoreAdminParams.ACTION)); // } // // /** // * Handle 'CREATE' action. // * // * @param req // * @param rsp // * // * @return true if a modification has resulted that requires persistance // * of the CoreContainer configuration. // * // * @throws SolrException in case of a configuration error. // */ // protected boolean handleCreateAction(SolrQueryRequest req, SolrQueryResponse rsp) throws SolrException { // try { // SolrParams params = req.getParams(); // String name = params.get(CoreAdminParams.NAME); // CoreDescriptor dcore = new CoreDescriptor(coreContainer, name, params.get(CoreAdminParams.INSTANCE_DIR)); // // // fillup optional parameters // String opts = params.get(CoreAdminParams.CONFIG); // if (opts != null) // dcore.setConfigName(opts); // // opts = params.get(CoreAdminParams.SCHEMA); // if (opts != null) // dcore.setSchemaName(opts); // // opts = params.get(CoreAdminParams.DATA_DIR); // if (opts != null) // dcore.setDataDir(opts); // // // Process all property.name=value parameters and set them as name=value core properties // Properties coreProperties = new Properties(); // Iterator<String> parameterNamesIterator = params.getParameterNamesIterator(); // while (parameterNamesIterator.hasNext()) { // String parameterName = parameterNamesIterator.next(); // if(parameterName.startsWith(CoreAdminParams.PROPERTY_PREFIX)) { // String parameterValue = params.get(parameterName); // String propertyName = parameterName.substring(CoreAdminParams.PROPERTY_PREFIX.length()); // skip prefix // coreProperties.put(propertyName, parameterValue); // } // } // dcore.setCoreProperties(coreProperties); // // SolrCore core = coreContainer.create(dcore); // coreContainer.register(name, core, false); // rsp.add("core", core.getName()); // return coreContainer.isPersistent(); // } catch (Exception ex) { // throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, // "Error executing default implementation of CREATE", ex); // } // } // // /** // * Handle "RENAME" Action // * // * @param req // * @param rsp // * // * @return true if a modification has resulted that requires persistance // * of the CoreContainer configuration. // * // * @throws SolrException // */ // protected boolean handleRenameAction(SolrQueryRequest req, SolrQueryResponse rsp) throws SolrException { // SolrParams params = req.getParams(); // // String name = params.get(CoreAdminParams.OTHER); // String cname = params.get(CoreAdminParams.CORE); // boolean doPersist = false; // // if (cname.equals(name)) return doPersist; // // SolrCore core = coreContainer.getCore(cname); // if (core != null) { // doPersist = coreContainer.isPersistent(); // coreContainer.register(name, core, false); // coreContainer.remove(cname); // core.close(); // } // return doPersist; // } // // /** // * Handle "ALIAS" action // * // * @param req // * @param rsp // * // * @return true if a modification has resulted that requires persistance // * of the CoreContainer configuration. // */ // @Deprecated // protected boolean handleAliasAction(SolrQueryRequest req, SolrQueryResponse rsp) { // SolrParams params = req.getParams(); // // String name = params.get(CoreAdminParams.OTHER); // String cname = params.get(CoreAdminParams.CORE); // boolean doPersist = false; // if (cname.equals(name)) return doPersist; // // SolrCore core = coreContainer.getCore(cname); // if (core != null) { // doPersist = coreContainer.isPersistent(); // coreContainer.register(name, core, false); // // no core.close() since each entry in the cores map should increase the ref // } // return doPersist; // } // // // /** // * Handle "UNLOAD" Action // * // * @param req // * @param rsp // * // * @return true if a modification has resulted that requires persistance // * of the CoreContainer configuration. // */ // protected boolean handleUnloadAction(SolrQueryRequest req, SolrQueryResponse rsp) throws SolrException { // SolrParams params = req.getParams(); // String cname = params.get(CoreAdminParams.CORE); // SolrCore core = coreContainer.remove(cname); // if(core == null){ // throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, // "No such core exists '"+cname+"'"); // } // if (params.getBool(CoreAdminParams.DELETE_INDEX, false)) { // core.addCloseHook(new CloseHook() { // @Override // public void preClose(SolrCore core) {} // // @Override // public void postClose(SolrCore core) { // File dataDir = new File(core.getIndexDir(UpdateHandler.UPDATEPARTION)); // for (File file : dataDir.listFiles()) { // if (!file.delete()) { // log.error(file.getAbsolutePath() + " could not be deleted on core unload"); // } // } // if (!dataDir.delete()) log.error(dataDir.getAbsolutePath() + " could not be deleted on core unload"); // } // }); // } // core.close(); // return coreContainer.isPersistent(); // // } // // /** // * Handle "STATUS" action // * // * @param req // * @param rsp // * // * @return true if a modification has resulted that requires persistance // * of the CoreContainer configuration. // */ // protected boolean handleStatusAction(SolrQueryRequest req, SolrQueryResponse rsp) // throws SolrException { // SolrParams params = req.getParams(); // // String cname = params.get(CoreAdminParams.CORE); // boolean doPersist = false; // NamedList<Object> status = new SimpleOrderedMap<Object>(); // try { // if (cname == null) { // for (String name : coreContainer.getCoreNames()) { // status.add(name, getCoreStatus(coreContainer, name)); // } // } else { // status.add(cname, getCoreStatus(coreContainer, cname)); // } // rsp.add("status", status); // doPersist = false; // no state change // return doPersist; // } catch (Exception ex) { // throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, // "Error handling 'status' action ", ex); // } // } // // /** // * Handler "PERSIST" action // * // * @param req // * @param rsp // * // * @return true if a modification has resulted that requires persistance // * of the CoreContainer configuration. // * // * @throws SolrException // */ // protected boolean handlePersistAction(SolrQueryRequest req, SolrQueryResponse rsp) // throws SolrException { // SolrParams params = req.getParams(); // boolean doPersist = false; // String fileName = params.get(CoreAdminParams.FILE); // if (fileName != null) { // File file = new File(coreContainer.getConfigFile().getParentFile(), fileName); // coreContainer.persistFile(file); // rsp.add("saved", file.getAbsolutePath()); // doPersist = false; // } else if (!coreContainer.isPersistent()) { // throw new SolrException(SolrException.ErrorCode.FORBIDDEN, "Persistence is not enabled"); // } else // doPersist = true; // // return doPersist; // } // // /** // * Handler "RELOAD" action // * // * @param req // * @param rsp // * // * @return true if a modification has resulted that requires persistance // * of the CoreContainer configuration. // */ // protected boolean handleReloadAction(SolrQueryRequest req, SolrQueryResponse rsp) { // SolrParams params = req.getParams(); // String cname = params.get(CoreAdminParams.CORE); // try { // coreContainer.reload(cname); // return false; // no change on reload // } catch (Exception ex) { // throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Error handling 'reload' action", ex); // } // } // // /** // * Handle "SWAP" action // * // * @param req // * @param rsp // * // * @return true if a modification has resulted that requires persistance // * of the CoreContainer configuration. // */ // protected boolean handleSwapAction(SolrQueryRequest req, SolrQueryResponse rsp) { // final SolrParams params = req.getParams(); // final SolrParams required = params.required(); // // final String cname = params.get(CoreAdminParams.CORE); // boolean doPersist = params.getBool(CoreAdminParams.PERSISTENT, coreContainer.isPersistent()); // String other = required.get(CoreAdminParams.OTHER); // coreContainer.swap(cname, other); // return doPersist; // // } // // protected NamedList<Object> getCoreStatus(CoreContainer cores, String cname) throws IOException { // NamedList<Object> info = new SimpleOrderedMap<Object>(); // SolrCore core = cores.getCore(cname); // if (core != null) { // try { // info.add("name", core.getName()); // info.add("instanceDir", normalizePath(core.getResourceLoader().getInstanceDir())); // info.add("dataDir", normalizePath(core.getDataDir())); // info.add("startTime", new Date(core.getStartTime())); // info.add("uptime", System.currentTimeMillis() - core.getStartTime()); // RefCounted<SolrIndexSearcher> searcher = core.getSearcher(UpdateHandler.UPDATEPARTION,false,false); // try { // info.add("index", LukeRequestHandler.getIndexInfo(searcher.get().getReader(), false)); // } finally { // searcher.decref(); // } // } finally { // core.close(); // } // } // return info; // } // // protected static String normalizePath(String path) { // if (path == null) // return null; // path = path.replace('/', File.separatorChar); // path = path.replace('\\', File.separatorChar); // return path; // } // // // //////////////////////// SolrInfoMBeans methods ////////////////////// // // @Override // public String getDescription() { // return "Manage Multiple Solr Cores"; // } // // @Override // public String getVersion() { // return "$Revision: 1171306 $"; // } // // @Override // public String getSourceId() { // return "$Id: CoreAdminHandler.java 1171306 2011-09-15 22:43:33Z janhoy $"; // } // // @Override // public String getSource() { // return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene_solr_3_5/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java $"; // } //}