/* The contents of this file are subject to the terms
* of the Common Development and Distribution License
* (the License). You may not use this file except in
* compliance with the License.
*
* You can obtain a copy of the License at
* http://www.sun.com/cddl/cddl.html or
* install_dir/legal/LICENSE
* See the License for the specific language governing
* permission and limitations under the License.
*
* When distributing Covered Code, include this CDDL
* Header Notice in each file and include the License file
* at install_dir/legal/LICENSE.
* If applicable, add the following below the CDDL Header,
* with the fields enclosed by brackets [] replaced by
* your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* Copyright 2005-2009 Sun Microsystems Inc. All Rights Reserved
*/
package com.sun.tools;
import com.sun.faban.common.Command;
import com.sun.faban.common.CommandHandle;
import com.sun.faban.harness.ConfigurationException;
import com.sun.faban.harness.Context;
import com.sun.faban.harness.Configure;
import com.sun.faban.harness.RunContext;
import com.sun.faban.harness.Start;
import com.sun.faban.harness.Stop;
import com.sun.faban.harness.tools.ToolContext;
import java.io.File;
import java.io.IOException;
import java.rmi.RemoteException;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* OracleTool is an abstract class for Oracle tools to extend.
* It provides the basic functionality typical Oracle tools.
*
* @author Akara Sucharitakul modified by Sheetal Patil
*/
public abstract class OracleTool {
private static Logger logger =
Logger.getLogger(OracleTool.class.getName());
/** Injected tool context. */
@Context public ToolContext ctx;
Command cmd;
CommandHandle processRef;
ArrayList<String> toolCmd;
String toolName;
String snapId;
/**
* This is the method that should get the arguments to
* call the tool with.
*
*/
@Configure public void configure() throws ConfigurationException {
toolName = ctx.getToolName();
String oracleHome = ctx.getServiceProperty("serverHome");
if(oracleHome == null || oracleHome.trim().length() <= 0) {
throw new ConfigurationException("Oracle DB serverHome property is not provided");
}
String oracleSid = ctx.getServiceProperty("serverId");
if(oracleSid == null || oracleSid.trim().length() <= 0){
throw new ConfigurationException("Oracle DB serverId is not provided");
}
String oracleBin = oracleHome + "bin" + File.separator;
// Prepare the environment
String[] env = new String[4];
env[0] = "ORACLE_HOME=" + oracleHome;
env[1] = "ORACLE_SID=" + oracleSid;
env[2] = "LD_LIBRARY_PATH=" + oracleHome + "lib";
env[3] = "LD_LIBRARY_PATH_64=" + oracleHome + "lib";
// Prepare the input
String stdin = "/ as sysdba\n" +
getSnapCommand() + "\n" +
"exit\n";
// Prepare the command
toolCmd.add(oracleBin);
toolCmd.add("sqlplus");
cmd = new Command(toolCmd);
cmd.setOutputFile(Command.STDOUT, ctx.getOutputFile());
cmd.setEnvironment(env);
cmd.setInput(stdin.getBytes());
}
/**
* Creates a sqlplus command to create tool snapshot.
* @return The sqlplus command string
*/
protected abstract String getSnapCommand();
/**
* The parseSnapId method parses the sqlplus stdout and finds the
* snapshot just taken.
* @param output The stdout from sqlplus where a snapshot has been taken
* @return The snapshot id pertaining to the snapshot just taken.
*/
protected String parseSnapId(byte[] output) {
String snapId = null;
String o = new String(output);
StringTokenizer t = new StringTokenizer(o, "\n");
// Find SNAPID
while (t.hasMoreTokens()) {
String hdr = t.nextToken().trim();
if ("SNAPID".equals(hdr))
break;
}
// Line with separator '------------'
if (t.hasMoreTokens())
t.nextToken();
// The line with the actual id.
if (t.hasMoreTokens())
snapId = t.nextToken().trim();
return snapId;
}
/**
* Creates a sqlplus command to create a tool report.
* @param snapId The id of the first snap
* @param snapId1 The id of the second snap
* @param outputFile The output file
* @return The sqlplus command string
*/
protected abstract String getReportCommand(String snapId, String snapId1,
String outputFile);
/**
* Starts up a Oracle DB monitoring tool.
* @throws IOException Error executing tool
* @throws InterruptedException Monitoring tool interrupted
*/
@Start public void start() throws IOException, InterruptedException {
processRef = RunContext.exec(cmd);
snapId = parseSnapId(processRef.fetchOutput(Command.STDOUT));
logger.fine(toolName + " Started with Cmd = " + toolCmd);
}
/**
* Stops the Oracle DB monitoring tool.
* @throws IOException Error stopping tool
*/
@Stop public void stop() throws IOException {
try {
processRef = RunContext.exec(cmd);
String snapId1 = parseSnapId(processRef.fetchOutput(Command.STDOUT));
logger.finer("snapId1: " + snapId1);
// Prepare the input
String stdin = "/ as sysdba\n" +
getReportCommand(snapId, snapId1, ctx.getOutputFile()) + "\n" +
"exit\n";
cmd.setInput(stdin.getBytes());
cmd.setLogLevel(Command.STDOUT, Level.FINER);
logger.fine("Stopping tool " + this.toolCmd);
processRef = RunContext.exec(cmd);
processRef.destroy();
processRef.waitFor(10000);
} catch (InterruptedException ex) {
logger.log(Level.SEVERE, null, ex);
} catch (RemoteException ex) {
logger.log(Level.SEVERE, null, ex);
}
}
}