import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
import com.datamirror.ea.api.ApiException;
import com.datamirror.ea.api.DataSource;
import com.datamirror.ea.api.DefaultContext;
import com.datamirror.ea.api.RefreshStatisticData;
import com.datamirror.ea.api.RefreshStatisticData.Table;
import com.datamirror.ea.api.ReplicationRole;
import com.datamirror.ea.api.Toolkit;
import com.datamirror.ea.api.publisher.Publisher;
import com.datamirror.ea.api.publisher.Subscription;
/**
* Connects to the source datastore, prints out the refresh statistics for the subscription.
*/
public class MonitorPerformanceRefreshSample
{
public static String ACCESS_SERVER_HOST_TOKEN = -host
; //$NON-NLS-1$
public static String ACCESS_SERVER_PORT_TOKEN = -port
; //$NON-NLS-1$
public static String ACCESS_SERVER_USER_TOKEN = -user
; //$NON-NLS-1$
public static String ACCESS_SERVER_PASSWORD_TOKEN = -password
; //$NON-NLS-1$
public static String SOURCE_DATASTORE_TOKEN = -source
; //$NON-NLS-1$
public static String SUBSCRIPTION_NAME_TOKEN = -subscriptionName
; //$NON-NLS-1$
private DataSource accessServer;
/**
* Runs the sample.
*
* @param host the host name for access server.
* @param port the port number of access server in the host machine.
* @param user the login user name.
* @param password the login password.
* @param sourceDatastore the name of the source datastore.
* @param subscriptionName the name of the subscription on the source.
* @throws ApiException if an error occurred.
*/
public void run(
String host,
String port,
String user,
String password,
String sourceDatastore,
String subscriptionName) throws ApiException
{
try
{
connectAccessServer(host, port, user, password);
if (sourceDatastore != null && sourceDatastore.length() > 0)
{
ReplicationRole datastore = null;
try
{
datastore = connectDatastore(sourceDatastore, true);
RefreshStatisticData statistics = new RefreshStatisticData();
Subscription subscription = ((Publisher) datastore).getSubscription(subscriptionName);
if (subscription != null)
{
subscription.requestRefreshStatistics(statistics);
printCurrentResults(statistics);
}
}
finally
{
disconnectDatastore(datastore);
}
}
}
finally
{
disconnectAccessServer();
}
}
/**
* Prints the current results.
*
* @param statistics the statistics.
*/
public void printCurrentResults(RefreshStatisticData statistics)
{
System.out.println();
DateFormat format = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,
DateFormat.MEDIUM, Locale.getDefault());
System.out.println(Refresh snapshot timestamp:
+
format.format(new Date(statistics.getTimestamp()))); //$NON-NLS-1$
System.out.println(----------------------------------
); //$NON-NLS-1$
System.out.println();
ArrayList<Table> tables = statistics.getTables();
int records = tables.size();
Table table;
for (int row = 0; row < records; row++)
{
table = tables.get(row);
System.out.println(table.toString());
}
System.out.println();
System.out.println();
}
/**
* Connects to a replication agent.
*
* @param datastoreName the name of the datastore.
* @param source true to request source statistics, false to request target statistics.
* @throws ApiException if an error occurred.
*/
public ReplicationRole connectDatastore(String datastoreName, boolean source)
throws ApiException
{
if (accessServer == null || !accessServer.isOpen())
{
throw new ApiException(Connection to Access Server is not established
); //$NON-NLS-1$
}
ReplicationRole datastore;
if (source)
{
datastore = accessServer.getPublisher(datastoreName);
}
else
{
datastore = accessServer.getSubscriber(datastoreName);
}
if (datastore == null)
{
throw new ApiException(Failed to locate a datastore:
+ datastoreName); //$NON-NLS-1$
}
if (!datastore.isConnected())
{
try
{
System.out.println(Connecting to
+ datastoreName + ...
); //$NON-NLS-1$ //$NON-NLS-2$
datastore.connect();
System.out.println(Connected.
); //$NON-NLS-1$
}
catch (ApiException e)
{
throw new ApiException(Failed to connect to datastore
+ datastoreName
+ .
+ e.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
}
}
return datastore;
}
/**
* Disconnects from the datastore.
*
* @param datastore the datastore.
* @throws ApiException If an error occurred
*/
public void disconnectDatastore(ReplicationRole datastore) throws ApiException
{
boolean disconnecting = false;
if (datastore != null && datastore.isConnected())
{
System.out.println(Disconnecting from
+ datastore.getName() + ...
);
disconnecting = true;
datastore.disconnect();
}
if (datastore != null && datastore.isConnected())
{
throw new ApiException(Failed to disconnect from a dataStore
+ datastore.getName()); //$NON-NLS-1$
}
else if (disconnecting)
{
System.out.println(Disconnected.
); //$NON-NLS-1$
}
}
/**
* Connects to access server.
*
* @param host the host name for access server.
* @param port the port number of access server in the host machine.
* @param user the login user name.
* @param password the login password.
* @throws ApiException if an error occurred.
*/
public void connectAccessServer(String host, String port, String user, String password)
throws ApiException
{
try
{
System.out.println(Connecting to Access Server...
); //$NON-NLS-1$
accessServer = Toolkit.getDefaultToolkit().createDataSource();
DefaultContext eaAccessContext = new DefaultContext();
eaAccessContext.setString(DataSource.User, user);
eaAccessContext.setString(DataSource.Password, password);
eaAccessContext.setString(DataSource.Hostname, host);
eaAccessContext.setInt(DataSource.Port, Integer.parseInt(port));
accessServer.connect(eaAccessContext);
System.out.println(Connected.
); //$NON-NLS-1$
}
catch (ApiException e)
{
throw new ApiException(Failed to connect to
+ host + @
+ port
+ as
+ user); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}
/**
* Disconnects from access server.
*
* @throws ApiException if an error occurred.
*/
public void disconnectAccessServer() throws ApiException
{
boolean disconnecting = false;
if (accessServer != null && accessServer.isOpen())
{
System.out.println(Disconnecting from Access Server...
); //$NON-NLS-1$
disconnecting = true;
accessServer.close();
}
if (accessServer != null && accessServer.isOpen())
{
throw new ApiException(Failed to disconnect from AccessServer
); //$NON-NLS-1$
}
else if (disconnecting)
{
System.out.println(Disconnected.
); //$NON-NLS-1$
}
}
/**
* Returns an example of arguments for the class.
*
* @return the help string.
*/
public static String getHelp()
{
String help = java -classpath \
{pathToSample and api.jar}\
+
MonitorPerformanceRefreshSample\n
//$NON-NLS-1$
+ [-host accessServerHost -port accessServerPort]\n
//$NON-NLS-1$
+ -user accessServerUser -password accessServerPassword\n
//$NON-NLS-1$
+ -source sourceDataStoreName -subscriptionName subscriptionName\n
//$NON-NLS-1$
+ If -host or -port are not specified, \localhost\
and \10101\
+
will be used.\n
//$NON-NLS-1$
+ -source and -subscriptionName are required.
; //$NON-NLS-1$
return help;
}
/**
* Returns the named argument's value.
*
* @param args the command line arguments.
* @param name the name of the command line argument.
* @param defaultValue the default value. If null is specified, then an exception
* is thrown if the parameter does not exist.
* @return value for the argument.
* @throws IllegalArgumentException if the argument is missing.
*/
private String getParameter(String[] args, String name, String defaultValue)
throws IllegalArgumentException
{
String parameter = null;
for (int i = 0; i < args.length - 1; i++)
{
if (args[i].equalsIgnoreCase(name))
{
parameter = args[i + 1];
break;
}
}
if (parameter == null)
{
if (defaultValue == null)
{
throw new IllegalArgumentException(Parameter
+ name +
is missing.
); //$NON-NLS-1$ //$NON-NLS-2$
}
else
{
parameter = defaultValue;
}
}
return parameter;
}
public static void main(String[] args)
{
try
{
MonitorPerformanceRefreshSample sample = new MonitorPerformanceRefreshSample();
// Access server connection information.
String host = sample.getParameter(args, ACCESS_SERVER_HOST_TOKEN, localhost
); //$NON-NLS-1$
String port = sample.getParameter(args, ACCESS_SERVER_PORT_TOKEN, 10101
); //$NON-NLS-1$
String user = sample.getParameter(args, ACCESS_SERVER_USER_TOKEN, null);
String password = sample.getParameter(args, ACCESS_SERVER_PASSWORD_TOKEN, null);
// Source information. If the datastore is specified, then the subscription
// name must be as well.
String sourceDatastore = null;
String subscriptionName = null;
sourceDatastore = sample.getParameter(args, SOURCE_DATASTORE_TOKEN, ); //$NON-NLS-1$
if (sourceDatastore != null && sourceDatastore.length() > 0)
{
subscriptionName = sample.getParameter(args, SUBSCRIPTION_NAME_TOKEN, null);
}
if (sourceDatastore.length() == 0)
{
throw new IllegalArgumentException(Parameter
+ SOURCE_DATASTORE_TOKEN //$NON-NLS-1$
+ is required.
); //$NON-NLS-1$
}
sample.run(host, port, user, password, sourceDatastore, subscriptionName);
}
catch (IllegalArgumentException e)
{
System.out.println(MonitorPerformanceRefreshSample.getHelp());
}
catch (Exception e)
{
System.out.println(e.getMessage());
System.out.println();
e.printStackTrace();
}
}
}