blob: f54d8d0c5a4eb984220b760606ea0bfe07c2838a [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.openejb.util;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Properties;
import org.apache.openejb.loader.IO;
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.observer.Observes;
import org.apache.openejb.observer.event.ObserverAdded;
public class UpdateChecker {
private static final Logger LOGGER = Logger.getInstance(LogCategory.OPENEJB_STARTUP, UpdateChecker.class);
private static final String TOMEE_ARTIFACT = "apache-tomee";
// config
private String repoUrl = SystemInstance.get().getOptions().get("openejb.version.check.repo.url", "http://repo1.maven.org/maven2/");
private String groupId = "org/apache/openejb/";
private String metadata = "/maven-metadata.xml";
private String checkerProxy = SystemInstance.get().getOptions().get("openejb.version.check.proxy", (String) null);
private String auto = "auto";
private String url = SystemInstance.get().getOptions().get("openejb.version.check.url", auto);
private String tag = "release";
private String undefined = "undefined";
private String latest = "undefined";
// internal
private String current = null;
public void check(@Observes ObserverAdded event) {
if (event.getObserver() != this) {
return;
}
String originalProxyHost = null;
String originalProxyPort = null;
String originalProxyUser = null;
String originalProxyPwd = null;
String proxyProtocol = null;
if (checkerProxy != null) {
try {
final URL proxyUrl = new URL(checkerProxy);
proxyProtocol = proxyUrl.getProtocol();
originalProxyHost = System.getProperty(proxyProtocol + ".proxyHost");
originalProxyPort = System.getProperty(proxyProtocol + ".proxyPort");
originalProxyUser = System.getProperty(proxyProtocol + ".proxyUser");
originalProxyPwd = System.getProperty(proxyProtocol + ".proxyPassword");
System.setProperty(proxyProtocol + ".proxyHost", proxyUrl.getHost());
System.setProperty(proxyProtocol + ".proxyPort", Integer.toString(proxyUrl.getPort()));
final String userInfo = proxyUrl.getUserInfo();
if (userInfo != null) {
int sep = userInfo.indexOf(":");
if (sep >= 0) {
System.setProperty(proxyProtocol + ".proxyUser", userInfo.substring(0, sep));
System.setProperty(proxyProtocol + ".proxyPassword", userInfo.substring(sep + 1));
} else {
System.setProperty(proxyProtocol + ".proxyUser", userInfo);
}
}
} catch (MalformedURLException e) {
checkerProxy = null;
}
}
String realUrl = url;
if ("auto".equals(realUrl)) {
realUrl = repoUrl + groupId + artifact() + metadata;
}
try {
final URL url = new URL(realUrl);
final String metaData = IO.slurp(url);
latest = extractLatest(metaData);
if (!usesLatest()) {
LOGGER.warning(message());
}
} catch (Exception e) {
LOGGER.warning("can't check the version: " + e.getMessage()); // don't be too verbose here
} finally {
if (proxyProtocol != null) {
resetSystemProp(proxyProtocol + ".proxyHost", originalProxyHost);
resetSystemProp(proxyProtocol + ".proxyPort", originalProxyPort);
resetSystemProp(proxyProtocol + ".proxyUser", originalProxyUser);
resetSystemProp(proxyProtocol + ".proxyPassword", originalProxyPwd);
}
}
}
private static String artifact() {
try {
UpdateChecker.class.getClassLoader().loadClass("org.apache.tomee.catalina.TomcatWebAppBuilder");
return TOMEE_ARTIFACT;
} catch (ClassNotFoundException e) {
return "openejb";
}
}
private static void resetSystemProp(final String key, final String value) {
if (value == null) {
System.clearProperty(key);
} else {
System.setProperty(key, value);
}
}
private String extractLatest(final String metaData) {
if (metaData != null) {
boolean found = false;
for (String s : metaData.replace(">", ">\n").split("\n")) {
if (found) {
return trim(s).replace("</" + tag + ">", "");
}
if (!s.isEmpty() && trim(s).endsWith("<" + tag + ">")) {
found = true;
}
}
}
return undefined;
}
private String trim(final String s) {
return s.replace("\t", "").replace(" ", "");
}
public boolean usesLatest() {
if (artifact().contains(TOMEE_ARTIFACT)) {
final InputStream is = getClass().getClassLoader().getResourceAsStream("META-INF/maven/org.apache.openejb/tomee-catalina/pom.properties");
if (is != null) {
final Properties prop = new Properties();
try {
prop.load(is);
current = prop.getProperty("version");
} catch (IOException e) {
LOGGER.error("can't get tomee version, will use openejb one");
}
}
}
if (current == null) {
current = OpenEjbVersion.get().getVersion();
}
return current.equals(latest);
}
public String message() {
if (undefined.equals(latest)) {
return "can't determine the latest version";
}
if (current.equals(latest)) {
return "running on the latest version";
}
return new StringBuilder("you are using the version ").append(current)
.append(", our latest stable version ").append(latest)
.append(" is available on ").append(repoUrl).toString();
}
public void setRepoUrl(final String repoUrl) {
this.repoUrl = repoUrl;
}
public void setGroupId(final String groupId) {
this.groupId = groupId;
}
public void setMetadata(final String metadata) {
this.metadata = metadata;
}
public void setCheckerProxy(final String checkerProxy) {
this.checkerProxy = checkerProxy;
}
public void setAuto(final String auto) {
this.auto = auto;
}
public void setUrl(final String url) {
this.url = url;
}
public void setTag(final String tag) {
this.tag = tag;
}
public void setUndefined(final String undefined) {
this.undefined = undefined;
}
public void setLatest(final String latest) {
this.latest = latest;
}
}