blob: e288ef807135578e9601fddad9877a9dd0fa80ef [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.help.internal.webapp.data;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.help.IToc;
import org.eclipse.help.base.AbstractHelpScope;
import org.eclipse.help.internal.base.scope.ScopeUtils;
import org.eclipse.help.internal.base.util.CriteriaUtilities;
import org.eclipse.help.internal.criteria.CriterionResource;
import org.eclipse.help.internal.webapp.servlet.WebappWorkingSetManager;
import org.eclipse.help.internal.workingset.AdaptableHelpResource;
import org.eclipse.help.internal.workingset.AdaptableToc;
import org.eclipse.help.internal.workingset.AdaptableTocsArray;
import org.eclipse.help.internal.workingset.AdaptableTopic;
import org.eclipse.help.internal.workingset.WorkingSet;
/**
* This class manages help working sets
*/
public class WorkingSetData extends RequestData {
public final static short STATE_UNCHECKED = 0;
public final static short STATE_GRAYED = 1;
public final static short STATE_CHECKED = 2;
private WebappWorkingSetManager wsmgr;
private AdaptableToc[] tocs;
private boolean isEditMode;
private AbstractHelpScope filter;
public WorkingSetData(ServletContext context, HttpServletRequest request,
HttpServletResponse response) {
super(context, request, response);
wsmgr = new WebappWorkingSetManager(request, response, getLocale());
AdaptableTocsArray adaptableTocs = wsmgr.getRoot();
tocs = (AdaptableToc[]) adaptableTocs.getChildren();
isEditMode = "edit".equals(getOperation()); //$NON-NLS-1$
filter = RequestScope.getScope(request, response, true);
}
public boolean isEditMode() {
return isEditMode;
}
public String getWorkingSetName() {
String name = request.getParameter("workingSet"); //$NON-NLS-1$
if (name == null)
name = ""; //$NON-NLS-1$
return name;
}
public WorkingSet getWorkingSet() {
String name = getWorkingSetName();
if (name != null && name.length() > 0)
return wsmgr.getWorkingSet(name);
return null;
}
/**
* Returns the state of the TOC
*
* @return boolean
*/
public short getTocState(int toc) {
if (!isEditMode())
return STATE_UNCHECKED;
WorkingSet ws = getWorkingSet();
if (ws == null)
return STATE_UNCHECKED;
if (toc < 0 || toc >= tocs.length)
return STATE_UNCHECKED;
// See if the toc is in the working set
AdaptableToc adaptableToc = tocs[toc];
AdaptableHelpResource[] elements = ws.getElements();
for (AdaptableHelpResource element : elements) {
if (element == adaptableToc)
return STATE_CHECKED;
}
// Check if it is grayed out
int topics = adaptableToc.getChildren().length;
boolean allTheSame = true;
short baseValue = STATE_UNCHECKED;
// base value is that of the first topic
if (topics > 0)
baseValue = getTopicState(toc, 0);
for (int i = 1; allTheSame && i < topics; i++)
allTheSame = allTheSame && (getTopicState(toc, i) == baseValue);
if (!allTheSame)
return STATE_GRAYED;
return STATE_UNCHECKED;
}
public boolean isTocEnabled(int tocIndex) {
AdaptableToc adaptableToc = tocs[tocIndex];
IToc toc = (IToc) adaptableToc.getAdapter(IToc.class);
return ScopeUtils.showInTree(toc, filter);
}
public boolean isTopicEnabled(int tocIndex, int topicIndex) {
AdaptableToc adaptableToc = tocs[tocIndex];
IToc toc = (IToc) adaptableToc.getAdapter(IToc.class);
return ScopeUtils.showInTree(toc.getTopics()[topicIndex], filter);
}
/**
* Returns the state of the topic. The state is not dependent on the parent
* toc, but only whether it was part of the working set. To get the real
* state, the caller must use the parent state as well. This is not done
* here for performance reasons. In the JSP, by the time one looks at the
* topic, the parent toc has already been processed.
*
* @param toc
* @param topic
* @return short
*/
public short getTopicState(int toc, int topic) {
if (!isEditMode)
return STATE_UNCHECKED;
WorkingSet ws = getWorkingSet();
if (ws == null)
return STATE_UNCHECKED;
if (toc < 0 || toc >= tocs.length)
return STATE_UNCHECKED;
AdaptableToc parent = tocs[toc];
AdaptableTopic[] topics = (AdaptableTopic[]) parent.getChildren();
if (topic < 0 || topic >= topics.length)
return STATE_UNCHECKED;
AdaptableTopic adaptableTopic = topics[topic];
AdaptableHelpResource[] elements = ws.getElements();
for (AdaptableHelpResource element : elements) {
if (element == adaptableTopic)
return STATE_CHECKED;
}
return STATE_UNCHECKED;
}
public String getOperation() {
return request.getParameter("operation"); //$NON-NLS-1$
}
// Accessor methods to avoid exposing help classes directly to JSP.
// Note: this seems ok for now, but maybe we need to reconsider this
// and allow help classes in JSP's.
public int getTocCount() {
return tocs.length;
}
public String getTocLabel(int i) {
return tocs[i].getLabel();
}
public String getTocHref(int i) {
return tocs[i].getHref();
}
public int getTopicCount(int toc) {
return tocs[toc].getTopics().length;
}
public String getTopicLabel(int toc, int topic) {
return tocs[toc].getTopics()[topic].getLabel();
}
public String getDefaultName() {
for (int i = 1; i < 100; i++) {
String name = ServletResources.getString("DefaultScopeName", request) + i; //$NON-NLS-1$
if (wsmgr.getWorkingSet(name) == null) {
return name;
}
}
return ""; //$NON-NLS-1$
}
public boolean isCriteriaScopeEnabled(){
return wsmgr.isCriteriaScopeEnabled();
}
public String[] getCriterionIds() {
return wsmgr.getCriterionIds();
}
public String[] getCriterionValueIds(String criterionId) {
return wsmgr.getCriterionValueIds(criterionId);
}
public String getCriterionDisplayName(String criterionId) {
return wsmgr.getCriterionDisplayName(criterionId);
}
public String getCriterionValueDisplayName(String criterionId, String criterionValueId) {
return wsmgr.getCriterionValueDisplayName(criterionId, criterionValueId);
}
public short getCriterionCategoryState(int index) {
String[] categories = getCriterionIds();
if (!isEditMode())
return STATE_UNCHECKED;
WorkingSet ws = getWorkingSet();
if (ws == null)
return STATE_UNCHECKED;
if (index < 0 || index >= categories.length)
return STATE_UNCHECKED;
String category = categories[index];
Map<String, Set<String>> criteriaMap = new HashMap<String, Set<String>>();
CriterionResource[] criteria = ws.getCriteria();
CriteriaUtilities.addCriteriaToMap(criteriaMap, criteria);
if(!criteriaMap.keySet().contains(category))
return STATE_UNCHECKED;
Set<String> criterionValuesFromWS = criteriaMap.get(category);
Set<String> criterionValuesSet = new HashSet<String>(Arrays.asList(getCriterionValueIds(category)));
if(criterionValuesFromWS.containsAll(criterionValuesSet)){
return STATE_CHECKED;
}else{
return STATE_GRAYED;
}
}
public short getCriterionValueState(int categoryIndex, int valueIndex) {
String[] categories = getCriterionIds();
if (!isEditMode)
return STATE_UNCHECKED;
WorkingSet ws = getWorkingSet();
if (ws == null)
return STATE_UNCHECKED;
if (categoryIndex < 0 || categoryIndex >= categories.length)
return STATE_UNCHECKED;
String category = categories[categoryIndex];
Map<String, Set<String>> criteriaMap = new HashMap<String, Set<String>>();
CriterionResource[] criteria = ws.getCriteria();
CriteriaUtilities.addCriteriaToMap(criteriaMap, criteria);
Set<String> criterionValuesFromWS = criteriaMap.get(category);
String[] crietriaValues = getCriterionValueIds(category);
if (valueIndex < 0 || valueIndex >= crietriaValues.length){
return STATE_UNCHECKED;
}
String relatedCriterionValue = crietriaValues[valueIndex];
if(criterionValuesFromWS.contains(relatedCriterionValue)){
return STATE_CHECKED;
}else{
return STATE_UNCHECKED;
}
}
}