blob: d841f57e3fa68caca7e3789b8e6a4e8eb0c0b824 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2016 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.help.internal.webapp.data;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.help.HelpSystem;
import org.eclipse.help.base.AbstractHelpScope;
import org.eclipse.help.internal.base.HelpBasePlugin;
import org.eclipse.help.internal.base.HelpBaseResources;
import org.eclipse.help.internal.base.IHelpBaseConstants;
import org.eclipse.help.internal.base.scope.EnablementScope;
import org.eclipse.help.internal.base.scope.FilterScope;
import org.eclipse.help.internal.base.scope.IntersectionScope;
import org.eclipse.help.internal.base.scope.ScopeRegistry;
import org.eclipse.help.internal.base.scope.UniversalScope;
import org.eclipse.help.internal.base.scope.WorkingSetScope;
import org.eclipse.help.internal.util.ProductPreferences;
import org.eclipse.help.internal.util.URLCoder;
import org.eclipse.help.internal.webapp.servlet.CookieUtil;
import org.eclipse.help.internal.webapp.servlet.WebappWorkingSetManager;
import org.osgi.service.prefs.BackingStoreException;
public class RequestScope {
private static final String SCOPE_PARAMETER_NAME = "scope"; //$NON-NLS-1$
private static final String SCOPE_COOKIE_NAME = "filter"; //$NON-NLS-1$
/**
* Gets a scope object based upon the preferences and request
* @param isSearchFilter is true if this filter will be used to filter search results.
* Search results are already filtered by search scope and if this parameter is true search
* scopes will not be considered
* @return
*/
public static AbstractHelpScope getScope(HttpServletRequest req, HttpServletResponse resp, boolean isSearchFilter ) {
AbstractHelpScope[] scopeArray;
scopeArray = getActiveScopes(req, resp, isSearchFilter);
switch (scopeArray.length) {
case 0:
return new UniversalScope();
case 1:
return scopeArray[0];
default:
return new IntersectionScope(
scopeArray);
}
}
public static AbstractHelpScope[] getActiveScopes(HttpServletRequest req,
HttpServletResponse resp, boolean isSearchFilter) {
AbstractHelpScope[] scopeArray;
String scopeString;
List<AbstractHelpScope> scopes = new ArrayList<>();
if (ProductPreferences.useEnablementFilters()) {
scopes.add(new FilterScope()); // Workbench is always filtered, infocenter may be
}
scopeString = getScopeString(req);
if (scopeString != null) {
AbstractHelpScope scope = ScopeRegistry.getInstance().parseScopePhrase(scopeString);
if (scope != null) {
scopes.add(scope);
}
}
// If not in infocenter mode test whether disabled topics should be displayed
if (!HelpSystem.isShared() && HelpBasePlugin.getActivitySupport().isFilteringEnabled()) {
scopes.add(new EnablementScope());
}
// Add filter by search scope if not called from Help View
boolean isHelpViewTopic = "/ntopic".equals(req.getServletPath()); //$NON-NLS-1$
if (!isSearchFilter && !isHelpViewTopic) {
// Try for a working set
try {
WebappWorkingSetManager manager = new WebappWorkingSetManager(req,
resp, UrlUtil.getLocale(req, resp));
String wset = manager.getCurrentWorkingSet();
if (wset != null && wset.length() > 0) {
WorkingSetScope workingSetScope = new WorkingSetScope(wset,
manager, HelpBaseResources.SearchScopeFilterName);
scopes.add(workingSetScope);
}
} catch (Exception e) {
}
}
scopeArray = scopes.toArray(new AbstractHelpScope[scopes.size()]);
return scopeArray;
}
private static String getScopeString(HttpServletRequest req) {
String scopeString;
if (HelpSystem.isShared()) {
scopeString = getScopeFromCookies(req);
} else {
scopeString = getScopeFromPreferences();
if (scopeString == null) {
scopeString = ScopeRegistry.ENABLEMENT_SCOPE_ID;
}
}
return scopeString;
}
public static void setScopeFromRequest(HttpServletRequest request, HttpServletResponse response) {
// See if there is a scope parameter, if so save as cookie or preference
String[] phrases = request.getParameterValues(SCOPE_PARAMETER_NAME);
String scopeStr = ""; //$NON-NLS-1$
if (phrases!=null){
// AbstractHelpScope scope = ScopeRegistry.getInstance().parseScopePhrases(phrases);
for (int p=0;p<phrases.length;p++)
{
if (!(phrases[p].startsWith("(") && !phrases[p].startsWith("("))) //$NON-NLS-1$ //$NON-NLS-2$
phrases[p] = '('+phrases[p]+')';
scopeStr+=phrases[p];
if (p<phrases.length-1)
scopeStr+=ScopeRegistry.SCOPE_AND;
}
}
CookieUtil.deleteObsoleteCookies(request, response);
saveScope(scopeStr, request, response);
}
public static void saveScope(String scope, HttpServletRequest request, HttpServletResponse response) {
if (HelpSystem.isShared()) {
if (response != null) {
CookieUtil.setCookieValue(SCOPE_COOKIE_NAME, URLCoder.compactEncode(scope), request, response);
}
} else {
IEclipsePreferences pref = InstanceScope.INSTANCE.getNode(HelpBasePlugin.PLUGIN_ID);
pref.put(IHelpBaseConstants.P_KEY_HELP_SCOPE, scope);
try {
pref.flush();
} catch (BackingStoreException e) {
}
}
}
private static String getScopeFromCookies(HttpServletRequest request) {
return getValueFromCookies(request, SCOPE_COOKIE_NAME);
}
private static String getValueFromCookies(HttpServletRequest request, String cookieName) {
// check if scope was passed earlier in this session
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookieName.equals(cookie.getName())) {
return URLCoder.decode(cookie.getValue());
}
}
}
return null;
}
private static String getScopeFromPreferences() {
String scope = Platform.getPreferencesService().getString
(HelpBasePlugin.PLUGIN_ID, IHelpBaseConstants.P_KEY_HELP_SCOPE, null, null);
return scope;
}
public static boolean filterBySearchScope(HttpServletRequest request) {
return true;
}
public static boolean getFlag(HttpServletRequest request, String flagName ) {
String value;
if (HelpSystem.isShared()) {
value = getValueFromCookies(request, flagName);
} else {
value = Platform.getPreferencesService().getString
(HelpBasePlugin.PLUGIN_ID, flagName + "Webapp", null, null); //$NON-NLS-1$
}
if (value == null) {
return Platform.getPreferencesService().getBoolean
(HelpBasePlugin.PLUGIN_ID, flagName, false, null);
}
return "true".equalsIgnoreCase(value); //$NON-NLS-1$
}
public static void setFlag(HttpServletRequest request,
HttpServletResponse response,
String flagName,
boolean value)
{
if (HelpSystem.isShared()) {
CookieUtil.setCookieValueWithoutPath(flagName, Boolean.toString(value), request, response);
} else {
IEclipsePreferences pref = InstanceScope.INSTANCE.getNode(HelpBasePlugin.PLUGIN_ID);
pref.putBoolean(flagName + "Webapp", value ); //$NON-NLS-1$
try {
pref.flush();
} catch (BackingStoreException e) {
}
}
}
}