/*******************************************************************************
* 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.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
import org.eclipse.virgo.shell.CommandCompleter;
class AbstractInstallArtifactCompleter implements CommandCompleter {
private static final String SUBCOMMAND_LIST = "list";
private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
private final String type;
private final RuntimeArtifactModelObjectNameCreator objectNameCreator;
public AbstractInstallArtifactCompleter(String type, RuntimeArtifactModelObjectNameCreator objectNameCreator) {
this.type = type;
this.objectNameCreator = objectNameCreator;
}
public final List<String> getCompletionCandidates(String subcommand, String... tokens) {
Set<String> candidates;
if (SUBCOMMAND_LIST.equals(subcommand)) {
candidates = Collections.<String> emptySet();
} else if (tokens.length == 2) {
candidates = versions(tokens[0], tokens[1]);
} else if (tokens.length == 1) {
candidates = names(tokens[0]);
} else {
candidates = Collections.<String> emptySet();
}
filter(candidates, subcommand, tokens);
List<String> candidateList = new ArrayList<String>(candidates);
Collections.sort(candidateList);
return candidateList;
}
/**
* To be over ridden by sub-classes that want to filter the completions to be offered back to the user.
*
* @param candidates
* @param subcommand
* @param tokens
*/
protected void filter(Set<String> candidates, String subcommand, String... tokens) {
}
private Set<String> versions(String name, String version) {
Set<String> candidates = new HashSet<String>();
Set<ObjectName> objectNames = this.server.queryNames(this.objectNameCreator.createArtifactVersionsQuery(this.type, name), null);
for (ObjectName objectName : objectNames) {
String candidateVersion = this.objectNameCreator.getVersion(objectName);
if (candidateVersion.startsWith(version)) {
candidates.add(candidateVersion);
}
}
return candidates;
}
private Set<String> names(String name) {
Set<String> candidates = new HashSet<String>();
Set<ObjectName> objectNames = this.server.queryNames(this.objectNameCreator.createArtifactsOfTypeQuery(this.type), null);
for (ObjectName objectName : objectNames) {
String candidateName = this.objectNameCreator.getName(objectName);
if (candidateName.startsWith(name)) {
candidates.add(candidateName);
}
}
return candidates;
}
}