indexingqueuestore.java
来自「jsr170接口的java实现。是个apache的开源项目。」· Java 代码 · 共 250 行
JAVA
250 行
/* * 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.jackrabbit.core.query.lucene;import org.apache.jackrabbit.core.fs.FileSystem;import org.apache.jackrabbit.core.fs.FileSystemException;import org.apache.jackrabbit.core.fs.RandomAccessOutputStream;import org.slf4j.LoggerFactory;import org.slf4j.Logger;import java.io.IOException;import java.io.InputStream;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.Writer;import java.io.BufferedOutputStream;import java.util.Set;import java.util.HashSet;/** * <code>IndexingQueueStore</code> implements the persistent store to keep * track of pending document in an indexing queue. */class IndexingQueueStore { /** * The logger instance for this class. */ private static final Logger log = LoggerFactory.getLogger(IndexingQueueStore.class); /** * Encoding of the indexing queue store. */ private static final String ENCODING = "UTF-8"; /** * Operation identifier for an added node. */ private static final String ADD = "ADD"; /** * Operation identifier for an removed node. */ private static final String REMOVE = "REMOVE"; /** * The UUID Strings of the pending documents. */ private final Set pending = new HashSet(); /** * The file system where to write the pending document UUIDs. */ private final FileSystem fs; /** * The name of the file for the pending document UUIDs. */ private final String fileName; /** * Non-null if we are currently writing to the file. */ private Writer out; /** * Creates a new <code>IndexingQueueStore</code> using the given file * system. * * @param fs the file system to use. * @param fileName the name of the file where to write the pending UUIDs * to. * @throws FileSystemException if an error ocurrs while reading pending * UUIDs. */ IndexingQueueStore(FileSystem fs, String fileName) throws FileSystemException { this.fs = fs; this.fileName = fileName; readStore(); } /** * @return the UUIDs of the pending text extraction jobs. */ public String[] getPending() { return (String[]) pending.toArray(new String[pending.size()]); } /** * Adds a <code>uuid</code> to the store. * * @param uuid the uuid to add. * @throws IOException if an error occurs while writing. */ public void addUUID(String uuid) throws IOException { writeEntry(ADD, uuid, getLog()); pending.add(uuid); } /** * Removes a <code>uuid</code> from the store. * * @param uuid the uuid to add. * @throws IOException if an error occurs while writing. */ public void removeUUID(String uuid) throws IOException { writeEntry(REMOVE, uuid, getLog()); pending.remove(uuid); } /** * Commits the pending changes to the file. * * @throws IOException if an error occurs while writing. */ public void commit() throws IOException { if (out != null) { out.flush(); if (pending.size() == 0) { out.close(); out = null; // truncate log try { fs.getOutputStream(fileName).close(); } catch (FileSystemException e) { // ignore } } } } /** * Flushes and closes this queue store. * * @throws IOException if an error occurs while writing. */ public void close() throws IOException { commit(); if (out != null) { out.close(); } } //----------------------------< internal >---------------------------------- /** * Reads all pending UUIDs from the file and puts them into {@link * #pending}. * * @throws FileSystemException if an error occurs while reading. */ private void readStore() throws FileSystemException { if (fs.exists(fileName)) { try { InputStream in = fs.getInputStream(fileName); BufferedReader reader = new BufferedReader( new InputStreamReader(in, ENCODING)); try { String line; while ((line = reader.readLine()) != null) { int idx = line.indexOf(' '); if (idx == -1) { // invalid line log.warn("invalid line in {}: {}", fileName, line); } else { String cmd = line.substring(0, idx); String uuid = line.substring(idx + 1, line.length()); if (ADD.equals(cmd)) { pending.add(uuid); } else if (REMOVE.equals(cmd)) { pending.remove(uuid); } else { // invalid line log.warn("invalid line in {}: {}", fileName, line); } } } } finally { in.close(); } } catch (IOException e) { throw new FileSystemException(e.getMessage(), e); } } } /** * Writes an entry to the log file. * * @param op the operation. Either {@link #ADD} or {@link #REMOVE}. * @param uuid the uuid of the added or removed node. * @param writer the writer where the entry is written to. * @throws IOException if an error occurs when writing the entry. */ private static void writeEntry(String op, String uuid, Writer writer) throws IOException { StringBuffer buf = new StringBuffer(op); buf.append(' ').append(uuid).append('\n'); writer.write(buf.toString()); } /** * Returns the writer to the log file. * * @return the writer to the log file. * @throws IOException if an error occurs while opening the log file. */ private Writer getLog() throws IOException { if (out == null) { // open file try { long len = 0; if (fs.exists(fileName)) { len = fs.length(fileName); } RandomAccessOutputStream raos = fs.getRandomAccessOutputStream(fileName); raos.seek(len); // use buffering out = new OutputStreamWriter( new BufferedOutputStream(raos, 1024), ENCODING); } catch (FileSystemException e) { if (out != null) { out.close(); out = null; } IOException ex = new IOException(e.getMessage()); ex.initCause(e); throw ex; } } return out; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?