/******************************************************************************* * Copyright (c) 2008, 2010 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.shell.internal.completers; import java.lang.management.ManagementFactory; import java.util.Iterator; import java.util.Set; import javax.management.InstanceNotFoundException; import javax.management.MBeanServer; import javax.management.ObjectName; import org.osgi.framework.Version; import org.eclipse.equinox.region.Region; import org.eclipse.equinox.region.RegionDigraph; import org.eclipse.virgo.kernel.model.management.ManageableArtifact; import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator; import org.eclipse.virgo.shell.internal.util.ArtifactRetriever; final class ConfigCompleter extends AbstractInstallArtifactCompleter { private static final String TYPE = "configuration"; private static final String COMMAND_EXAMINE = "examine"; private static final String STATE_ACTIVE = "ACTIVE"; private final Region globalRegion; private final MBeanServer server = ManagementFactory.getPlatformMBeanServer(); private final RuntimeArtifactModelObjectNameCreator objectNameCreator; private final ArtifactRetriever<ManageableArtifact> artifactRetriever; public ConfigCompleter(RuntimeArtifactModelObjectNameCreator objectNameCreator, RegionDigraph regionDigraph) { super(TYPE, objectNameCreator); this.objectNameCreator = objectNameCreator; this.globalRegion = regionDigraph.getRegion("global"); this.artifactRetriever = new ArtifactRetriever<ManageableArtifact>(TYPE, objectNameCreator, ManageableArtifact.class); } @Override protected void filter(Set<String> candidates, String subcommand, String... tokens) { if (COMMAND_EXAMINE.equals(subcommand)) { if (tokens.length == 2) { filterVersions(tokens[0], candidates); } else if (tokens.length == 1) { filterNames(candidates); } } } private void filterVersions(String name, Set<String> candidates) { for (Iterator<String> i = candidates.iterator(); i.hasNext();) { try { ManageableArtifact artifact = this.artifactRetriever.getArtifact(name, new Version(i.next()), globalRegion); if (!STATE_ACTIVE.equals(artifact.getState())) { i.remove(); } } catch (InstanceNotFoundException e) { // Swallow to allow others to proceed } } } private void filterNames(Set<String> candidates) { for (Iterator<String> i = candidates.iterator(); i.hasNext();) { ObjectName createArtifactVersionsQuery = this.objectNameCreator.createArtifactVersionsQuery(TYPE, i.next()); Set<ObjectName> objectNames = this.server.queryNames(createArtifactVersionsQuery, null); boolean hasActive = false; for (ObjectName objectName : objectNames) { try { ManageableArtifact artifact = this.artifactRetriever.getArtifact(objectName); if (STATE_ACTIVE.equals(artifact.getState())) { hasActive = true; break; } } catch (InstanceNotFoundException e) { // Swallow to allow others to proceed } } if (!hasActive) { i.remove(); } } } }