/*
* Lokomo OneCMDB - An Open Source Software for Configuration
* Management of Datacenter Resources
*
* Copyright (C) 2006 Lokomo Systems AB
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*
* Lokomo Systems AB can be contacted via e-mail: info@lokomo.com or via
* paper mail: Lokomo Systems AB, Sv�rdv�gen 27, SE-182 33
* Danderyd, Sweden.
*
*/
package org.onecmdb.core.internal.update;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.UnknownHostException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.onecmdb.core.IModelService;
import org.onecmdb.core.ISession;
import org.onecmdb.core.Version;
import org.onecmdb.core.internal.storage.hibernate.PageInfo;
import org.onecmdb.core.utils.graph.handler.QueryHandler;
import org.onecmdb.core.utils.graph.query.GraphQuery;
import org.onecmdb.core.utils.graph.query.selector.ItemOffspringSelector;
import org.onecmdb.core.utils.graph.result.Graph;
import org.onecmdb.core.utils.graph.result.Template;
public class CheckForUpdate extends Thread {
Log log = LogFactory.getLog(this.getClass());
private ISession session;
private String rootURL;
private String lastResponse;
private long intervall;
private volatile boolean terminate = false;
private int count = 0;
public void setTerminate(boolean terminate) {
this.terminate = terminate;
}
@Override
public void run() {
log.info("Update Checker Started");
try {
Thread.sleep(2*60*1000);
} catch (Throwable t) {
// Ignore..
}
while(!terminate) {
try {
this.lastResponse = getUpdateInfo();
} catch (Throwable e1) {
log.error("Can't check for update " + rootURL + ":" + e1.getMessage());
}
try {
sleep(intervall);
} catch (Throwable e) {
}
}
}
public String getUpdateInfo() throws Throwable {
InputStream in = null;
try {
URL url = generateURL();
log.info("Check for update from " + getRootURL());
in = url.openStream();
String response = getResponse(in);
this.lastResponse = response;
log.info("Response:(" + response.length() + ")" + response);
return(response);
} finally {
if (in != null) {
try {
in.close();
} catch (Throwable t) {
// Silently Ignore.
}
}
}
}
private String getResponse(InputStream in) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder sb = new StringBuilder();
String line = null;
boolean eof = false;
boolean first = true;
while (!eof) {
line = reader.readLine();
if (line == null) {
eof = true;
continue;
}
if (!first) {
sb.append("\n");
first = false;
}
sb.append(line);
}
return sb.toString().trim();
}
private URL generateURL() throws MalformedURLException {
StringBuilder sb = new StringBuilder();
sb.append(rootURL);
// increase count.
count++;
// Add options.
sb.append("?count=" + count + "&id=" + getCMDB_ID() + "&component=core&version=" + Version.VERSION_STRING + "&build=" + Version.BUILD_DATE_STRING + getSizeInfo());
return(new URL(sb.toString().replace(" ", "%20")));
}
private String getSizeInfo() {
int rootCount = -1;
int ciCount = -1;
int refCount = -1;
try {
GraphQuery q = new GraphQuery();
ItemOffspringSelector total = new ItemOffspringSelector("root", "Root");
total.setPrimary(true);
total.setPageInfo(new PageInfo(0,1));
ItemOffspringSelector ci = new ItemOffspringSelector("ci", "Ci");
ci.setPageInfo(new PageInfo(0,1));
ItemOffspringSelector reference = new ItemOffspringSelector("reference", "Reference");
reference.setPageInfo(new PageInfo(0,1));
q.addSelector(total);
q.addSelector(ci);
q.addSelector(reference);
this.session.login();
QueryHandler handler = new QueryHandler(session);
Graph result = handler.execute3(q);
this.session.logout();
Template rootTempl = result.fetchNode("root");
Template ciTempl = result.fetchNode("ci");
Template refTempl = result.fetchNode("reference");
if (rootTempl != null) {
rootCount = rootTempl.getTotalCount();
}
if (ciTempl != null) {
ciCount = ciTempl.getTotalCount();
}
if (refTempl != null) {
refCount = refTempl.getTotalCount();
}
} catch (Throwable t) {
// Ignore...
//t.printStackTrace();
}
return("&root=" + rootCount + "&ci=" + ciCount + "&refs=" + refCount);
}
private String getCMDB_ID() {
String id = "unkown";
try {
InetAddress localhost = InetAddress.getLocalHost();
id = localhost.getHostAddress();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return("" + id.hashCode());
}
public ISession getSession() {
return session;
}
public void setSession(ISession session) {
this.session = session;
}
public String getRootURL() {
return rootURL;
}
public void setRootURL(String rootURL) {
this.rootURL = rootURL;
}
public long getIntervall() {
return intervall;
}
public void setIntervall(long intervall) {
this.intervall = intervall;
}
public String getLastResponse() {
return lastResponse;
}
}