You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ace.apache.org by ma...@apache.org on 2013/08/19 16:43:29 UTC
svn commit: r1515450 - in
/ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent:
impl/Activator.java impl/AgentUpdateHandlerImpl.java
impl/UpdateHandlerBase.java updater/Activator.java
Author: marrs
Date: Mon Aug 19 14:43:28 2013
New Revision: 1515450
URL: http://svn.apache.org/r1515450
Log:
ACE-342 Cleaned up the code, some bugfixes, and now caches agents in the bundle cache before attempting an update.
Modified:
ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/Activator.java
ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/AgentUpdateHandlerImpl.java
ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/UpdateHandlerBase.java
ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/updater/Activator.java
Modified: ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/Activator.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/Activator.java?rev=1515450&r1=1515449&r2=1515450&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/Activator.java (original)
+++ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/Activator.java Mon Aug 19 14:43:28 2013
@@ -93,7 +93,7 @@ public class Activator extends Dependenc
}
if (Boolean.parseBoolean(System.getProperty("agent.connectionhandler.disabled"))) {
- service.add(createServiceDependency().setService(DiscoveryHandler.class).setRequired(true));
+ service.add(createServiceDependency().setService(ConnectionHandler.class).setRequired(true));
}
else {
m_connectionHandler = new ConnectionHandlerImpl(this);
Modified: ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/AgentUpdateHandlerImpl.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/AgentUpdateHandlerImpl.java?rev=1515450&r1=1515449&r2=1515450&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/AgentUpdateHandlerImpl.java (original)
+++ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/AgentUpdateHandlerImpl.java Mon Aug 19 14:43:28 2013
@@ -22,6 +22,7 @@ import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
@@ -42,6 +43,7 @@ import org.osgi.framework.Version;
import org.osgi.util.tracker.ServiceTracker;
public class AgentUpdateHandlerImpl extends UpdateHandlerBase implements AgentUpdateHandler {
+ private static final int TIMEOUT = 15000;
private static final String UPDATER_VERSION = "1.0.0";
private static final String UPDATER_SYMBOLICNAME = "org.apache.ace.agent.updater";
private BundleContext m_bundleContext;
@@ -93,23 +95,31 @@ public class AgentUpdateHandlerImpl exte
@Override
public void install(InputStream stream) throws IOException {
try {
- InputStream currentBundleVersion = new ByteArrayInputStream(new byte[0]);
+ InputStream currentBundleVersion = getInputStream(m_bundleContext.getBundle().getVersion());
Bundle bundle = m_bundleContext.installBundle("agent-updater", generateBundle());
bundle.start();
ServiceTracker st = new ServiceTracker(m_bundleContext, m_bundleContext.createFilter("(" + Constants.OBJECTCLASS + "=org.apache.ace.agent.updater.Activator)"), null);
st.open(true);
- Object service = st.waitForService(3000);
+ Object service = st.waitForService(TIMEOUT);
if (service != null) {
Method method = service.getClass().getMethod("update", Bundle.class, InputStream.class, InputStream.class);
System.out.println("Method: " + method);
- method.invoke(service, m_bundleContext.getBundle(), currentBundleVersion, stream);
+ try {
+ method.invoke(service, m_bundleContext.getBundle(), currentBundleVersion, stream);
+ }
+ catch (InvocationTargetException e) {
+ bundle.uninstall();
+ }
+ finally {
+ st.close();
+ }
}
else {
- System.out.println("Error: no service!");
+ throw new IOException("No update service found after launching temporary bundle.");
}
}
catch (Exception e) {
- e.printStackTrace();
+ throw new IOException("Could not update management agent.", e);
}
}
@@ -140,10 +150,16 @@ public class AgentUpdateHandlerImpl exte
}
finally {
if (is != null) {
- is.close();
+ try {
+ is.close();
+ }
+ catch (IOException e) {}
}
if (jos != null) {
- jos.close();
+ try {
+ jos.close();
+ }
+ catch (IOException e) {}
}
}
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
Modified: ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/UpdateHandlerBase.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/UpdateHandlerBase.java?rev=1515450&r1=1515449&r2=1515450&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/UpdateHandlerBase.java (original)
+++ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/UpdateHandlerBase.java Mon Aug 19 14:43:28 2013
@@ -31,25 +31,21 @@ import java.util.TreeSet;
import org.apache.ace.agent.AgentConstants;
import org.apache.ace.agent.DownloadHandle;
import org.apache.ace.agent.RetryAfterException;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.Version;
public class UpdateHandlerBase {
protected AgentContext m_agentContext;
+
public UpdateHandlerBase(AgentContext agentContext) {
m_agentContext = agentContext;
}
protected SortedSet<Version> getAvailableVersions(URL endpoint) throws RetryAfterException, IOException {
-
SortedSet<Version> versions = new TreeSet<Version>();
-
URLConnection connection = null;
BufferedReader reader = null;
try {
connection = getConnection(endpoint);
-
// TODO handle problems and retries
reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String versionString;
@@ -65,43 +61,48 @@ public class UpdateHandlerBase {
return versions;
}
finally {
- if (connection != null && connection instanceof HttpURLConnection)
+ if (connection != null && connection instanceof HttpURLConnection) {
((HttpURLConnection) connection).disconnect();
- if (reader != null)
+ }
+ if (reader != null) {
reader.close();
+ }
}
}
protected long getPackageSize(URL url) throws RetryAfterException, IOException {
long packageSize = -1l;
-
URLConnection urlConnection = null;
InputStream inputStream = null;
try {
urlConnection = url.openConnection();
- if (urlConnection instanceof HttpURLConnection)
+ if (urlConnection instanceof HttpURLConnection) {
((HttpURLConnection) urlConnection).setRequestMethod("HEAD");
+ }
String dpSizeHeader = urlConnection.getHeaderField(AgentConstants.HEADER_DPSIZE);
- if (dpSizeHeader != null)
+ if (dpSizeHeader != null) {
try {
packageSize = Long.parseLong(dpSizeHeader);
}
catch (NumberFormatException e) {
// ignore
}
+ }
return packageSize;
}
finally {
- if (urlConnection != null && urlConnection instanceof HttpURLConnection)
+ if (urlConnection != null && urlConnection instanceof HttpURLConnection) {
((HttpURLConnection) urlConnection).disconnect();
- if (inputStream != null)
+ }
+ if (inputStream != null) {
try {
inputStream.close();
}
catch (IOException e) {
// ignore
}
+ }
}
}
@@ -129,5 +130,4 @@ public class UpdateHandlerBase {
private URLConnection getConnection(URL url) throws IOException {
return m_agentContext.getConnectionHandler().getConnection(url);
}
-
}
Modified: ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/updater/Activator.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/updater/Activator.java?rev=1515450&r1=1515449&r2=1515450&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/updater/Activator.java (original)
+++ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/updater/Activator.java Mon Aug 19 14:43:28 2013
@@ -18,7 +18,12 @@
*/
package org.apache.ace.agent.updater;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
import java.io.InputStream;
+import java.io.OutputStream;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
@@ -33,43 +38,62 @@ import org.osgi.framework.BundleExceptio
* framework. Also, no inner classes are used, to keep all the code in a single class file.
*/
public class Activator implements BundleActivator, Runnable {
+ private static final int BUFFER_SIZE = 4096;
private Object LOCK = new Object();
private BundleContext m_context;
private Thread m_updaterThread;
private InputStream m_oldStream;
private InputStream m_newStream;
private Bundle m_agent;
+ private File m_oldFile;
+ private File m_newFile;
@Override
public void start(BundleContext context) throws Exception {
m_context = context;
m_context.registerService(Activator.class.getName(), this, null);
+ m_oldFile = m_context.getDataFile("old.jar");
+ m_newFile = m_context.getDataFile("new.jar");
}
@Override
public void stop(BundleContext context) throws Exception {
-// Thread thread;
-// synchronized (LOCK) {
-// thread = m_updaterThread;
-// }
-// if (thread != null) {
-// thread.join(10000);
-// }
}
- public void update(Bundle agent, InputStream oldStream, InputStream newStream) {
+ public void update(Bundle agent, InputStream oldStream, InputStream newStream) throws IOException {
synchronized (LOCK) {
m_updaterThread = new Thread(this, "Apache ACE Management Agent Updater");
m_agent = agent;
- m_oldStream = oldStream;
- m_newStream = newStream;
+ copy(oldStream, new FileOutputStream(m_oldFile));
+ copy(newStream, new FileOutputStream(m_newFile));
+ m_oldStream = new FileInputStream(m_oldFile);
+ m_newStream = new FileInputStream(m_newFile);
}
m_updaterThread.start();
}
+ public void copy(InputStream in, OutputStream out) throws IOException {
+ byte[] buffer = new byte[BUFFER_SIZE];
+ int length;
+ try {
+ while ((length = in.read(buffer)) != -1) {
+ out.write(buffer, 0, length);
+ }
+ }
+ finally {
+ try {
+ in.close();
+ }
+ catch (IOException e) {}
+ try {
+ out.close();
+ }
+ catch (IOException e) {}
+ }
+ }
+
@Override
public void run() {
- // TODO First fetch both streams and store them in a file inside the bundle cache.
try {
System.out.println("Updating to " + m_newStream);
m_agent.update(m_newStream);
@@ -78,6 +102,7 @@ public class Activator implements Bundle
try {
System.out.println("Reverting to " + m_oldStream);
m_agent.update(m_oldStream);
+ m_agent.start();
}
catch (BundleException e1) {
// at this point we simply give up