/*******************************************************************************
* Copyright (c) 2008, 2012 VMware Inc.
* 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:
* VMware Inc. - initial contribution
*******************************************************************************/
package org.eclipse.virgo.kernel.userregion.internal.management;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipException;
import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
import org.eclipse.virgo.kernel.osgi.quasi.QuasiResolutionFailure;
/**
*
* MBean that allows for the exploration of state dumps using the QuasiFramework
*/
public class JMXQuasiStateDump implements StateDumpMXBean {
private final QuasiFrameworkFactory quasiFrameworkFactory;
public JMXQuasiStateDump(QuasiFrameworkFactory quasiFrameworkFactory) {
this.quasiFrameworkFactory = quasiFrameworkFactory;
}
/**
* {@inheritDoc}
*/
public JMXQuasiResolutionFailure[] getUnresolvedBundleFailures(String dumpFile) {
QuasiFramework quasiFramework = this.getQuasiFramework(dumpFile);
List<JMXQuasiResolutionFailure> fails = new ArrayList<JMXQuasiResolutionFailure>();
List<QuasiBundle> bundles = quasiFramework.getBundles();
for (QuasiBundle quasiBundle : bundles) {
if(!quasiBundle.isResolved()){
List<QuasiResolutionFailure> diagnoses = quasiFramework.diagnose(quasiBundle.getBundleId());
if(diagnoses != null){
for (QuasiResolutionFailure quasiResolutionFailure : diagnoses) {
if(quasiResolutionFailure != null){
fails.add(new JMXQuasiResolutionFailure(quasiResolutionFailure));
}
}
}
}
}
return fails.toArray(new JMXQuasiResolutionFailure[fails.size()]);
}
/**
* {@inheritDoc}
*/
public JMXQuasiMinimalBundle[] listBundles(String dumpFile) {
QuasiFramework quasiFramework = this.getQuasiFramework(dumpFile);
List<QuasiBundle> bundles = quasiFramework.getBundles();
List<JMXQuasiMinimalBundle> jmxBundles = new ArrayList<JMXQuasiMinimalBundle>();
for (QuasiBundle minimalBundleMXBean : bundles) {
jmxBundles.add(new JMXQuasiMinimalBundle(minimalBundleMXBean));
}
return jmxBundles.toArray(new JMXQuasiMinimalBundle[jmxBundles.size()]);
}
/**
* {@inheritDoc}
*/
public JMXQuasiBundle getBundle(String dumpFile, long bundleId) {
if(bundleId < 0){
return null;
}
QuasiFramework quasiFramework = this.getQuasiFramework(dumpFile);
QuasiBundle quasiBundle = quasiFramework.getBundle(bundleId);
return new JMXQuasiBundle(quasiBundle);
}
private QuasiFramework getQuasiFramework(String dumpFile){
File dumpDir = new File(dumpFile);
if(dumpDir.exists() && dumpDir.isDirectory()){
try {
return this.quasiFrameworkFactory.create(dumpDir);
} catch (ZipException e) {
throw new RuntimeException("Unable to extract the state dump: " + e.getMessage(), e);
} catch (IOException e) {
throw new RuntimeException("Error reading the state dump: " + e.getMessage(), e);
}
}
throw new RuntimeException("Not a valid dump directory: " + dumpFile);
}
}