forummessageblockiterator.java
来自「Jive是基于JSP/JAVA技术构架的一个大型BBS论坛系统,这是Jive论坛」· Java 代码 · 共 246 行
JAVA
246 行
/** * $RCSfile: ForumMessageBlockIterator.java,v $ * $Revision: 1.3 $ * $Date: 2002/05/10 22:20:26 $ * * Copyright (C) 1999-2001 CoolServlets, Inc. All rights reserved. * * This software is the proprietary information of CoolServlets, Inc. * Use is subject to license terms. */package com.jivesoftware.forum.database;import com.jivesoftware.forum.*;import java.util.*;/** * A iterator for blocks of message ID's. */public class ForumMessageBlockIterator implements Iterator { private long [] block; private int blockID; private int blockStart; private String query; private int startIndex; private int currentIndex; private int endIndex; private long forumID; private long threadID; private DbForumFactory factory; private Object previousElement = null; private Object nextElement = null; private boolean nextFlag = false; private boolean previousFlag = false; /** * Constructs a new ForumMessageBlockIterator. * * @param block the array of id's to iterate through. * @param query the database query used to select the block. * @param startIndex the starting index in the block to being iteration at. * @param endIndex the endeding index in the set to end iteration at. This * may or not be in the current block. If it ends after the current * block, the next block will be loaded automatically as necessary. * @param forumID the ID of the forum associated with this block. * @param factory a factory instance. * @param threadID the ID of the thread associated with this block. */ protected ForumMessageBlockIterator(long [] block, String query, int startIndex, int endIndex, long forumID, DbForumFactory factory, long threadID) { this.block = block; this.blockID = startIndex / DbForum.BLOCK_SIZE; this.blockStart = blockID * DbForum.BLOCK_SIZE; this.query = query; this.currentIndex = startIndex - 1; this.startIndex = startIndex; this.endIndex = endIndex; this.forumID = forumID; this.factory = factory; this.threadID = threadID; } /** * Returns true if there are more messages in the list. * * @return true if the iterator has more elements. */ public boolean hasNext() { nextFlag = true; //If we are at the end of the list, there can't be any more elements //to iterate through. if (currentIndex+1 >= endIndex && nextElement == null) { return false; } //Otherwise, see if nextElement is null. If so, try to load the next //element to make sure it exists. if (nextElement == null) { nextElement = getNextElement(); if (nextElement == null) { return false; } } return true; } public boolean hasPrevious() { previousFlag = true; if (currentIndex-1 < startIndex && previousElement == null) { return false; } //Otherwise, see if nextElement is null. If so, try to load the next //element to make sure it exists. if (previousElement == null) { previousElement = getPreviousElement(); if (previousElement == null) { return false; } } return true; } /** * Returns the next element. * * @return the next element. * @throws NoSuchElementException if there are no more elements. */ public Object next() throws java.util.NoSuchElementException { nextFlag = false; Object element = null; if (nextElement != null) { element = nextElement; this.nextElement = null; } else { element = getNextElement(); if (element == null) { throw new java.util.NoSuchElementException(); } } return element; } public Object previous() { previousFlag = true; Object element = null; if (previousElement != null) { element = previousElement; previousElement = null; } else { element = getPreviousElement(); if (element == null) { throw new java.util.NoSuchElementException(); } } return element; } /** * Not supported for security reasons. */ public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } /** * Returns the next available element, or null if there are no more * elements to return. * * @return the next available element. */ public Object getNextElement() { if (previousElement != null && previousFlag) { previousElement = null; getNextElement(); } Object element = null; while (currentIndex+1 < endIndex && element == null) { currentIndex++; element = getElement(currentIndex); } return element; } public Object getPreviousElement() { if (nextElement != null && nextFlag) { nextElement = null; getPreviousElement(); } Object element = null; while (currentIndex >= startIndex && element == null) { currentIndex--; element = getElement(currentIndex); } return element; } private Object getElement(int index) { if (index < 0) { return null; } // See if element isn't in the current block if (index < blockStart || index >= blockStart + DbForum.BLOCK_SIZE) { // Then load up the appropriate block. We either load the block // from a forum or thread, depending on what the original query was // for. if(threadID == -1) { try { DbForum forum = factory.cacheManager.getForum(forumID); this.block = forum.getBlock(query, index); this.blockID = index / DbForum.BLOCK_SIZE; this.blockStart = blockID * DbForum.BLOCK_SIZE; } catch (ForumNotFoundException fnfe) { // If we get this exception, it probably means the entire // forum has been deleted, which means we should return null. return null; } } // Must have been a thread query, so load next block from thread. else { try { DbForumThread thread = factory.cacheManager.getForumThread( threadID); this.block = thread.getBlock(query, index); this.blockID = index / DbForum.BLOCK_SIZE; this.blockStart = blockID * DbForum.BLOCK_SIZE; } catch (Exception e) { return null; } } } Object element = null; // Compute the relative index of the element, which is the index in the // current message block. int relativeIndex = index % DbForum.BLOCK_SIZE; // Make sure index isn't too large if (relativeIndex < block.length) { try { // Load the actual message object ForumMessage message = factory.cacheManager.getMessage( block[relativeIndex]); // Now, get the message from its thread so that filters are // applied to the message. This may seem a bit convuluted, but is // necessary. element = message.getForumThread().getMessage(block[relativeIndex]); } catch (ForumMessageNotFoundException tnfe) { } } return element; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?