blob: af8e4c90fd79d6efc14d5a96d2799c286b746a64 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 Tasktop Technologies and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.discovery.core.model;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.mylyn.internal.discovery.core.util.WebUtil;
import org.osgi.framework.Bundle;
/**
* @author Steffen Pingel
*/
public class DiscoveryFeedbackJob extends Job {
private static String toUrl(Map<String, String> p) throws UnsupportedEncodingException {
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : p.entrySet()) {
if (entry.getValue() != null) {
if (sb.length() > 0) {
sb.append("&"); //$NON-NLS-1$
}
sb.append(entry.getKey());
sb.append("="); //$NON-NLS-1$
sb.append(URLEncoder.encode(entry.getValue(), "UTF-8")); //$NON-NLS-1$
}
}
return sb.toString();
}
private static String getBundleVersion(Bundle bundle) {
if (bundle == null) {
return null;
}
Object bundleVersion = bundle.getHeaders().get("Bundle-Version"); //$NON-NLS-1$
if (bundleVersion == null) {
return null;
}
return stripQualifier((String) bundleVersion);
}
private static Map<String, String> getProperties(ConnectorDescriptor descriptor) {
Map<String, String> p = new LinkedHashMap<String, String>();
p.put("id", descriptor.getId()); //$NON-NLS-1$
p.put("discovery", getBundleVersion(Platform.getBundle("org.eclipse.mylyn"))); //$NON-NLS-1$ //$NON-NLS-2$
p.put("product", System.getProperty("eclipse.product")); //$NON-NLS-1$//$NON-NLS-2$
p.put("buildId", System.getProperty("eclipse.buildId")); //$NON-NLS-1$//$NON-NLS-2$
p.put("os", System.getProperty("osgi.os")); //$NON-NLS-1$ //$NON-NLS-2$
p.put("arch", System.getProperty("osgi.arch")); //$NON-NLS-1$ //$NON-NLS-2$
p.put("ws", System.getProperty("osgi.ws")); //$NON-NLS-1$ //$NON-NLS-2$
p.put("nl", System.getProperty("osgi.nl")); //$NON-NLS-1$ //$NON-NLS-2$
return p;
}
private static String stripQualifier(String longVersion) {
if (longVersion == null) {
return null;
}
String parts[] = longVersion.split("\\."); //$NON-NLS-1$
StringBuilder version = new StringBuilder();
if (parts.length > 0) {
version.append(parts[0]);
if (parts.length > 1) {
version.append("."); //$NON-NLS-1$
version.append(parts[1]);
if (parts.length > 2) {
version.append("."); //$NON-NLS-1$
version.append(parts[2]);
}
}
}
return version.toString();
}
private final List<ConnectorDescriptor> descriptors;
public DiscoveryFeedbackJob(List<ConnectorDescriptor> descriptors) {
super(Messages.DiscoveryFeedbackJob_Job_Label);
Assert.isNotNull(descriptors);
this.descriptors = descriptors;
setSystem(true);
}
private List<URI> getStatUrls() {
List<URI> uris = new ArrayList<URI>(descriptors.size());
for (ConnectorDescriptor descriptor : descriptors) {
try {
StringBuilder sb = new StringBuilder(descriptor.getStatsUrl());
try {
Map<String, String> p = getProperties(descriptor);
String parameters = toUrl(p);
sb.append("?"); //$NON-NLS-1$
sb.append(parameters);
} catch (UnsupportedEncodingException e) {
// ignore, ping the plain url instead
}
URI uri = new URI(sb.toString());
uris.add(uri);
} catch (URISyntaxException e) {
// ignore
}
}
return uris;
}
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
WebUtil.verifyAvailability(getStatUrls(), false, monitor);
} catch (Exception e) {
// ignore
}
return Status.OK_STATUS;
}
}