All Downloads are FREE. Search and download functionalities are using the official Maven repository.

bsh.util.NameCompletionTable Maven / Gradle / Ivy

The newest version!
/*
 * #%L
 * The AIBench Shell Plugin
 * %%
 * Copyright (C) 2006 - 2017 Daniel Glez-Peña and Florentino Fdez-Riverola
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 * 
 * 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 Lesser Public License for more details.
 * 
 * You should have received a copy of the GNU General Lesser Public
 * License along with this program.  If not, see
 * .
 * #L%
 */
/*****************************************************************************
 *                                                                           *
 *  This file is part of the BeanShell Java Scripting distribution.          *
 *  Documentation and updates may be found at http://www.beanshell.org/      *
 *                                                                           *
 *  Sun Public License Notice:                                               *
 *                                                                           *
 *  The contents of this file are subject to the Sun Public License Version  *
 *  1.0 (the "License"); you may not use this file except in compliance with *
 *  the License. A copy of the License is available at http://www.sun.com    * 
 *                                                                           *
 *  The Original Code is BeanShell. The Initial Developer of the Original    *
 *  Code is Pat Niemeyer. Portions created by Pat Niemeyer are Copyright     *
 *  (C) 2000.  All Rights Reserved.                                          *
 *                                                                           *
 *  GNU Public License Notice:                                               *
 *                                                                           *
 *  Alternatively, the contents of this file may be used under the terms of  *
 *  the GNU Lesser General Public License (the "LGPL"), in which case the    *
 *  provisions of LGPL are applicable instead of those above. If you wish to *
 *  allow use of your version of this file only under the  terms of the LGPL *
 *  and not to allow others to use your version of this file under the SPL,  *
 *  indicate your decision by deleting the provisions above and replace      *
 *  them with the notice and other provisions required by the LGPL.  If you  *
 *  do not delete the provisions above, a recipient may use your version of  *
 *  this file under either the SPL or the LGPL.                              *
 *                                                                           *
 *  Patrick Niemeyer ([email protected])                                           *
 *  Author of Learning Java, O'Reilly & Associates                           *
 *  http://www.pat.net/~pat/                                                 *
 *                                                                           *
 *****************************************************************************/

package bsh.util;

import java.util.ArrayList;
import java.util.List;

import bsh.NameSource;
import bsh.StringUtil;

/**
 * NameCompletionTable is a utility that implements simple name completion for a
 * collection of names, NameSources, and other NameCompletionTables. This
 * implementation uses a trivial linear search and comparison...
 */
public class NameCompletionTable extends ArrayList implements NameCompletion {
	/** Unimplemented - need a collection here */
	NameCompletionTable table;

	List sources;

	/** Unimplemented - need a collection of sources here */

	/**
	 */
	public NameCompletionTable() {}

	/**
	 * Add a NameCompletionTable, which is more optimized than the more general
	 * NameSource.
	 * 
	 * @param table the table to be added.
	 */
	public void add(NameCompletionTable table) {
		/** Unimplemented - need a collection here */
		if (this.table != null)
			throw new RuntimeException("Unimplemented usage error");

		this.table = table;
	}

	/**
	 * Add a NameSource which is monitored for names. Unimplemented - behavior
	 * is broken... no updates
	 * 
	 * @param source the source to add.
	 */
	public void add(NameSource source) {
		/*
		 * Unimplemented - Need to add an inner class util here that holds the
		 * source and monitors it by registering a listener
		 */
		if (sources == null)
			sources = new ArrayList();

		sources.add(source);
	}

	/**
	 * Add any matching names to list (including any from other tables).
	 * 
	 * @param part a part of a name.
	 * @param found the list of names found.
	 */
	protected void getMatchingNames(String part, List found) {
		// check our table
		for (int i = 0; i < size(); i++) {
			String name = (String) get(i);
			if (name.startsWith(part))
				found.add(name);
		}

		// Check other tables.
		/** Unimplemented - need a collection here */
		if (table != null)
			table.getMatchingNames(part, found);

		// Check other sources
		// note should add caching in source adapters
		if (sources != null)
			for (int i = 0; i < sources.size(); i++) {
				NameSource src = (NameSource) sources.get(i);
				String[] names = src.getAllNames();
				for (int j = 0; j < names.length; j++)
					if (names[j].startsWith(part))
						found.add(names[j]);

			}
	}

	public String[] completeName(String part) {
		List found = new ArrayList();
		getMatchingNames(part, found);

		if (found.size() == 0)
			return new String[0];

		// Find the max common prefix
		String maxCommon = (String) found.get(0);
		for (int i = 1; i < found.size() && maxCommon.length() > 0; i++) {
			maxCommon = StringUtil.maxCommonPrefix(maxCommon, (String) found.get(i));

			// if maxCommon gets as small as part, stop trying
			if (maxCommon.equals(part))
				break;
		}

		// Return max common or all ambiguous
		if (maxCommon.length() > part.length())
			return new String[] {
				maxCommon
			};
		else
			return (String[]) (found.toArray(new String[0]));
	}

	/*
	 * class SourceCache implements NameSource.Listener { NameSource src;
	 * SourceMonitor( NameSource src ) { this.src = src; } public void
	 * nameSourceChanged( NameSource src ) { } }
	 */
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy