diff options
Diffstat (limited to 'pki/base/common/src/com/netscape/cmscore/dbs/DBVirtualList.java')
-rw-r--r-- | pki/base/common/src/com/netscape/cmscore/dbs/DBVirtualList.java | 782 |
1 files changed, 0 insertions, 782 deletions
diff --git a/pki/base/common/src/com/netscape/cmscore/dbs/DBVirtualList.java b/pki/base/common/src/com/netscape/cmscore/dbs/DBVirtualList.java deleted file mode 100644 index 574ab41c0..000000000 --- a/pki/base/common/src/com/netscape/cmscore/dbs/DBVirtualList.java +++ /dev/null @@ -1,782 +0,0 @@ -// --- BEGIN COPYRIGHT BLOCK --- -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// (C) 2007 Red Hat, Inc. -// All rights reserved. -// --- END COPYRIGHT BLOCK --- -package com.netscape.cmscore.dbs; - -import java.util.Arrays; -import java.util.Vector; - -import netscape.ldap.LDAPConnection; -import netscape.ldap.LDAPControl; -import netscape.ldap.LDAPEntry; -import netscape.ldap.LDAPSearchConstraints; -import netscape.ldap.LDAPSearchResults; -import netscape.ldap.LDAPSortKey; -import netscape.ldap.controls.LDAPSortControl; -import netscape.ldap.controls.LDAPVirtualListControl; -import netscape.ldap.controls.LDAPVirtualListResponse; - -import com.netscape.certsrv.apps.CMS; -import com.netscape.certsrv.base.EBaseException; -import com.netscape.certsrv.dbs.IDBRegistry; -import com.netscape.certsrv.dbs.IDBVirtualList; -import com.netscape.certsrv.dbs.IElementProcessor; -import com.netscape.certsrv.logging.ILogger; - -/** - * A class represents a virtual list of search results. - * Note that this class must be used with DS4.0. - * - * @author thomask - * @author mzhao - * @version $Revision$, $Date$ - */ -public class DBVirtualList<E> implements IDBVirtualList<E> { - - private IDBRegistry mRegistry = null; - private LDAPConnection mConn = null; - private String mBase = null; - private String mFilter = null; - private String mAttrs[] = null; - // virtual list size - private int mSize = -1; - - private Vector<E> mEntries = new Vector<E>(); - // mSize is get or not? - private boolean mInitialized = false; - private LDAPSortKey[] mKeys; - private LDAPControl[] mPageControls = null; - // page buffer size - private int mPageSize = 10; - // the top of the buffer - private int mTop = 0; - private int mBeforeCount; - private int mAfterCount; - // the index of the first entry returned - private int mSelectedIndex = 0; - private int mJumpToIndex = 0; - private int mJumpToInitialIndex = 0; // Initial index hit in jumpto operation - private int mJumpToDirection = 1; // Do we proceed forward or backwards - private String mJumpTo = null; // Determines if this is the jumpto case - - private ILogger mLogger = CMS.getLogger(); - - /** - * Constructs a virtual list. - * Be sure to setPageSize() later if your pageSize is not the default 10 - * Be sure to setSortKey() before fetchs - * - * param registry the registry of attribute mappers - * param c the ldap connection. It has to be version 3 and upper - * param base the base distinguished name to search from - * param filter search filter specifying the search criteria - * param attrs list of attributes that you want returned in the search results - */ - public DBVirtualList(IDBRegistry registry, LDAPConnection c, - String base, String filter, String attrs[]) throws EBaseException { - mRegistry = registry; - mFilter = filter; - mBase = base; - mAttrs = attrs; - CMS.debug("In DBVirtualList filter attrs filter: " + filter - + " attrs: " + Arrays.toString(attrs)); - mPageControls = new LDAPControl[2]; - try { - mConn = (LDAPConnection) c.clone(); - } catch (Exception e) { - throw new EBaseException(CMS.getUserMessage("CMS_BASE_CONN_FAILED", - e.toString())); - } - } - - /** - * Constructs a virtual list. - * Be sure to setPageSize() later if your pageSize is not the default 10 - * - * param registry the registry of attribute mappers - * param c the ldap connection. It has to be version 3 and upper - * param base the base distinguished name to search from - * param filter search filter specifying the search criteria - * param attrs list of attributes that you want returned in the search results - * param sortKey the attributes to sort by - */ - public DBVirtualList(IDBRegistry registry, LDAPConnection c, - String base, String filter, String attrs[], String sortKey[]) - throws EBaseException { - - CMS.debug("In DBVirtualList filter attrs sotrKey[] filter: " + filter - + " attrs: " + Arrays.toString(attrs)); - mRegistry = registry; - mFilter = filter; - try { - mConn = (LDAPConnection) c.clone(); - } catch (Exception e) { - throw new EBaseException(CMS.getUserMessage("CMS_BASE_CONN_FAILED", - e.toString())); - } - mBase = base; - mAttrs = attrs; - mPageControls = new LDAPControl[2]; - setSortKey(sortKey); - } - - /** - * Constructs a virtual list. - * Be sure to setPageSize() later if your pageSize is not the default 10 - * - * param registry the registry of attribute mappers - * param c the ldap connection. It has to be version 3 and upper - * param base the base distinguished name to search from - * param filter search filter specifying the search criteria - * param attrs list of attributes that you want returned in the search results - * param sortKey the attribute to sort by - */ - public DBVirtualList(IDBRegistry registry, LDAPConnection c, - String base, String filter, String attrs[], String sortKey) - throws EBaseException { - - CMS.debug("In DBVirtualList filter attrs sortKey filter: " + filter + " attrs: " + Arrays.toString(attrs)); - mRegistry = registry; - mFilter = filter; - try { - mConn = (LDAPConnection) c.clone(); - } catch (Exception e) { - throw new EBaseException(CMS.getUserMessage("CMS_BASE_CONN_FAILED", - e.toString())); - } - mBase = base; - mAttrs = attrs; - mPageControls = new LDAPControl[2]; - setSortKey(sortKey); - } - - /** - * Constructs a virtual list. - * - * param registry the registry of attribute mappers - * param c the ldap connection. It has to be version 3 and upper - * param base the base distinguished name to search from - * param filter search filter specifying the search criteria - * param attrs list of attributes that you want returned in the search results - * param sortKey the attributes to sort by - * param pageSize the size of a page. There is a 3*pageSize buffer maintained so - * pageUp and pageDown won't invoke fetch from ldap server - */ - public DBVirtualList(IDBRegistry registry, LDAPConnection c, - String base, String filter, String attrs[], String sortKey[], - int pageSize) throws EBaseException { - - CMS.debug("In DBVirtualList filter attrs sortKey[] pageSize filter: " - + filter + " attrs: " + Arrays.toString(attrs) - + " pageSize " + pageSize); - mRegistry = registry; - mFilter = filter; - try { - mConn = (LDAPConnection) c.clone(); - } catch (Exception e) { - throw new EBaseException(CMS.getUserMessage("CMS_BASE_CONN_FAILED", - e.toString())); - } - mBase = base; - mAttrs = attrs; - mPageControls = new LDAPControl[2]; - setSortKey(sortKey); - setPageSize(pageSize); - } - - /** - * Constructs a virtual list. - * - * param registry the registry of attribute mappers - * param c the ldap connection. It has to be version 3 and upper - * param base the base distinguished name to search from - * param filter search filter specifying the search criteria - * param attrs list of attributes that you want returned in the search results - * param sortKey the attribute to sort by - * param pageSize the size of a page. There is a 3*pageSize buffer maintained so - * pageUp and pageDown won't invoke fetch from ldap server - */ - public DBVirtualList(IDBRegistry registry, LDAPConnection c, - String base, String filter, String attrs[], String sortKey, - int pageSize) throws EBaseException { - - CMS.debug("In DBVirtualList filter attrs sortKey pageSize filter: " - + filter + " attrs: " + Arrays.toString(attrs) - + " pageSize " + pageSize); - mRegistry = registry; - mFilter = filter; - try { - mConn = (LDAPConnection) c.clone(); - } catch (Exception e) { - throw new EBaseException(CMS.getUserMessage("CMS_BASE_CONN_FAILED", - e.toString())); - } - mBase = base; - mAttrs = attrs; - mPageControls = new LDAPControl[2]; - setSortKey(sortKey); - setPageSize(pageSize); - } - - public DBVirtualList(IDBRegistry registry, LDAPConnection c, - String base, String filter, String attrs[], - String startFrom, String sortKey, - int pageSize) throws EBaseException { - - CMS.debug("In DBVirtualList filter attrs startFrom sortKey pageSize " - + "filter: " + filter - + " attrs: " + Arrays.toString(attrs) - + " pageSize " + pageSize + " startFrom " + startFrom); - mRegistry = registry; - mFilter = filter; - try { - mConn = (LDAPConnection) c.clone(); - } catch (Exception e) { - throw new EBaseException(CMS.getUserMessage("CMS_BASE_CONN_FAILED", - e.toString())); - } - mBase = base; - mAttrs = attrs; - mPageControls = new LDAPControl[2]; - mJumpTo = startFrom; - setSortKey(sortKey); - // setPageSize(pageSize); - - if (pageSize < 0) { - mJumpToDirection = -1; - } - mPageSize = pageSize; - - mBeforeCount = 0; - mAfterCount = mPageSize; - } - - /** - * Set the paging size of this virtual list. - * The page size here is just a buffer size. A buffer is kept around - * that is three times as large as the number of visible entries. - * That way, you can scroll up/down several items(up to a page-full) - * without refetching entries from the directory. - * - * @param size the page size - */ - public void setPageSize(int size) { - - if (mJumpTo != null) { - return; - } - - mPageSize = size; - mBeforeCount = 0; //mPageSize; - mAfterCount = mPageSize; // mPageSize + mPageSize; - - //CMS.debug("In setPageSize " + size + " mBeforeCount " + mBeforeCount + " mAfterCount " + mAfterCount); - } - - /** - * set the sort key - * - * @param sortKey the attribute to sort by - */ - public void setSortKey(String sortKey) throws EBaseException { - String keys[] = new String[1]; - - keys[0] = sortKey; - setSortKey(keys); - } - - /** - * set the sort key - * - * @param sortKey the attributes to sort by - */ - public void setSortKey(String[] sortKeys) throws EBaseException { - if (sortKeys == null) - throw new EBaseException("sort keys cannot be null"); - try { - - mKeys = new LDAPSortKey[sortKeys.length]; - String la[] = mRegistry.getLDAPAttributes(sortKeys); - - for (int j = 0; j < sortKeys.length; j++) { - mKeys[j] = new LDAPSortKey(la[j]); - } - } catch (Exception e) { - - /*LogDoc - * - * @phase local ldap search - * @reason Failed at setSortKey. - * @message DBVirtualList: <exception thrown> - */ - mLogger.log(ILogger.EV_SYSTEM, ILogger.S_DB, ILogger.LL_FAILURE, - CMS.getLogMessage("OPERATION_ERROR", e.toString())); - } - // Paged results also require a sort control - if (mKeys != null) { - mPageControls[0] = - new LDAPSortControl(mKeys, true); - } else { - throw new EBaseException("sort keys cannot be null"); - } - } - - /** - * Retrieves the size of this virtual list. - * Recommend to call getSize() before getElementAt() or getElements() - * since you'd better check if the index is out of bound first. - */ - public int getSize() { - if (!mInitialized) { - mInitialized = true; - // Do an initial search to get the virtual list size - // Keep one page before and one page after the start - if (mJumpTo == null) { - mBeforeCount = 0; //mPageSize; - mAfterCount = mPageSize; // mPageSize + mPageSize; - } - // Create the initial paged results control - /* Since this one is only used to get the size of the virtual list; - we don't care about the starting index. If there is no partial - match, the first one before (or after, if none before) is returned - as the index entry. Instead of "A", you could use the other - constructor and specify 0 both for startIndex and for - contentCount. */ - LDAPVirtualListControl cont = null; - - if (mJumpTo == null) { - cont = new LDAPVirtualListControl("A", - mBeforeCount, - mAfterCount); - } else { - - if (mPageSize < 0) { - mBeforeCount = mPageSize * -1; - mAfterCount = 0; - } - cont = new LDAPVirtualListControl(mJumpTo, - mBeforeCount, - mAfterCount); - } - mPageControls[1] = cont; - getJumpToPage(); - } - - CMS.debug("Getting Virtual List size: " + mSize); - return mSize; - } - - public int getSizeBeforeJumpTo() { - - if (!mInitialized || mJumpTo == null) - return 0; - - int size = 0; - - if (mJumpToDirection < 0) { - size = mTop + mEntries.size(); - } else { - size = mTop; - - } - - return size; - - } - - public int getSizeAfterJumpTo() { - - if (!mInitialized || mJumpTo == null) - return 0; - - int size = mSize - mTop; - - return size; - - } - - private synchronized boolean getEntries() { - // Specify necessary controls for vlist - // LDAPSearchConstraints cons = mConn.getSearchConstraints(); - LDAPSearchConstraints cons = new LDAPSearchConstraints(); - - cons.setMaxResults(0); - if (mPageControls != null) { - cons.setServerControls(mPageControls); - //System.out.println( "setting vlist control" ); - } - // Empty the buffer - mEntries.removeAllElements(); - // Do a search - try { - //what happen if there is no matching? - String ldapFilter = mRegistry.getFilter(mFilter); - String ldapAttrs[] = null; - LDAPSearchResults result; - - if (mAttrs != null) { - ldapAttrs = mRegistry.getLDAPAttributes(mAttrs); - - /* - LDAPv2.SCOPE_BASE: - (search only the base DN) - LDAPv2.SCOPE_ONE: - (search only entries under the base DN) - LDAPv2.SCOPE_SUB: - (search the base DN and all entries within its subtree) - */ - result = mConn.search(mBase, - LDAPConnection.SCOPE_ONE, ldapFilter, ldapAttrs, - false, cons); - - } else { - result = mConn.search(mBase, - LDAPConnection.SCOPE_ONE, ldapFilter, null, - false, cons); - } - if (result == null) { - return false; - } - int damageCounter = 0; - - while (result.hasMoreElements()) { - LDAPEntry entry = (LDAPEntry) result.nextElement(); - - try { - //maintain mEntries as vector of LDAPEntry - @SuppressWarnings("unchecked") - E o = (E) mRegistry.createObject(entry.getAttributeSet()); - - mEntries.addElement(o); - } catch (Exception e) { - - CMS.debug("Exception " + e); - - /*LogDoc - * - * @phase local ldap search - * @reason Failed to get enties. - * @message DBVirtualList: <exception thrown> - */ - mLogger.log(ILogger.EV_SYSTEM, ILogger.S_DB, ILogger.LL_FAILURE, - CMS.getLogMessage("CMSCORE_DBS_VL_ADD", e.toString())); - // #539044 - damageCounter++; - if (damageCounter > 100) { - mLogger.log(ILogger.EV_SYSTEM, ILogger.S_DB, ILogger.LL_FAILURE, - CMS.getLogMessage("CMSCORE_DBS_VL_CORRUPTED_ENTRIES", Integer.toString(damageCounter))); - return false; - } - } - } - } catch (Exception e) { - - /*LogDoc - * - * @phase local ldap search - * @reason Failed to get enties. - * @message DBVirtualList: <exception thrown> - */ - CMS.debug("getEntries: exception " + e); - - mLogger.log(ILogger.EV_SYSTEM, ILogger.S_DB, ILogger.LL_FAILURE, - CMS.getLogMessage("OPERATION_ERROR", e.toString())); - } - //System.out.println( "Returning " + mEntries.size() + - // " entries" ); - - CMS.debug("getEntries returning " + mEntries.size()); - return true; - } - - public int getCurrentIndex() { - return mTop; - } - - private synchronized boolean getJumpToPage() { - try { - // Get the actual entries - if (!getEntries()) - return false; - - // Check if we have a control returned - LDAPControl[] c = mConn.getResponseControls(); - LDAPVirtualListResponse nextCont = - LDAPVirtualListResponse.parseResponse(c); - - if (nextCont != null) { - mSelectedIndex = nextCont.getFirstPosition() - 1; - mTop = Math.max(0, mSelectedIndex - mBeforeCount); - - CMS.debug("mTop " + mTop); - if (mJumpTo != null) { - mJumpToInitialIndex = mTop; - } - - // Now we know the total size of the virtual list box - mSize = nextCont.getContentCount(); - ((LDAPVirtualListControl) mPageControls[1]).setListSize(mSize); - mInitialized = true; - //System.out.println( "Virtual window: " + mTop + - // ".." + (mTop+mEntries.size()-1) + - // " of " + mSize ); - } else { - mLogger.log(ILogger.EV_SYSTEM, ILogger.S_DB, ILogger.LL_FAILURE, - CMS.getLogMessage("CMSCORE_DBS_VL_NULL_RESPONSE")); - } - return true; - } catch (Exception e) { - // happens when connection is not available - return false; - } - } - - /** - * Get a page starting at "first" (although we may also fetch - * some preceding entries) - * Recommend to call getSize() before getElementAt() or getElements() - * since you'd better check if the index is out of bound first. - * - * @param first the index of the first entry of the page you want to fetch - */ - public boolean getPage(int first) { - CMS.debug("getPage " + first); - if (!mInitialized) { - LDAPVirtualListControl cont = new LDAPVirtualListControl(0, - mBeforeCount, - mAfterCount, 0); - - mPageControls[1] = cont; - } - - //CMS.debug("about to set range first " + first + " mBeforeCount " + mBeforeCount + " mAfterCount " + mAfterCount); - ((LDAPVirtualListControl) mPageControls[1]).setRange(first, mBeforeCount, mAfterCount); - return getPage(); - } - - /** - * Fetch a buffer - */ - private boolean getPage() { - // Get the actual entries - if (!getEntries()) - return false; - - // Check if we have a control returned - LDAPControl[] c = mConn.getResponseControls(); - LDAPVirtualListResponse nextCont = - LDAPVirtualListResponse.parseResponse(c); - - if (nextCont != null) { - mSelectedIndex = nextCont.getFirstPosition() - 1; - mTop = Math.max(0, mSelectedIndex - mBeforeCount); - //CMS.debug("New mTop: " + mTop + " mSelectedIndex " + mSelectedIndex); - // Now we know the total size of the virtual list box - mSize = nextCont.getContentCount(); - ((LDAPVirtualListControl) mPageControls[1]).setListSize(mSize); - mInitialized = true; - //System.out.println( "Virtual window: " + mTop + - // ".." + (mTop+mEntries.size()-1) + - // " of " + mSize ); - } else { - - /*LogDoc - * - * @phase local ldap search - */ - mLogger.log(ILogger.EV_SYSTEM, ILogger.S_DB, ILogger.LL_FAILURE, - CMS.getLogMessage("CMSCORE_DBS_VL_NULL_RESPONSE")); - } - return true; - } - - /** - * Called by application to scroll the list with initial letters. - * Consider text to be an initial substring of the attribute of the - * primary sorting key(the first one specified in the sort key array) - * of an entry. - * If no entries match, the one just before(or after, if none before) - * will be returned as mSelectedIndex - * - * @param text the prefix of the first entry of the page you want to fetch - */ - public boolean getPage(String text) { - mPageControls[1] = - new LDAPVirtualListControl(text, - mBeforeCount, - mAfterCount); - //System.out.println( "Setting requested start to " + - // text + ", -" + mBeforeCount + ", +" + - // mAfterCount ); - return getPage(); - } - - /** - * fetch data of a single list item - * Recommend to call getSize() before getElementAt() or getElements() - * since you'd better check if the index is out of bound first. - * If the index is out of range of the virtual list, an exception will be thrown - * and return null - * - * @param index the index of the element to fetch - */ - public E getElementAt(int index) { - - /* mSize may not be init at this time! Bad ! - * the caller should really check the index is within bound before this - * but I'll take care of this just in case they are too irresponsible - */ - if (!mInitialized) - mSize = getSize(); - - CMS.debug("getElementAt: " + index + " mTop " + mTop); - - //System.out.println( "need entry " + index ); - if ((index < 0) || (index >= mSize)) { - CMS.debug("returning null"); - return null; - } - - if (mJumpTo != null) { //Handle the explicit jumpto case - - if (index == 0) - mJumpToIndex = 0; // Keep a running jumpto index for this page of data - else - mJumpToIndex++; - - //CMS.debug("getElementAtJT: " + index + " mTop " + mTop + " mEntries.size() " + mEntries.size()); - - if ((mJumpToDirection > 0) && (mJumpToInitialIndex + index >= mSize)) // out of data in forward paging jumpto case - { - CMS.debug("mJumpTo virtual list exhausted mTop " + mTop + " mSize " + mSize); - return null; - } - - if (mJumpToIndex >= mEntries.size()) // In jumpto case, page of data has been exhausted - { - mJumpToIndex = 0; // new page will be needed reset running count - - if (mJumpToDirection > 0) { //proceed in positive direction past hit point - getPage(index + mJumpToInitialIndex + 1); - } else { //proceed backwards from hit point - if (mTop == 0) { - getPage(0); - CMS.debug("asking for a page less than zero in reverse case, return null"); - return null; - } - - CMS.debug("getting page reverse mJumptoIndex " + mJumpToIndex + " mTop " + mTop); - getPage(mTop); - - } - - } - - if (mJumpToDirection > 0) // handle getting entry in forward direction - { - return mEntries.elementAt(mJumpToIndex); - } else { // handle getting entry in reverse direction - int reverse_index = mEntries.size() - mJumpToIndex - 1; - - CMS.debug("reverse direction getting index " + reverse_index); - - if (reverse_index < 0 || reverse_index >= mEntries.size()) { - CMS.debug("reverse_index out of range " + reverse_index); - return null; - } - return mEntries.elementAt(reverse_index); - } - } - - //CMS.debug("getElementAt noJumpto: " + index); - - if ((index < mTop) || (index >= mTop + mEntries.size())) { // handle the non jumpto case - //fetch a new page - //System.out.println( "fetching a page starting at " + - // index ); - // CMS.debug("getElementAt noJumpto: getting page index: " + index + " mEntries.size() " + mEntries.size() + " mTop: " + mTop); - getPage(index); - } - - int offset = index - mTop; - - if ((offset < 0) || (offset >= mEntries.size())) - //XXX - return null; //("No entry at " + index); - else - return mEntries.elementAt(offset); - } - - public E getJumpToElementAt(int i) { - return mEntries.elementAt(i); - } - - /** - * This function processes elements as soon as it arrives. It is - * more memory-efficient. - */ - public void processElements(int startidx, int endidx, IElementProcessor ep) - throws EBaseException { - - /* mSize may not be init at this time! Bad ! - * the caller should really check the index is within bound before this - * but I'll take care of this just in case they are too irresponsible - */ - if (!mInitialized) - mSize = getSize(); - - // short-cut the existing code ... :( - if (mJumpTo != null) { - for (int i = startidx; i <= endidx; i++) { - Object element = getJumpToElementAt(i); - - if (element != null) - ep.process(element); - } - return; - } - - //guess this is what you really mean to try to improve performance - if (startidx >= endidx) { - throw new EBaseException("startidx must be less than endidx"); - } else { - setPageSize(endidx - startidx); - getPage(startidx); - } - - for (int i = startidx; i <= endidx; i++) { - Object element = getElementAt(i); - - if (element != null) - ep.process(element); - } - } - - /** - * get the virutal selected index - */ - public int getSelectedIndex() { - return mSelectedIndex; - } - - /** - * get the top of the buffer - */ - public int getFirstIndex() { - return mTop; - } -} |