blob: 7edb588b8bef88dfac4f7cb6e5688ca0153e3069 [file] [log] [blame]
/*
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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 General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package org.netbeans.jemmy;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Properties;
/**
*
* Class to store and process a set of timeout values.
*
* @see #setDefault(String, long)
* @see #getDefault(String)
* @see #setTimeout(String, long)
* @see #getTimeout(String)
*
* @author Alexandre Iline (alexandre.iline@oracle.com)
*/
public class Timeouts {
private static final long DELTA_TIME = 100;
private static final Timeouts defaults;
private static double timeoutsScale = -1;
private final Hashtable<String, Long> timeouts;
/**
* Creates empty Timeouts object.
*/
public Timeouts() {
super();
timeouts = new Hashtable<>();
setTimeout("Timeouts.DeltaTimeout", DELTA_TIME);
try {
load();
} catch (IOException ignored) {
}
}
/**
* Stores default timeout value.
*
* @param name Timeout name.
* @param newValue Timeout value.
* @see #getDefault(String)
* @see #initDefault(String, long)
* @see #containsDefault(String)
*/
public static void setDefault(String name, long newValue) {
defaults.setTimeout(name, newValue);
}
/**
* Sets default timeout value if it was not set before.
*
* @param name Timeout name.
* @param newValue Timeout value.
* @see #setDefault(String, long)
* @see #getDefault(String)
* @see #containsDefault(String)
*/
public static void initDefault(String name, long newValue) {
defaults.initTimeout(name, newValue);
}
/**
* Gets default timeout value.
*
* @param name Timeout name.
* @return Timeout value or -1 if timeout is not defined.
* @see #setDefault(String, long)
* @see #initDefault(String, long)
* @see #containsDefault(String)
*/
public static long getDefault(String name) {
return defaults.getTimeout(name);
}
/**
* Check that default timeout value was defined.
*
* @param name Timeout name.
* @return True if timeout has been defined, false otherwise.
* @see #setDefault(String, long)
* @see #getDefault(String)
* @see #initDefault(String, long)
*/
public static boolean containsDefault(String name) {
return defaults.contains(name);
}
static {
defaults = new Timeouts();
}
/**
* Loads default timeouts values.
*
* @param stream Stream to load timeouts from.
* @see org.netbeans.jemmy.Timeouts#loadDefaults(String)
* @see org.netbeans.jemmy.Timeouts#loadDefaults()
* @exception IOException
*/
public void loadDefaults(InputStream stream)
throws IOException {
defaults.load(stream);
}
/**
* Loads default timeouts values from file.
*
* @param fileName File to load timeouts from.
* @see org.netbeans.jemmy.Timeouts#loadDefaults(InputStream)
* @see org.netbeans.jemmy.Timeouts#loadDefaults(String)
* @exception IOException
* @exception FileNotFoundException
*/
public void loadDefaults(String fileName)
throws FileNotFoundException, IOException {
defaults.load(fileName);
}
/**
* Loads default timeouts values. Uses jemmy.timeouts system property to get
* timeouts file.
*
* @see org.netbeans.jemmy.Timeouts#loadDefaults(InputStream)
* @see org.netbeans.jemmy.Timeouts#loadDefaults(String)
* @exception IOException
* @exception FileNotFoundException
*/
public void loadDefaults()
throws FileNotFoundException, IOException {
defaults.load();
}
/**
* Creates Timeout new object by name and getTimeout(name) value.
*
* @param name Timeout name.
* @return a Timeout instance.
*/
public Timeout create(String name) {
return new Timeout(name, getTimeout(name));
}
/**
* Create timeout for "Timeouts.DeltaTimeout" name.
*
* @return a Timeout instance.
*/
public Timeout createDelta() {
return create("Timeouts.DeltaTimeout");
}
/**
* Checks if timeout has already been defined in this timeout instance.
*
* @param name Timeout name.
* @return True if timeout has been defined, false otherwise.
* @see #containsDefault(String)
*/
public boolean contains(String name) {
return timeouts.containsKey(name);
}
/**
* Sets new timeout value.
*
* @param name Timeout name.
* @param newValue Timeout value.
* @return old timeout value
* @see #getTimeout
*/
public long setTimeout(String name, long newValue) {
long oldValue = -1;
if (contains(name)) {
oldValue = getTimeout(name);
}
timeouts.put(name, newValue);
return oldValue;
}
/**
* Gets timeout value. It timeout was not defined in this instance, returns
* default timeout value.
*
* @param name Timeout name.
* @return Timeout value.
* @see #getDefault(String)
* @see #setTimeout
*/
public long getTimeout(String name) {
long timeout;
if (contains(name) && timeouts.get(name) != null) {
timeout = timeouts.get(name);
timeout = (long) ((double) timeout * getTimeoutsScale());
} else if (this != defaults) {
timeout = getDefault(name);
} else {
timeout = -1;
}
return timeout;
}
/**
* Gets "Timeouts.DeltaTimeout" timeout value.
*
* @return Timeout value.
* @see #getDefault(String)
*/
public long getDeltaTimeout() {
return getTimeout("Timeouts.DeltaTimeout");
}
/**
* Sets timeout value if it was not set before.
*
* @param name Timeout name.
* @param newValue Timeout value.
* @return old timeout value
*/
public long initTimeout(String name, long newValue) {
long result = getTimeout(name);
if (!contains(name)) {
setTimeout(name, newValue);
}
return result;
}
/**
* Creates a copy of the current timeouts set.
*
* @return A copy.
*/
public Timeouts cloneThis() {
Timeouts t = new Timeouts();
Enumeration<String> e = timeouts.keys();
String name = "";
while (e.hasMoreElements()) {
name = e.nextElement();
t.setTimeout(name,
getTimeout(name));
}
return t;
}
/**
* Sleeps for the "name" timeout value. Can throw InterruptedException if
* current thread was interrupted.
*
* @param name Timeout name.
* @exception InterruptedException
*/
public void eSleep(String name) throws InterruptedException {
if (contains(name)
|| defaults.contains(name)) {
Thread.sleep(getTimeout(name));
}
}
/**
* Sleeps for the "name" timeout value. Does not throw InterruptedException
* anyway.
*
* @param name Timeout name.
*/
public void sleep(String name) {
create(name).sleep();
}
/**
* Prints all defined timeouts.
*
* @param pw PrintWriter to print into.
*/
public void print(PrintWriter pw) {
Enumeration<String> e = timeouts.keys();
String name = "";
while (e.hasMoreElements()) {
name = e.nextElement();
pw.println(name + " = " + Long.toString(getTimeout(name)));
}
pw.println("Default values:");
e = defaults.timeouts.keys();
name = "";
while (e.hasMoreElements()) {
name = e.nextElement();
if (!contains(name)) {
pw.println(name + " = " + Long.toString(getDefault(name)));
}
}
}
/**
* Prins all defined timeouts.
*
* @param ps PrintStream to print into.
*/
public void print(PrintStream ps) {
print(new PrintWriter(ps));
}
/**
* Loads timeouts values.
*
* @param stream Stream to load timeouts from.
* @see org.netbeans.jemmy.Timeouts#load(String)
* @see org.netbeans.jemmy.Timeouts#load()
* @exception IOException
*/
public void load(InputStream stream)
throws IOException {
Properties props = new Properties();
props.load(stream);
Enumeration<?> propNames = props.propertyNames();
long propValue;
String propName = null;
while (propNames.hasMoreElements()) {
propName = (String) propNames.nextElement();
propValue = Long.parseLong(props.getProperty(propName));
setTimeout(propName, propValue);
}
}
/**
* Loads timeouts values from file.
*
* @param fileName File to load timeouts from.
* @see org.netbeans.jemmy.Timeouts#load(InputStream)
* @see org.netbeans.jemmy.Timeouts#load(String)
* @exception IOException
* @exception FileNotFoundException
*/
public void load(String fileName)
throws FileNotFoundException, IOException {
try (FileInputStream fileInputStream = new FileInputStream(fileName)) {
load(fileInputStream);
}
}
/**
* Loads timeouts values. Uses jemmy.timeouts system property to get
* timeouts file.
*
* @see org.netbeans.jemmy.Timeouts#load(InputStream)
* @see org.netbeans.jemmy.Timeouts#load(String)
* @exception IOException
* @exception FileNotFoundException
*/
public void load()
throws FileNotFoundException, IOException {
if (System.getProperty("jemmy.timeouts") != null
&& !System.getProperty("jemmy.timeouts").equals("")) {
load(System.getProperty("jemmy.timeouts"));
}
}
/**
* Loads debug timeouts values.
*
* @exception IOException
*/
public void loadDebugTimeouts() throws IOException {
load(getClass().getClassLoader().getResourceAsStream("org/netbeans/jemmy/debug.timeouts"));
}
/**
* Get timeouts scale. Uses jemmy.timeouts.scale system property to get the
* value.
*
* @return timeouts scale or 1 if the property is not set.
*/
public static double getTimeoutsScale() {
if (timeoutsScale == -1) {
String s = System.getProperty("jemmy.timeouts.scale", "1");
try {
timeoutsScale = Double.parseDouble(s);
} catch (NumberFormatException e) {
timeoutsScale = 1;
}
}
if (timeoutsScale < 0) {
timeoutsScale = 1;
}
return timeoutsScale;
}
/**
* This method is designed to be used by unit test for testing purpose.
*/
static void resetTimeoutScale() {
timeoutsScale = -1;
}
}