bug6135: improve WebDriver session handling;

use only one WebDriver instance with multiple windows;
handle quit/close and be more resilient against driver session already
terminated
This commit is contained in:
Axel Uhl
2025-07-02 16:34:14 +02:00
parent da042c7e4d
commit fdcea884a4
24 changed files with 110 additions and 240 deletions
@@ -32,23 +32,20 @@ public class WebDriverWindow {
public void close() {
WebDriver driver = switchToWindow();
driver.close();
this.handle = null;
}
public WebDriver switchToWindow() {
checkForClosed();
TargetLocator locator = this.driver.switchTo();
return locator.window(this.handle);
}
private void checkForClosed() {
Set<String> handles = this.driver.getWindowHandles();
if(!handles.contains(this.handle))
if (!handles.contains(this.handle)) {
throw new WebDriverException("Window closed or not initialized"); //$NON-NLS-1$
}
}
public WebDriver getWebDriver() {
@@ -7,7 +7,12 @@ import java.util.function.Consumer;
import java.util.function.Supplier;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.NoSuchSessionException;
import org.openqa.selenium.SessionNotCreatedException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.support.ui.WebDriverWait;
/**
* <p></p>
@@ -41,17 +46,17 @@ public class WindowManager {
return this.driver;
}
/**
* This is the old, currently unused code superseded by {@link #withExtraWindow(WebDriver, BiConsumer)}.
*/
public void withExtraWindow(BiConsumer<WebDriverWindow, WebDriverWindow> defaultAndExtraWindow) {
// ensures that a default window exists
getDefaultWebDriver();
final WebDriver extraDriver = webDriverFactory.get();
final WebDriverWindow extraWindow = new ManagedWebDriverWindow(extraDriver, extraDriver.getWindowHandle());
extraWindow.switchToWindow();
setWindowMaximized(extraDriver);
defaultWindow.switchToWindow();
defaultAndExtraWindow.accept(defaultWindow, extraWindow);
try {
// quit is explicitly not called in a finally block to ensure that both windows are still open
@@ -62,6 +67,54 @@ public class WindowManager {
// This call may fail depending on the WebDriver being used
}
}
/**
* New version of {@link #withExtraWindow(BiConsumer)} that uses the WebDriver passed as parameter and uses
* a single {@link WebDriver} for both windows.
*/
public void withExtraWindow(WebDriver driver, BiConsumer<WebDriverWindow, WebDriverWindow> defaultAndExtraWindow) {
String originalWindowHandle = driver.getWindowHandle();
// Open a new window using JavaScript
((JavascriptExecutor) driver).executeScript("window.open('about:blank','_blank');");
// Wait until the new window appears
new WebDriverWait(driver, /* seconds */ 5).until(d -> d.getWindowHandles().size() > 1);
// Identify the new window handle
String extraWindowHandle = driver.getWindowHandles().stream()
.filter(handle -> !handle.equals(originalWindowHandle))
.findFirst()
.orElseThrow(() -> new RuntimeException("New window did not open"));
final WebDriverWindow defaultWindow = new ManagedWebDriverWindow(driver, originalWindowHandle);
final WebDriverWindow extraWindow = new ManagedWebDriverWindow(driver, extraWindowHandle);
try {
extraWindow.switchToWindow();
setWindowMaximized(driver);
// Switch back to default window before calling the test logic
defaultWindow.switchToWindow();
// Run the test logic
defaultAndExtraWindow.accept(defaultWindow, extraWindow);
} finally {
// Close the extra window and switch back to the original
try {
extraWindow.switchToWindow();
driver.close();
} catch (Exception ignored) {}
// This call may fail depending on the WebDriver being used
try {
defaultWindow.switchToWindow();
} catch (Exception ignored) {
// This call may fail depending on the WebDriver being used
}
}
}
private boolean isDriverAlive(WebDriver driver) {
try {
driver.getWindowHandles();
return true;
} catch (NoSuchSessionException | SessionNotCreatedException e) {
return false;
}
}
private void setWindowMaximized(WebDriver driver) {
try {
@@ -94,11 +147,14 @@ public class WindowManager {
@Override
public void close() {
allWindows.remove(this);
if (this == defaultWindow) {
defaultWindow = null;
driver = null;
final WebDriver myDriver = driver;
if (isDriverAlive(myDriver)) {
try {
super.close();
} catch (WebDriverException e) {
// If the window is already closed, we ignore the exception
}
}
super.close();
}
}
}
@@ -13,6 +13,8 @@ import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle;
import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.JavascriptExecutor;
@@ -38,6 +40,7 @@ import com.sap.sse.common.impl.MillisecondsTimePoint;
* D049941
*/
@UseSeleniumExtensions
@TestInstance(Lifecycle.PER_METHOD)
public abstract class AbstractSeleniumTest {
private static final Logger logger = Logger.getLogger(AbstractSeleniumTest.class.getName());
@@ -71,7 +71,7 @@ public class TestRefreshableSelectionModel extends AbstractSeleniumTest {
@SeleniumTestCase
public void testMaintenanceOfSelectionAfterDataChanges() {
this.environment.getWindowManager().withExtraWindow((windowForSelection, windowForEdit) -> {
this.environment.getWindowManager().withExtraWindow(getWebDriver(), (windowForSelection, windowForEdit) -> {
final WebDriver windowForEditDriver = windowForEdit.switchToWindow();
setUpAuthenticatedSession(windowForEditDriver);
final TrackedRacesCompetitorsPanelPO competitorsPanel = goToCompetitorsPanel(
@@ -190,7 +190,7 @@ public class TestRefreshableSelectionModel extends AbstractSeleniumTest {
@SeleniumTestCase
public void testRefreshOfDependingUIElements() {
this.environment.getWindowManager().withExtraWindow((windowForSelection, windowForEdit) -> {
this.environment.getWindowManager().withExtraWindow(getWebDriver(), (windowForSelection, windowForEdit) -> {
setUpTestRefreshOfDependingUIElements();
AdminConsolePage adminConsole = AdminConsolePage.goToPage(getWebDriver(), getContextRoot());
SmartphoneTrackingEventManagementPanelPO smartphoneTrackingPanel = adminConsole.goToSmartphoneTrackingPanel();
@@ -72,7 +72,7 @@ public class TestLeaderboardConfiguration extends AbstractSeleniumTest {
@SeleniumTestCase
public void testDynamicRaceLinking() {
this.environment.getWindowManager().withExtraWindow((leaderboardWindow, adminConsoleWindow) -> {
this.environment.getWindowManager().withExtraWindow(getWebDriver(), (leaderboardWindow, adminConsoleWindow) -> {
// Open the leaderboard and check for "empty" leaderboard
LeaderboardPage leaderboard = LeaderboardPage.goToPage(getWebDriver(), getContextRoot(), LEADERBOARD, false);
LeaderboardTablePO table = leaderboard.getLeaderboardTable();
@@ -110,7 +110,7 @@ public class TestLeaderboardConfiguration extends AbstractSeleniumTest {
@SeleniumTestCase
public void testDynamicRaceDeletion() {
this.environment.getWindowManager().withExtraWindow((adminConsoleWindow, leaderboardWindow) -> {
this.environment.getWindowManager().withExtraWindow(getWebDriver(), (adminConsoleWindow, leaderboardWindow) -> {
// Go to the administration console and link all 5 races
AdminConsolePage adminConsole = AdminConsolePage.goToPage(getWebDriver(), getContextRoot());
LeaderboardConfigurationPanelPO leaderboardConfiguration = adminConsole.goToLeaderboardConfiguration();
@@ -145,7 +145,7 @@ public class TestLeaderboardConfiguration extends AbstractSeleniumTest {
@Disabled("This test belongs to bug 1892 and currently fails. It is currently enabled on branch bug1892.")
@SeleniumTestCase
public void testDynamicRenamingOfRace() {
this.environment.getWindowManager().withExtraWindow((adminConsoleWindow, leaderboardWindow) -> {
this.environment.getWindowManager().withExtraWindow(getWebDriver(), (adminConsoleWindow, leaderboardWindow) -> {
// Go to the administration console and link all 5 races
AdminConsolePage adminConsole = AdminConsolePage.goToPage(getWebDriver(), getContextRoot());
LeaderboardConfigurationPanelPO leaderboardConfiguration = adminConsole.goToLeaderboardConfiguration();
@@ -60,7 +60,7 @@ public class TestSwitchingOffStartOfRaceInference extends AbstractSeleniumTest {
@SeleniumTestCase
public void testCorrectDisplayOfRaceColumnWithAndWithoutStartTimeInference() {
this.environment.getWindowManager().withExtraWindow((adminConsoleWindow, leaderboardWindow) -> {
this.environment.getWindowManager().withExtraWindow(getWebDriver(), (adminConsoleWindow, leaderboardWindow) -> {
final WebDriver leaderboardWindowDriver = leaderboardWindow.switchToWindow();
setUpAuthenticatedSession(leaderboardWindowDriver);
LeaderboardPage leaderboard = LeaderboardPage.goToPage(leaderboardWindowDriver, getContextRoot(), LEADERBOARD, /* race details */ false);
@@ -179,6 +179,8 @@
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp.source@default:default"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
@@ -185,6 +185,8 @@
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp.source@default:default"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
@@ -185,6 +185,8 @@
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp.source@default:default"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
@@ -178,6 +178,8 @@
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp.source@default:default"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
@@ -183,6 +183,8 @@
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp.source@default:default"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
@@ -182,6 +182,8 @@
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp.source@default:default"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
@@ -176,6 +176,8 @@
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp.source@default:default"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
@@ -172,6 +172,8 @@
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp.source@default:default"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
@@ -178,6 +178,8 @@
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp.source@default:default"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
@@ -176,6 +176,8 @@
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp.source@default:default"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
@@ -178,6 +178,8 @@
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp.source@default:default"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
@@ -176,6 +176,8 @@
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp.source@default:default"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
@@ -176,6 +176,8 @@
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp.source@default:default"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
@@ -172,6 +172,8 @@
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp.source@default:default"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
@@ -181,6 +181,8 @@
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp.source@default:default"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
@@ -178,6 +178,8 @@
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp.source@default:default"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
@@ -178,6 +178,8 @@
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp.source@default:default"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
@@ -185,6 +185,8 @@
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp.source@default:default"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
@@ -254,228 +256,6 @@
<setEntry value="com.nulab-inc.zxcvbn@default:default"/>
<setEntry value="com.nulab-inc.zxcvbn.source@default:default"/>
</setAttribute>
=======
<setEntry value="routeconverter@default:default"/>
<setEntry value="org.apache.commons.codec@default:default"/>
<setEntry value="org.apache.poi@default:default"/>
<setEntry value="org.apache.poi.ooxml@default:default"/>
<setEntry value="org.apache.poi.ooxml.schemas@default:default"/>
<setEntry value="org.apache.commons.collections4@default:default"/>
<setEntry value="org.apache.commons.compress@default:default"/>
<setEntry value="org.apache.poi.source@default:default"/>
<setEntry value="org.apache.poi.ooxml.source@default:default"/>
<setEntry value="org.apache.commons.collections4.source@default:default"/>
<setEntry value="org.apache.commons.compress.source@default:default"/>
<setEntry value="org.dom4j@default:default"/>
<setEntry value="org.apache.xmlbeans@default:default"/>
<setEntry value="org.apache.commons.math@default:default"/>
<setEntry value="org.apache.httpcomponents.httpclient@default:default"/>
<setEntry value="org.apache.httpcomponents.httpcore@default:default"/>
<setEntry value="org.hyperic.sigar@default:default"/>
<setEntry value="com.sun.jersey.contribs.jersey-multipart@default:default"/>
<setEntry value="javax.validation@default:default"/>
<setEntry value="org.apache.commons.fileupload@default:default"/>
<setEntry value="org.jvnet.mimepull@default:default"/>
<setEntry value="org.apache.commons.math3@default:default"/>
<setEntry value="org.mongodb.driver-core@default:default"/>
<setEntry value="org.mongodb.driver-core.source@default:default"/>
<setEntry value="org.mongodb.bson@default:default"/>
<setEntry value="org.mongodb.bson.source@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot@3:true"/>
<setEntry value="org.eclipse.jetty.osgi.boot.warurl@default:default"/>
<setEntry value="org.hyperic.sigar@default:default"/>
<setEntry value="slf4j.jdk14@default:default"/>
<setEntry value="lz4-java@default:default"/>
<setEntry value="org.apache.felix.gogo.command@default:default"/>
<setEntry value="org.apache.felix.gogo.runtime@default:default"/>
<setEntry value="org.apache.felix.gogo.shell@default:default"/>
<setEntry value="org.eclipse.jetty.deploy@default:default"/>
<setEntry value="org.eclipse.jetty.deploy.source@default:default"/>
<setEntry value="org.eclipse.jetty.http@3:true"/>
<setEntry value="org.eclipse.jetty.http.source@default:default"/>
<setEntry value="org.eclipse.jetty.io@default:default"/>
<setEntry value="org.eclipse.jetty.io.source@default:default"/>
<setEntry value="org.eclipse.jetty.jmx@default:default"/>
<setEntry value="org.eclipse.jetty.jmx.source@default:default"/>
<setEntry value="org.eclipse.jetty.security@default:default"/>
<setEntry value="org.eclipse.jetty.security.source@default:default"/>
<setEntry value="org.eclipse.jetty.server@default:default"/>
<setEntry value="org.eclipse.jetty.server.source@default:default"/>
<setEntry value="org.eclipse.jetty.servlet@default:default"/>
<setEntry value="org.eclipse.jetty.servlet.source@default:default"/>
<setEntry value="org.eclipse.jetty.util@default:default"/>
<setEntry value="org.eclipse.jetty.util.source@default:default"/>
<setEntry value="org.eclipse.jetty.util.ajax@default:default"/>
<setEntry value="org.eclipse.jetty.util.ajax.source@default:default"/>
<setEntry value="org.eclipse.jetty.webapp@default:default"/>
<setEntry value="org.eclipse.jetty.webapp.source@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.api@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.api.source@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.client@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.client.source@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.common@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.common.source@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.server@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.server.source@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.servlet@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.servlet.source@default:default"/>
<setEntry value="org.eclipse.jetty.xml@default:default"/>
<setEntry value="org.eclipse.jetty.xml.source@default:default"/>
<setEntry value="slf4j.api@default:default"/>
<setEntry value="org.apache.servicemix.bundles.zxing@default:default"/>
<setEntry value="org.apache.commons.io@default:default"/>
<setEntry value="jcl.over.slf4j@default:default"/>
<setEntry value="jul.to.slf4j@default:default"/>
<setEntry value="com.sun.mail.javax.mail@default:default"/>
<setEntry value="com.rabbitmq.client@default:default"/>
<setEntry value="com.rabbitmq.client.source@default:default"/>
<setEntry value="org.apache.commons.lang@default:default"/>
<setEntry value="org.apache.commons.logging@default:default"/>
<setEntry value="jackson-jaxrs@default:default"/>
<setEntry value="com.sun.jersey@default:default"/>
<setEntry value="javax.ws.rs@default:default"/>
<setEntry value="org.apache.commons.beanutils@default:default"/>
<setEntry value="org.apache.commons.beanutils.source@default:default"/>
<setEntry value="org.apache.servicemix.bundles.ehcache@default:default"/>
<setEntry value="org.apache.servicemix.bundles.scribe@default:default"/>
<setEntry value="org.owasp.encoder@default:default"/>
<setEntry value="org.owasp.encoder.source@default:default"/>
<setEntry value="org.apache.shiro.core@default:default"/>
<setEntry value="org.apache.shiro.core.source@default:default"/>
<setEntry value="org.apache.shiro.ehcache@default:default"/>
<setEntry value="org.apache.shiro.ehcache.source@default:default"/>
<setEntry value="org.apache.shiro.web@default:default"/>
<setEntry value="org.apache.shiro.web.source@default:default"/>
<setEntry value="jackson-core-asl@default:default"/>
<setEntry value="jackson-mapper-asl@default:default"/>
<setEntry value="com.fasterxml.jackson.core.jackson-core@default:default"/>
<setEntry value="org.apache.commons.collections@default:default"/>
<setEntry value="org.eclipse.jetty.client@default:default"/>
<setEntry value="javax.xml@default:default"/>
<setEntry value="com.sun.activation.javax.activation@default:default"/>
<setEntry value="org.eclipse.equinox.common@2:true"/>
<setEntry value="org.eclipse.equinox.console@default:default"/>
<setEntry value="org.eclipse.equinox.launcher@default:default"/>
<setEntry value="org.eclipse.equinox.simpleconfigurator@2:true"/>
<setEntry value="org.eclipse.osgi@-1:true"/>
<setEntry value="org.eclipse.osgi.source@default:default"/>
<setEntry value="org.osgi.util.promise@default:default"/>
<setEntry value="org.osgi.util.promise.source@default:default"/>
<setEntry value="org.osgi.util.function@default:default"/>
<setEntry value="org.osgi.util.function.source@default:default"/>
<setEntry value="org.osgi.util.measurement@default:default"/>
<setEntry value="org.osgi.util.measurement.source@default:default"/>
<setEntry value="org.osgi.util.position@default:default"/>
<setEntry value="org.osgi.util.position.source@default:default"/>
<setEntry value="org.osgi.util.xml@default:default"/>
<setEntry value="org.osgi.util.xml.source@default:default"/>
<setEntry value="org.eclipse.osgi.services@default:default"/>
<setEntry value="org.eclipse.osgi.services.source@default:default"/>
<setEntry value="org.eclipse.equinox.cm@default:default"/>
<setEntry value="com.sun.istack.commons-runtime@default:default"/>
<setEntry value="com.sun.xml.bind.jaxb-impl@default:default"/>
<setEntry value="javax.xml.stream@default:default"/>
<setEntry value="javax.xml.ws@default:default"/>
<setEntry value="javax.xml.soap@default:default"/>
<setEntry value="org.eclipse.osgi.util@default:default"/>
<setEntry value="org.eclipse.osgi.util.source@default:default"/>
<setEntry value="com.chargebee.chargebee-java@default:default"/>
<setEntry value="com.github.mwiede.jsch@default:default"/>
<setEntry value="com.github.mwiede.jsch.source@default:default"/>
<setEntry value="bcprov-ext@default:default"/>
<setEntry value="com.amazon.aws.aws-java-api@default:default"/>
<setEntry value="com.amazon.aws.aws-java-api.source@default:default"/>
<setEntry value="org.objectweb.asm@default:default"/>
<setEntry value="org.objectweb.asm.commons@default:default"/>
<setEntry value="org.objectweb.asm.analysis@default:default"/>
<setEntry value="org.objectweb.asm.tree@default:default"/>
<setEntry value="org.objectweb.asm.util@default:default"/>
<setEntry value="org.objectweb.asm.source@default:default"/>
<setEntry value="org.objectweb.asm.analysis.source@default:default"/>
<setEntry value="org.objectweb.asm.commons.source@default:default"/>
<setEntry value="org.objectweb.asm.tree.source@default:default"/>
<setEntry value="org.objectweb.asm.util.source@default:default"/>
<setEntry value="org.eclipse.jetty.apache-jsp@4:true"/>
<setEntry value="org.eclipse.jetty.apache-jsp.source@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot.jsp@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot.jsp.source@default:default"/>
<setEntry value="org.apache.geronimo.specs.geronimo-jta_1.1_spec@default:default"/>
<setEntry value="org.apache.aries.spifly.dynamic.bundle@3:true"/>
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
<setEntry value="javax.annotation@default:default"/>
<setEntry value="org.eclipse.jetty.osgi-servlet-api@default:default"/>
<setEntry value="org.apache.xalan@default:default"/>
<setEntry value="org.apache.xml.serializer@default:default"/>
<setEntry value="org.eclipse.equinox.event@default:default"/>
<setEntry value="org.eclipse.jetty.annotations@4:true"/>
<setEntry value="org.eclipse.jetty.jndi@default:default"/>
<setEntry value="org.eclipse.jetty.plus@default:default"/>
<setEntry value="com.sap.db.jdbc@default:default"/>
<setEntry value="com.sap.db.jdbc.source@default:default"/>
<setEntry value="org.osgi.service.component@default:default"/>
<setEntry value="org.osgi.service.cm@default:default"/>
<setEntry value="org.osgi.util.tracker@default:default"/>
<setEntry value="org.osgi.service.event@default:default"/>
<setEntry value="org.osgi.service.packageadmin@default:default"/>
<setEntry value="org.osgi.service.url@default:default"/>
<setEntry value="redisson@default:default"/>
<setEntry value="com.esotericsoftware.kryo@default:default"/>
<setEntry value="com.esotericsoftware.reflectasm@default:default"/>
<setEntry value="com.esotericsoftware.minlog@default:default"/>
<setEntry value="com.fasterxml.jackson.core.jackson-annotations@default:default"/>
<setEntry value="com.fasterxml.jackson.core.jackson-databind@default:default"/>
<setEntry value="com.fasterxml.jackson.dataformat.jackson-dataformat-yaml@default:default"/>
<setEntry value="org.yaml.snakeyaml@default:default"/>
<setEntry value="io.netty.transport@default:default"/>
<setEntry value="io.netty.buffer@default:default"/>
<setEntry value="io.netty.common@default:default"/>
<setEntry value="io.netty.resolver@default:default"/>
<setEntry value="io.netty.transport-classes-epoll@default:default"/>
<setEntry value="io.netty.transport-native-unix-common@default:default"/>
<setEntry value="io.netty.transport-classes-kqueue@default:default"/>
<setEntry value="io.netty.codec@default:default"/>
<setEntry value="io.netty.handler@default:default"/>
<setEntry value="io.netty.resolver-dns@default:default"/>
<setEntry value="io.netty.codec-dns@default:default"/>
<setEntry value="io.netty.incubator.netty-incubator-transport-classes-io_uring@default:default"/>
<setEntry value="io.reactivex.rxjava3.rxjava@default:default"/>
<setEntry value="reactive-streams@default:default"/>
<setEntry value="javax.cache.api@default:default"/>
<setEntry value="com.github.haifengl.smile-core@default:default"/>
<setEntry value="com.github.haifengl.smile-core.source@default:default"/>
<setEntry value="com.github.haifengl.smile-data@default:default"/>
<setEntry value="com.github.haifengl.smile-data.source@default:default"/>
<setEntry value="com.github.haifengl.smile-graph@default:default"/>
<setEntry value="com.github.haifengl.smile-graph.source@default:default"/>
<setEntry value="com.github.haifengl.smile-math@default:default"/>
<setEntry value="com.github.haifengl.smile-math.source@default:default"/>
<setEntry value="com.google.gson@default:default"/>
<setEntry value="com.google.gson.source@default:default"/>
<setEntry value="jodd-bean@default:default"/>
<setEntry value="net.bytebuddy.byte-buddy@default:default"/>
<setEntry value="net.bytebuddy.byte-buddy.source@default:default"/>
<setEntry value="net.bytebuddy.byte-buddy-agent@default:default"/>
<setEntry value="net.bytebuddy.byte-buddy-agent.source@default:default"/>
<setEntry value="org.jboss.marshalling.jboss-marshalling-osgi@default:default"/>
<setEntry value="io.projectreactor.reactor-core@default:default"/>
<setEntry value="com.diffplug.osgi.extension.sun.misc@default:default"/>
<setEntry value="com.google.protobuf@default:default"/>
<setEntry value="com.google.protobuf.source@default:default"/>
<setEntry value="com.sun.jna@default:default"/>
<setEntry value="com.sun.jna.source@default:default"/>
<setEntry value="com.sun.jna.platform@default:default"/>
<setEntry value="com.sun.jna.platform.source@default:default"/>
<setEntry value="com.nulab-inc.zxcvbn@default:default"/>
<setEntry value="com.nulab-inc.zxcvbn.source@default:default"/>
</setAttribute>
>>>>>>> github/bug6135
<setAttribute key="selected_workspace_bundles">
<setEntry value="com.sap.sailing.geocoding@default:default"/>
<setEntry value="com.sap.sailing.domain.common@default:default"/>