/******************************************************************************* * Copyright (c) 2006, 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.base.remote; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import org.eclipse.help.AbstractContextProvider; import org.eclipse.help.IContext; import org.eclipse.help.internal.base.HelpBasePlugin; import org.eclipse.help.internal.base.util.ProxyUtil; import org.eclipse.help.internal.context.Context; import org.eclipse.help.internal.dynamic.DocumentReader; /* * Provides the context-sensitive help data that is located on the remote infocenter for a * particular id, if the system is configured for remote help. If not, returns null. */ public class RemoteContextProvider extends AbstractContextProvider { private static final String PATH_CONTEXT = "/context"; //$NON-NLS-1$ private static final String PARAM_ID = "id"; //$NON-NLS-1$ private static final String PARAM_LANG = "lang"; //$NON-NLS-1$ private static final String PROTOCOL = "http"; //$NON-NLS-1$ private DocumentReader reader; @Override public IContext getContext(String id, String locale) { PreferenceFileHandler prefHandler = new PreferenceFileHandler(); String host[] = prefHandler.getHostEntries(); String port[] = prefHandler.getPortEntries(); String path[] = prefHandler.getPathEntries(); String [] protocols = prefHandler.getProtocolEntries(); String isEnabled[] = prefHandler.isEnabled(); // InfoCenters ignore remote content if (RemoteHelp.isEnabled()) { int numICs = host.length; // Total number of hosts //Loop through remote InfoCenters and return first CSH match found URL url=null; for (int i = 0; i < numICs; i++) { if (isEnabled[i].equals("true")) { //$NON-NLS-1$ InputStream in = null; try { HttpURLConnection connection; if(protocols[i].equals(PROTOCOL)) { url = new URL(PROTOCOL, host[i], new Integer(port[i]).intValue(), path[i]+ PATH_CONTEXT + '?' + PARAM_ID + '=' + id + '&' + PARAM_LANG + '=' + locale); connection = (HttpURLConnection)ProxyUtil.getConnection(url); if (connection.getResponseCode() == 200) { in = connection.getInputStream(); } } else { url = HttpsUtility.getHttpsURL(protocols[i], host[i], port[i], path[i]+ PATH_CONTEXT + '?' + PARAM_ID + '=' + id + '&' + PARAM_LANG + '=' + locale); in = HttpsUtility.getHttpsStream(url); } if (reader == null) { reader = new DocumentReader(); } return (Context) reader.read(in); } catch (IOException e) { String msg = "I/O error while trying to contact the remote help server"; //$NON-NLS-1$ HelpBasePlugin.logError(msg, e); } catch (Throwable t) { String msg = "Internal error while reading search results from remote server"; //$NON-NLS-1$ HelpBasePlugin.logError(msg, t); } finally { if (in != null) { try { in.close(); } catch (IOException e) { // nothing more we can do } } } } } } return null; } /* * (non-Javadoc) * * @see org.eclipse.help.AbstractContextProvider#getPlugins() */ @Override public String[] getPlugins() { // this is a global provider return null; } }