/*
* ConcourseConnect
* Copyright 2009 Concursive Corporation
* http://www.concursive.com
*
* This file is part of ConcourseConnect, an open source social business
* software and community platform.
*
* Concursive ConcourseConnect is free software: you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, version 3 of the License.
*
* Under the terms of the GNU Affero General Public License you must release the
* complete source code for any application that uses any part of ConcourseConnect
* (system header files and libraries used by the operating system are excluded).
* These terms must be included in any work that has ConcourseConnect components.
* If you are developing and distributing open source applications under the
* GNU Affero General Public License, then you are free to use ConcourseConnect
* under the GNU Affero General Public License.
*
* If you are deploying a web site in which users interact with any portion of
* ConcourseConnect over a network, the complete source code changes must be made
* available. For example, include a link to the source archive directly from
* your web site.
*
* For OEMs, ISVs, SIs and VARs who distribute ConcourseConnect with their
* products, and do not license and distribute their source code under the GNU
* Affero General Public License, Concursive provides a flexible commercial
* license.
*
* To anyone in doubt, we recommend the commercial license. Our commercial license
* is competitively priced and will eliminate any confusion about how
* ConcourseConnect can be used and distributed.
*
* ConcourseConnect 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 Affero General Public License for more
* details.
*
* You should have received a copy of the GNU Affero General Public License
* along with ConcourseConnect. If not, see <http://www.gnu.org/licenses/>.
*
* Attribution Notice: ConcourseConnect is an Original Work of software created
* by Concursive Corporation
*/
package com.concursive.connect.web.utils;
import com.concursive.commons.objects.ObjectUtils;
import com.concursive.commons.text.StringUtils;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
import java.util.StringTokenizer;
/**
* Maintains a trail of terms, resetting to the point where an existing
* term is found
*
* @author matt rajkowski
* @version $Id$
* @created February 24, 2006
*/
public class TrailMap extends ArrayList {
public TrailMap() {
}
/**
* Adds a unique set of parameters, no duplicates and nothing after a duplicate
*
* @param subject
*/
public synchronized void addItem(String subject) {
if (subject == null || "".equals(subject)) {
// Reset the trail
this.clear();
} else {
int index = this.indexOf(subject);
if (index > -1) {
ListIterator li = this.listIterator(index);
// Skip this matching item
li.next();
// Remove the rest
while (li.hasNext()) {
String n = (String) li.next();
li.remove();
}
} else {
// Add to the end
this.add(subject);
}
}
}
public synchronized void addItems(String items) {
if (items == null || "".equals(items)) {
this.clear();
} else {
StringTokenizer st = new StringTokenizer(items, "|");
while (st.hasMoreTokens()) {
this.add(st.nextToken());
}
}
}
public String getTrailParameters() {
return getTrailParameters(null);
}
public String getTrailParameters(String key) {
StringBuffer sb = new StringBuffer();
String previous = null;
Iterator i = this.iterator();
while (i.hasNext()) {
String thisSubject = (String) i.next();
if (thisSubject.equals(key)) {
i.next();
continue;
}
if (!thisSubject.equals(previous)) {
if (sb.length() > 0) {
sb.append("|");
}
sb.append(StringUtils.jsEscape(thisSubject));
}
previous = thisSubject;
}
return sb.toString();
}
public void applyFilters(Object listObject) {
applyFilters(listObject, null);
}
public void applyFilters(Object listObject, String ignore) {
for (int i = 0; i < this.size(); i++) {
if (i % 2 == 0) {
String subject = (String) this.get(i);
String value = (String) this.get(i + 1);
if (ignore == null || !ignore.equals(value)) {
ObjectUtils.setParam(listObject, subject, value);
}
}
}
}
}