package com.karateca.protractor;
import com.intellij.openapi.util.Pair;
import com.intellij.util.EventDispatcher;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.io.IOException;
public class AsyncLocatorTester {
private final ElementorReader elementorReader;
private static final String KEY_PATTERN = "\"?(.*?)\"?";
private static final String VALUE_PATTERN = "(^\\s*\"?)(.*?)(\\s*\"?$)";
private static final String RESULTS_PATTERN = "(\\{\"results\":\\s*\\{)(.+)(}})";
private final EventDispatcher<ChangeListener> myEventDispatcher =
EventDispatcher.create(ChangeListener.class);
public AsyncLocatorTester(ElementorReader elementorReader) {
this.elementorReader = elementorReader;
}
public void testLocator(final String locator) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Pair<String, String> pair = submitRequest(locator);
myEventDispatcher.getMulticaster().stateChanged(new ChangeEvent(pair));
}
});
}
/**
* Register for change events.
*
* @param changeListener The listener to be added.
*/
public void addResultsReadyListener(ChangeListener changeListener) {
myEventDispatcher.addListener(changeListener);
}
private Pair<String, String> submitRequest(String locator) {
String json;
try {
json = elementorReader.read(locator);
} catch (IOException e) {
return new Pair<String, String>(
null,
"Error testing locator: " + e.getMessage()
);
}
// Parse the json string. It looks like this:
// {"results":{"element.all(by.model('yourName')).count()":1}}
String keyAndValue = json.replaceAll(RESULTS_PATTERN, "$2");
// The key / value looks like this. Split at ":
// "element.all(by.model('yourName')).count()":1
int i = keyAndValue.indexOf("\":") + 1;
if (i == 0) {
return null;
}
String keySubstring = keyAndValue.substring(0, i);
String valueSubstring = keyAndValue.substring(i + 1);
return Pair.create(
keySubstring.replaceAll(KEY_PATTERN, "$1"),
valueSubstring.replaceAll(VALUE_PATTERN, "$2")
);
}
}