/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General public static
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General public static License for more details.
*
* You should have received a copy of the GNU Lesser General public static
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.adminshell;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Properties;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.teiid.adminapi.*;
import org.teiid.adminapi.Admin.TranlatorPropertyType;
import org.teiid.adminapi.VDB.ConnectionType;
import org.teiid.adminapi.jboss.AdminFactory;
import org.teiid.adminshell.Help.Doc;
/**
* Contextual shell wrapper around the AdminAPI, see {@link Admin}
*/
public class AdminShell {
protected static Logger log = Logger.getLogger(AdminShell.class.getName());
static Properties p;
private static int connectionCount = 1;
static Admin internalAdmin;
private static String currentName;
private static HashMap<String, Admin> connections = new HashMap<String, Admin>();
private static Help help = new Help(AdminShell.class);
@Doc(text="Get a named Admin connection to the specified server")
public static void connectAsAdmin(
@Doc(text = "host - hostname") String host,
@Doc(text = "port - port") int port,
@Doc(text = "username") String username,
@Doc(text = "password") String password,
@Doc(text = "connection name") String connectionName) throws AdminException {
Admin admin = AdminFactory.getInstance().createAdmin(host, port, username, password.toCharArray());
if (admin == null) {
throw new AdminProcessingException("Connection was not successful"); //$NON-NLS-1$
}
internalAdmin = admin;
currentName = connectionName;
Admin old = connections.put(connectionName, internalAdmin);
if (old != null) {
System.out.println("Closing previous admin associated with " + connectionName); //$NON-NLS-1$
old.close();
}
}
@Doc(text = "Connect as Admin using the defaults from connection.properties")
@SuppressWarnings("nls")
public static void connectAsAdmin() throws AdminException {
loadConnectionProperties();
connectAsAdmin(p.getProperty("admin.host", "localhost"), Integer.parseInt(p.getProperty("admin.port", "9990")), p.getProperty("admin.user", "admin"), p.getProperty("admin.password", "admin"), "conn-" + connectionCount++);
}
static void loadConnectionProperties() {
if (p != null) {
return;
}
Properties props = new Properties();
FileInputStream fis = null;
try {
fis = new FileInputStream("connection.properties"); //$NON-NLS-1$
props.load(fis);
} catch (IOException e) {
log.log(Level.WARNING, "Could not load default connection properties.", e); //$NON-NLS-1$
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
}
}
}
p = props;
}
@Doc(text = "Adds a mapped role to the specified data role")
public static void addDataRoleMapping(
@Doc(text = "vdb name") String vdbName,
@Doc(text = "vdb version") Object vdbVersion,
@Doc(text = "dataRole name") String policyName,
@Doc(text = "mapped role name") String role) throws AdminException {
getAdmin().addDataRoleMapping(vdbName, vdbVersion!=null?vdbVersion.toString():null, policyName, role);
}
@Doc(text = "Update a translator and data source for a given source")
public static void updateSource(
@Doc(text = "vdb name") String vdbName,
@Doc(text = "vdb version") Object vdbVersion,
@Doc(text = "source name") String sourceName,
@Doc(text = "translator name") String translatorName,
@Doc(text = "jndi name") String jndiName)
throws AdminException {
getAdmin().updateSource(vdbName, vdbVersion!=null?vdbVersion.toString():null, sourceName, translatorName, jndiName);
}
@Doc(text = "Add a source to a model")
public static void addSource(
@Doc(text = "vdb name") String vdbName,
@Doc(text = "vdb version") Object vdbVersion,
@Doc(text = "model name") String modelName,
@Doc(text = "source name") String sourceName,
@Doc(text = "translator name") String translatorName,
@Doc(text = "jndi name") String jndiName)
throws AdminException {
getAdmin().addSource(vdbName, vdbVersion!=null?vdbVersion.toString():null, modelName, sourceName, translatorName, jndiName);
}
@Doc(text = "Remove a source from a model")
public static void removeSource(
@Doc(text = "vdb name") String vdbName,
@Doc(text = "vdb version") Object vdbVersion,
@Doc(text = "model name") String modelName,
@Doc(text = "source name") String sourceName)
throws AdminException {
getAdmin().removeSource(vdbName, vdbVersion!=null?vdbVersion.toString():null, modelName, sourceName);
}
@Doc(text = "Cancel a request")
public static void cancelRequest(
@Doc(text = "session id") String sessionId,
@Doc(text = "execution id") long executionId)
throws AdminException {
getAdmin().cancelRequest(sessionId, executionId);
}
@Doc(text = "Clear the given cache")
public static void clearCache(
@Doc(text = "cache type") String cacheType) throws AdminException {
getAdmin().clearCache(cacheType);
}
@Doc(text = "Clear the given cache for a VDB")
public static void clearCache(
@Doc(text = "cache type") String cacheType, @Doc(text = "vdb name") String vdbName,
@Doc(text = "vdb version") Object vdbVersion
) throws AdminException {
getAdmin().clearCache(cacheType, vdbName, vdbVersion!=null?vdbVersion.toString():null);
}
@Doc(text = "Undeploy a artifact (JAR, RAR, VDB)")
public static void undeploy(@Doc(text = "deployed name") String deployedName) throws AdminException {
getAdmin().undeploy(deployedName);
}
@Doc(text = "Get all cache type Strings")
public static Collection<String> getCacheTypes() throws AdminException {
return getAdmin().getCacheTypes();
}
@Doc(text = "Change a VDB Connection Type")
public static void changeVDBConnectionType(
@Doc(text = "vdb name") String vdbName,
@Doc(text = "vdb version") Object vdbVersion,
@Doc(text = "Connection Type (NONE, BY_VERSION, or ANY") String type)
throws AdminException {
getAdmin().changeVDBConnectionType(vdbName, vdbVersion!=null?vdbVersion.toString():null, ConnectionType.valueOf(type));
}
@Doc(text = "Get all translator instances")
public static Collection<? extends Translator> getTranslators()
throws AdminException {
return getAdmin().getTranslators();
}
@Doc(text = "Get the specified ConnectionFactory")
public static Translator getTranslator(
@Doc(text = "deployed name") String deployedName)
throws AdminException {
return getAdmin().getTranslator(deployedName);
}
@Doc(text = "Get all PropertyDefinitions for the given template")
public static Collection<? extends PropertyDefinition> getTemplatePropertyDefinitions(
@Doc(text = "template name") String templateName) throws AdminException {
return getAdmin().getTemplatePropertyDefinitions(templateName);
}
@Doc(text = "Get all PropertyDefinitions for the given translator")
public static Collection<? extends PropertyDefinition> getTranslatorPropertyDefinitions(
@Doc(text = "translator name") String translatorName) throws AdminException {
return getAdmin().getTranslatorPropertyDefinitions(translatorName);
}
@Doc(text = "Get all PropertyDefinitions for the given translator")
public static Collection<? extends PropertyDefinition> getTranslatorPropertyDefinitions(
@Doc(text = "translator name") String translatorName, @Doc(text = "type of property IMPPORT, OVERRIDE, EXTENSION_METADATA")String type) throws AdminException {
return getAdmin().getTranslatorPropertyDefinitions(translatorName, TranlatorPropertyType.valueOf(type.toUpperCase()));
}
@Doc(text = "Get all Request instances")
public static Collection<? extends Request> getRequests() throws AdminException {
return getAdmin().getRequests();
}
@Doc(text = "Get all Request instances for the given session")
public static Collection<? extends Request> getRequestsForSession(
@Doc(text = "session id") String sessionId)
throws AdminException {
return getAdmin().getRequestsForSession(sessionId);
}
@Doc(text = "Get all Session instances")
public static Collection<? extends Session> getSessions() throws AdminException {
return getAdmin().getSessions();
}
@Doc(text = "Get all Transaction instances")
public static Collection<? extends Transaction> getTransactions() throws AdminException {
return getAdmin().getTransactions();
}
@Doc(text = "Get a specific VDB")
public static VDB getVDB(
@Doc(text = "vdb name") String vdbName,
@Doc(text = "vdb version") Object vdbVersion) throws AdminException {
return getAdmin().getVDB(vdbName, vdbVersion!=null?vdbVersion.toString():null);
}
@Doc(text = "Get all VDB instances")
public static Collection<? extends VDB> getVDBs() throws AdminException {
return getAdmin().getVDBs();
}
@Doc(text = "Get thread pool statistics for Teiid")
public static Collection<? extends WorkerPoolStatistics> getWorkerPoolStats()
throws AdminException {
return getAdmin().getWorkerPoolStats();
}
@Doc(text = "Get cache statistics for given cache type")
public static Collection<? extends CacheStatistics> getCacheStats(@Doc(text = "cacheType") String identifier)
throws AdminException {
return getAdmin().getCacheStats(identifier);
}
@Doc(text = "Get engine statistics for Teiid")
public static Collection<? extends EngineStatistics> getEngineStats()
throws AdminException {
return getAdmin().getEngineStats();
}
@Doc(text = "Remove a mapped role for the data role")
public static void removeDataRoleMapping(
@Doc(text = "vdb name") String vdbName,
@Doc(text = "vdb version") Object vdbVersion,
@Doc(text = "dataRole name") String policyName,
@Doc(text = "mapped role name") String role) throws AdminException {
getAdmin()
.removeDataRoleMapping(vdbName, vdbVersion!=null?vdbVersion.toString():null, policyName, role);
}
@Doc(text = "Set the any authenticated flag for the data role")
public static void setAnyAuthenticatedForDataRole(
@Doc(text = "vdb name")String vdbName,
@Doc(text = "vdb version")Object vdbVersion,
@Doc(text = "dataRole name")String dataRole,
@Doc(text = "any authenticated") boolean anyAuthenticated) throws AdminException {
getAdmin().setAnyAuthenticatedForDataRole(vdbName, vdbVersion!=null?vdbVersion.toString():null, dataRole, anyAuthenticated);
}
@Doc(text = "Terminate a session and associated requests")
public static void terminateSession(
@Doc(text = "session id") String sessionId) throws AdminException {
getAdmin().terminateSession(sessionId);
}
@Doc(text = "Terminate a transaction")
public static void terminateTransaction(
@Doc(text = "transaction id") String transactionId)
throws AdminException {
getAdmin().terminateTransaction(transactionId);
}
@Doc(text = "Checks if a translator exists")
public static boolean hasTranslator(@Doc(text = "deployed name") String factoryName) throws AdminException {
Collection<? extends Translator> bindings = getAdmin().getTranslators();
for (Translator binding:bindings) {
if (binding.getName().equals(factoryName)) {
return true;
}
}
return false;
}
@Doc(text = "Checks if a VDB exists")
public static boolean hasVDB(
@Doc(text = "vdb name") String vdbName) throws AdminException {
Collection<? extends VDB> vdbs = getAdmin().getVDBs();
for (VDB vdb:vdbs) {
if (vdb.getName().equals(vdbName)) {
return true;
}
}
return false;
}
@Doc(text = "Checks if a specific VDB version exists")
public static boolean hasVDB(
@Doc(text = "vdb name") String vdbName,
@Doc(text = "vdb version") Object vdbVersion) throws AdminException {
Collection<? extends VDB> vdbs = getAdmin().getVDBs();
for (VDB vdb:vdbs) {
if (vdb.getName().equals(vdbName) && vdb.getVersion().equals(vdbVersion)) {
return true;
}
}
return false;
}
/*private static void writeFile(String deployedName, String fileName,
InputStream contents) throws IOException, AdminProcessingException {
if (contents == null) {
throw new AdminProcessingException(deployedName + " not found for exporting");//$NON-NLS-1$
}
ObjectConverterUtil.write(contents, fileName);
}*/
@Doc(text = "Deploy a Artifact (JAR, RAR, VDB) from file")
public static void deploy(@Doc(text = "file name") String vdbFile) throws AdminException, FileNotFoundException {
File file = new File(vdbFile);
FileInputStream fis = new FileInputStream(file);
try {
getAdmin().deploy(file.getName(), fis);
} finally {
try {
fis.close();
} catch (IOException e) {
}
}
}
@Doc(text = "Create a data source from supplied properties")
public static void createDataSource(@Doc(text = "deployed name")String deploymentName, @Doc(text = "template name")String templateName, @Doc(text = "properties")Properties properties) throws AdminException {
getAdmin().createDataSource(deploymentName, templateName, properties);
}
@Doc(text = "Delete data source")
public static void deleteDataSource(@Doc(text = "deployed name")String deployedName) throws AdminException{
getAdmin().deleteDataSource(deployedName);
}
@Doc(text = "Available data sources")
public static Collection<String> getDataSourceNames() throws AdminException{
return getAdmin().getDataSourceNames();
}
public static Properties getDataSource(@Doc(text = "Data Source Name")String deployedName) throws AdminException {
return getAdmin().getDataSource(deployedName);
}
@Doc(text = "Available data source template names")
public static Set<String> getDataSourceTemplateNames() throws AdminException{
return getAdmin().getDataSourceTemplateNames();
}
@Doc(text = "Restart the VDB")
public static void restartVDB(
@Doc(text = "vdb name") String vdbName,
@Doc(text = "vdb version") Object vdbVersion,
@Doc(text = "models") String... models)
throws AdminException {
getAdmin().restartVDB(vdbName, vdbVersion!=null?vdbVersion.toString():null, models);
}
@Doc(text = "Get query execution plan for the given execution id")
public static String getQueryPlan(
@Doc(text = "Session Id") String sessionId,
@Doc(text = "Execution Id") int executionId)
throws AdminException {
return getAdmin().getQueryPlan(sessionId, executionId);
}
@Doc(text = "Get schema for the model")
public static String getSchema(@Doc(text = "vdb name") String vdbName,
@Doc(text = "vdb version") Object vdbVersion,
@Doc(text = "models") String modelName) throws AdminException {
return getAdmin().getSchema(vdbName, vdbVersion!=null?vdbVersion.toString():null, modelName, null, null);
}
@Doc(text = "Restart the server")
public static void restart(){
getAdmin().restart();
}
@Doc(text = "Get the current org.teiid.adminapi.Admin instance for direct use. Note: Used for advanced usecases to bypass AdminShell methods")
public static Admin getAdmin() {
if (internalAdmin == null) {
throw new NullPointerException("Not connected. You must call a \"connectAsAdmin\" method or choose an active connection via \"useConnection\"."); //$NON-NLS-1$
}
return internalAdmin;
}
@Doc(text = "Disconnect the current connection for the server")
public static void disconnect() {
if (internalAdmin != null) {
internalAdmin.close();
internalAdmin = null;
connections.remove(currentName);
currentName = null;
}
}
@Doc(text = "Disconnect all connections from the server")
public static void disconnectAll() {
for (Admin admin : connections.values()) {
admin.close();
}
connections.clear();
internalAdmin = null;
currentName = null;
}
@Doc(text = "Use another connection")
public static void useConnection(
@Doc(text = "connection name") String name) {
Admin admin = connections.get(name);
if (admin == null) {
System.out.println("Warning: connection is not active for " + name); //$NON-NLS-1$
return;
}
internalAdmin = admin;
currentName = name;
}
@Doc(text = "Returns the current connection name")
public static String getConnectionName() {
return currentName;
}
@Doc(text = "Return all connection names")
public static Collection<String> getAllConnections() {
return connections.keySet();
}
@Doc(text = "Show help for all admin methods")
public static void adminHelp() {
help.help();
}
@Doc(text = "Show help for the given admin method")
public static void adminHelp(
@Doc(text = "method name") String method) {
help.help(method);
}
@Doc(text = "Set the profile name for domain mode")
public static void setProfileName(
@Doc(text = "profile name") String profileName) {
getAdmin().setProfileName(profileName);
}
}