diff --git a/core/worker/pom.xml b/core/worker/pom.xml index 30df9e274..1e8ab16ad 100644 --- a/core/worker/pom.xml +++ b/core/worker/pom.xml @@ -72,16 +72,20 @@ org.osgi.core - org.apache.sling - org.apache.sling.commons.osgi + org.osgi + org.osgi.service.component.annotations - javax.validation - validation-api + org.osgi + org.osgi.annotation - org.apache.felix - org.apache.felix.scr.annotations + org.osgi + org.osgi.service.metatype.annotations + + + javax.validation + validation-api org.apache.httpcomponents @@ -146,6 +150,18 @@ + + + + org.apache.felix + maven-scr-plugin + + + generate-scr-descriptor + none + + + org.apache.maven.plugins diff --git a/core/worker/src/main/java/com/cognifide/aet/worker/drivers/HttpRequestExecutorFactoryImpl.java b/core/worker/src/main/java/com/cognifide/aet/worker/drivers/HttpRequestExecutorFactoryImpl.java index 21e3c6898..5abb16860 100644 --- a/core/worker/src/main/java/com/cognifide/aet/worker/drivers/HttpRequestExecutorFactoryImpl.java +++ b/core/worker/src/main/java/com/cognifide/aet/worker/drivers/HttpRequestExecutorFactoryImpl.java @@ -17,10 +17,8 @@ import com.cognifide.aet.job.api.collector.HttpRequestExecutor; import com.cognifide.aet.job.api.collector.HttpRequestExecutorFactory; -import org.apache.felix.scr.annotations.Component; -import org.apache.felix.scr.annotations.Service; +import org.osgi.service.component.annotations.Component; -@Service @Component public class HttpRequestExecutorFactoryImpl implements HttpRequestExecutorFactory { diff --git a/core/worker/src/main/java/com/cognifide/aet/worker/drivers/WebDriverHelper.java b/core/worker/src/main/java/com/cognifide/aet/worker/drivers/WebDriverHelper.java index 57090d243..460dd0362 100644 --- a/core/worker/src/main/java/com/cognifide/aet/worker/drivers/WebDriverHelper.java +++ b/core/worker/src/main/java/com/cognifide/aet/worker/drivers/WebDriverHelper.java @@ -18,8 +18,6 @@ import com.cognifide.aet.job.api.collector.ProxyServerWrapper; import com.cognifide.aet.worker.exceptions.WorkerException; import java.net.UnknownHostException; -import java.util.Map; -import org.apache.sling.commons.osgi.PropertiesUtil; import org.openqa.selenium.Proxy; /** @@ -27,32 +25,14 @@ */ public final class WebDriverHelper { - public static final String NAME = "name"; - public static final String NAME_LABEL = "Name"; public static final String NAME_DESC = "Driver name that will be used by other services like Screenshot Collectors"; - public static final String PATH = "path"; - - public static final String PATH_LABEL = "Path"; - - public static final String PATH_DESC = "Custom path to driver binary"; - - public static final String SELENIUM_GRID_URL = "seleniumGridUrl"; - - public static final String SELENIUM_GRID_URL_LABEL = "Selenium grid URL"; - - public static final String DEFAULT_SELENIUM_GRID_URL = "http://localhost:4444/wd/hub"; - private WebDriverHelper() { // restrict instantiation } - public static String getProp(Map properties, String name, String defaultValue) { - return PropertiesUtil.toString(properties.get(name), defaultValue); - } - public static Proxy setupProxy(ProxyServerWrapper proxyServer) throws WorkerException { proxyServer.setCaptureContent(true); proxyServer.setCaptureHeaders(true); diff --git a/core/worker/src/main/java/com/cognifide/aet/worker/drivers/WebDriverProvider.java b/core/worker/src/main/java/com/cognifide/aet/worker/drivers/WebDriverProvider.java index 940d16ef4..a54a905c8 100644 --- a/core/worker/src/main/java/com/cognifide/aet/worker/drivers/WebDriverProvider.java +++ b/core/worker/src/main/java/com/cognifide/aet/worker/drivers/WebDriverProvider.java @@ -23,42 +23,46 @@ import com.google.common.base.Joiner; import com.google.common.collect.Maps; import java.util.Map; -import org.apache.felix.scr.annotations.Activate; -import org.apache.felix.scr.annotations.Component; -import org.apache.felix.scr.annotations.Properties; -import org.apache.felix.scr.annotations.Property; -import org.apache.felix.scr.annotations.Reference; -import org.apache.felix.scr.annotations.ReferenceCardinality; -import org.apache.felix.scr.annotations.ReferencePolicy; -import org.apache.felix.scr.annotations.Service; + import org.osgi.framework.Constants; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; +import org.osgi.service.component.annotations.ReferencePolicy; +import org.osgi.service.metatype.annotations.Designate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author lukasz.wieczorek */ -@Service(WebDriverProvider.class) -@Component(label = "AET WebDriver Provider", description = "AET WebDriver Provider", immediate = true, metatype = true) -@Properties({@Property(name = Constants.SERVICE_VENDOR, value = "Cognifide Ltd")}) +@Component( + service = WebDriverProvider.class, + property = {"name = " + Constants.SERVICE_VENDOR, "value = Cognifide Ltd"}, + immediate = true +) +@Designate(ocd = WebDriverProviderConfig.class) public class WebDriverProvider { private static final Logger LOG = LoggerFactory.getLogger(WebDriverProvider.class); - private static final String DEFAULT_WEB_DRIVER_NAME = "defaultWebDriverName"; - - @Property(name = DEFAULT_WEB_DRIVER_NAME, label = "Default Web Driver name", value = "ff") - private String defaultWebDriverName; + private WebDriverProviderConfig config; - @Reference(referenceInterface = WebDriverFactory.class, policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, bind = "bindWebDriverFactory", unbind = "unbindWebDriverFactory") + @Reference( + service = WebDriverFactory.class, + policy = ReferencePolicy.DYNAMIC, + cardinality = ReferenceCardinality.MULTIPLE, + bind = "bindWebDriverFactory", + unbind = "unbindWebDriverFactory") private final Map collectorFactories = Maps.newConcurrentMap(); @Reference private ProxyServerProvider proxyServerProvider; @Activate - void activate(Map properties) { - defaultWebDriverName = properties.get(DEFAULT_WEB_DRIVER_NAME); + void activate(WebDriverProviderConfig config) { + this.config = config; } public WebCommunicationWrapper createWebDriverWithProxy(String preferredWebDriver, String proxyName) @@ -94,7 +98,8 @@ protected void unbindWebDriverFactory(WebDriverFactory webDriverFactory) { */ private WebDriverFactory findWebDriverFactory(String preferredWebDriver) throws WorkerException { final WebDriverFactory webDriverFactory; - String id = preferredWebDriver == null ? defaultWebDriverName : preferredWebDriver; + String id = preferredWebDriver == null ? + config.defaultWebDriverName() : preferredWebDriver; webDriverFactory = collectorFactories.get(id); if (webDriverFactory == null) { String webDrivers = Joiner.on(", ").join(collectorFactories.keySet()); diff --git a/core/worker/src/main/java/com/cognifide/aet/worker/drivers/WebDriverProviderConfig.java b/core/worker/src/main/java/com/cognifide/aet/worker/drivers/WebDriverProviderConfig.java new file mode 100644 index 000000000..481586b94 --- /dev/null +++ b/core/worker/src/main/java/com/cognifide/aet/worker/drivers/WebDriverProviderConfig.java @@ -0,0 +1,28 @@ +/** + * AET + * + * Copyright (C) 2013 Cognifide Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package com.cognifide.aet.worker.drivers; + +import org.osgi.service.metatype.annotations.AttributeDefinition; +import org.osgi.service.metatype.annotations.ObjectClassDefinition; + +@ObjectClassDefinition(name = "AET WebDriver Provider", description = "AET WebDriver Provider") +public @interface WebDriverProviderConfig { + + String DEFAULT_WEB_DRIVER_NAME_LABEL = "Default Web Driver name"; + + @AttributeDefinition(name = DEFAULT_WEB_DRIVER_NAME_LABEL, defaultValue = "ff") + String defaultWebDriverName(); +} diff --git a/core/worker/src/main/java/com/cognifide/aet/worker/drivers/chrome/ChromeWebDriverFactory.java b/core/worker/src/main/java/com/cognifide/aet/worker/drivers/chrome/ChromeWebDriverFactory.java index aa405a2bd..81706806c 100644 --- a/core/worker/src/main/java/com/cognifide/aet/worker/drivers/chrome/ChromeWebDriverFactory.java +++ b/core/worker/src/main/java/com/cognifide/aet/worker/drivers/chrome/ChromeWebDriverFactory.java @@ -15,13 +15,6 @@ */ package com.cognifide.aet.worker.drivers.chrome; -import static com.cognifide.aet.worker.drivers.WebDriverHelper.DEFAULT_SELENIUM_GRID_URL; -import static com.cognifide.aet.worker.drivers.WebDriverHelper.NAME; -import static com.cognifide.aet.worker.drivers.WebDriverHelper.NAME_DESC; -import static com.cognifide.aet.worker.drivers.WebDriverHelper.NAME_LABEL; -import static com.cognifide.aet.worker.drivers.WebDriverHelper.SELENIUM_GRID_URL; -import static com.cognifide.aet.worker.drivers.WebDriverHelper.SELENIUM_GRID_URL_LABEL; -import static com.cognifide.aet.worker.drivers.WebDriverHelper.getProp; import static com.cognifide.aet.worker.drivers.WebDriverHelper.setupProxy; import com.cognifide.aet.job.api.collector.HttpRequestExecutorFactory; @@ -31,17 +24,9 @@ import com.cognifide.aet.worker.exceptions.WorkerException; import java.net.MalformedURLException; import java.net.URL; -import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import org.apache.commons.lang3.StringUtils; -import org.apache.felix.scr.annotations.Activate; -import org.apache.felix.scr.annotations.Component; -import org.apache.felix.scr.annotations.ConfigurationPolicy; -import org.apache.felix.scr.annotations.Properties; -import org.apache.felix.scr.annotations.Property; -import org.apache.felix.scr.annotations.Reference; -import org.apache.felix.scr.annotations.Service; import org.openqa.selenium.Proxy; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; @@ -52,37 +37,28 @@ import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.RemoteWebDriver; import org.osgi.framework.Constants; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.ConfigurationPolicy; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.metatype.annotations.Designate; + -@Service @Component( - policy = ConfigurationPolicy.REQUIRE, - description = "AET Chrome WebDriver Factory", - label = "AET Chrome WebDriver Factory", - metatype = true) -@Properties({@Property(name = Constants.SERVICE_VENDOR, value = "Cognifide Ltd")}) + configurationPolicy = ConfigurationPolicy.REQUIRE, + property = {"name = " + Constants.SERVICE_VENDOR, "value = Cognifide Ltd"} +) +@Designate(ocd = ChromeWebDriverFactoryConfig.class) public class ChromeWebDriverFactory implements WebDriverFactory { - private static final String DEFAULT_BROWSER_NAME = "chrome"; - @Reference private HttpRequestExecutorFactory requestExecutorFactory; - @Property(name = NAME, - label = NAME_LABEL, - description = NAME_DESC, - value = DEFAULT_BROWSER_NAME) - private String name; - - @Property(name = SELENIUM_GRID_URL, - label = SELENIUM_GRID_URL_LABEL, - description = "Url to selenium grid hub. When null local Chrome driver will be used. Local Chrome driver does not work on Linux", - value = DEFAULT_SELENIUM_GRID_URL) - private String seleniumGridUrl; + private ChromeWebDriverFactoryConfig config; @Activate - public void activate(Map properties) { - this.name = getProp(properties, NAME, DEFAULT_BROWSER_NAME); - this.seleniumGridUrl = getProp(properties, SELENIUM_GRID_URL, DEFAULT_SELENIUM_GRID_URL); + public void activate(ChromeWebDriverFactoryConfig config) { + this.config = config; } @Override @@ -104,7 +80,7 @@ public WebCommunicationWrapper createWebDriver(ProxyServerWrapper proxyServer) @Override public String getName() { - return name; + return config.name(); } private WebCommunicationWrapper createWebDriver(DesiredCapabilities capabilities, @@ -120,8 +96,10 @@ private WebCommunicationWrapper createWebDriver(DesiredCapabilities capabilities private WebDriver getChromeDriver(DesiredCapabilities capabilities) throws MalformedURLException { - WebDriver driver = StringUtils.isNotBlank(seleniumGridUrl) ? new RemoteWebDriver( - new URL(seleniumGridUrl), capabilities) : new ChromeDriver(capabilities); + WebDriver driver = + StringUtils.isNotBlank(config.seleniumGridUrl()) ? + new RemoteWebDriver(new URL(config.seleniumGridUrl()), capabilities) + : new ChromeDriver(capabilities); driver.manage().timeouts().pageLoadTimeout(5L, TimeUnit.MINUTES); return driver; } diff --git a/core/worker/src/main/java/com/cognifide/aet/worker/drivers/chrome/ChromeWebDriverFactoryConfig.java b/core/worker/src/main/java/com/cognifide/aet/worker/drivers/chrome/ChromeWebDriverFactoryConfig.java new file mode 100644 index 000000000..559ca4ce2 --- /dev/null +++ b/core/worker/src/main/java/com/cognifide/aet/worker/drivers/chrome/ChromeWebDriverFactoryConfig.java @@ -0,0 +1,44 @@ +/** + * AET + * + * Copyright (C) 2013 Cognifide Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package com.cognifide.aet.worker.drivers.chrome; + +import org.osgi.service.metatype.annotations.AttributeDefinition; +import org.osgi.service.metatype.annotations.ObjectClassDefinition; + +import static com.cognifide.aet.worker.drivers.WebDriverHelper.NAME_LABEL; +import static com.cognifide.aet.worker.drivers.WebDriverHelper.NAME_DESC; + +@ObjectClassDefinition(name = "AET Chrome WebDriver Factory", description = "AET Chrome WebDriver Factory") +public @interface ChromeWebDriverFactoryConfig { + + String DEFAULT_BROWSER_NAME = "chrome"; + + String SELENIUM_GRID_URL_LABEL = "Selenium grid URL"; + String SELENIUM_GRID_URL_DESC = "Url to selenium grid hub. When null local Chrome driver will be used. Local Chrome driver does not work on Linux"; + String DEFAULT_SELENIUM_GRID_URL = "http://localhost:4444/wd/hub"; + + @AttributeDefinition( + name = NAME_LABEL, + description = NAME_DESC, + defaultValue = DEFAULT_BROWSER_NAME) + String name(); + + @AttributeDefinition( + name = ChromeWebDriverFactoryConfig.SELENIUM_GRID_URL_LABEL, + description = ChromeWebDriverFactoryConfig.SELENIUM_GRID_URL_DESC, + defaultValue = ChromeWebDriverFactoryConfig.DEFAULT_SELENIUM_GRID_URL) + String seleniumGridUrl(); +} diff --git a/core/worker/src/main/java/com/cognifide/aet/worker/drivers/firefox/local/FirefoxWebDriverFactory.java b/core/worker/src/main/java/com/cognifide/aet/worker/drivers/firefox/local/FirefoxWebDriverFactory.java index 08f7c6497..50922e864 100644 --- a/core/worker/src/main/java/com/cognifide/aet/worker/drivers/firefox/local/FirefoxWebDriverFactory.java +++ b/core/worker/src/main/java/com/cognifide/aet/worker/drivers/firefox/local/FirefoxWebDriverFactory.java @@ -15,10 +15,6 @@ */ package com.cognifide.aet.worker.drivers.firefox.local; -import static com.cognifide.aet.worker.drivers.WebDriverHelper.NAME; -import static com.cognifide.aet.worker.drivers.WebDriverHelper.NAME_LABEL; -import static com.cognifide.aet.worker.drivers.WebDriverHelper.PATH; - import com.cognifide.aet.worker.drivers.firefox.FirefoxCommunicationWrapperImpl; import com.cognifide.aet.worker.drivers.firefox.FirefoxProfileBuilder; import com.cognifide.aet.job.api.collector.HttpRequestExecutorFactory; @@ -26,17 +22,10 @@ import com.cognifide.aet.job.api.collector.WebCommunicationWrapper; import com.cognifide.aet.worker.api.WebDriverFactory; import com.cognifide.aet.worker.exceptions.WorkerException; + import java.io.File; -import java.util.Map; import java.util.concurrent.TimeUnit; -import org.apache.felix.scr.annotations.Activate; -import org.apache.felix.scr.annotations.Component; -import org.apache.felix.scr.annotations.ConfigurationPolicy; -import org.apache.felix.scr.annotations.Properties; -import org.apache.felix.scr.annotations.Property; -import org.apache.felix.scr.annotations.Reference; -import org.apache.felix.scr.annotations.Service; -import org.apache.sling.commons.osgi.PropertiesUtil; + import org.openqa.selenium.Proxy; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; @@ -44,38 +33,26 @@ import org.openqa.selenium.remote.CapabilityType; import org.openqa.selenium.remote.DesiredCapabilities; import org.osgi.framework.Constants; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.metatype.annotations.Designate; + -@Service @Component( - description = "AET Firefox WebDriver Factory", - label = "AET Firefox WebDriver Factory", - metatype = true) -@Properties({@Property(name = Constants.SERVICE_VENDOR, value = "Cognifide Ltd")}) + property = {"name = " + Constants.SERVICE_VENDOR, "value = Cognifide Ltd"} +) +@Designate(ocd = FirefoxWebDriverFactoryConfig.class) public class FirefoxWebDriverFactory implements WebDriverFactory { - private static final String DEFAULT_FIREFOX_BINARY_PATH = "/usr/bin/firefox"; - - private static final String DEFAULT_FIREFOX_ERROR_LOG_FILE_PATH = "/opt/aet/firefox/log/stderr.log"; - - private static final String LOG_FILE_PATH = "logFilePath"; - - private static final String DEFAULT_FF_NAME = "ff"; - @Reference private HttpRequestExecutorFactory requestExecutorFactory; - @Property(name = NAME, label = NAME_LABEL, value = DEFAULT_FF_NAME) - private String name; - - @Property(name = PATH, label = "Custom path to Firefox binary", value = DEFAULT_FIREFOX_BINARY_PATH) - private String path; - - @Property(name = LOG_FILE_PATH, label = "Path to firefox error log", value = DEFAULT_FIREFOX_ERROR_LOG_FILE_PATH) - private String logFilePath; + private FirefoxWebDriverFactoryConfig config; @Override public String getName() { - return name; + return config.name(); } @Override @@ -122,7 +99,7 @@ public WebCommunicationWrapper createWebDriver() throws WorkerException { private FirefoxProfile getFirefoxProfile() { final FirefoxProfile firefoxProfile = FirefoxProfileBuilder.newInstance() .withUnstableAndFastLoadStrategy() - .withLogfilePath(logFilePath) + .withLogfilePath(config.logFilePath()) .withFlashSwitchedOff() .withForcedAliasing() .withJavaScriptErrorCollectorPlugin() @@ -131,7 +108,7 @@ private FirefoxProfile getFirefoxProfile() { .withRandomPort() .withUpdateDisabled() .build(); - System.setProperty("webdriver.firefox.logfile", logFilePath); + System.setProperty("webdriver.firefox.logfile", config.logFilePath()); System.setProperty("webdriver.load.strategy", "unstable"); return firefoxProfile; } @@ -139,7 +116,7 @@ private FirefoxProfile getFirefoxProfile() { private void setCommonCapabilities(DesiredCapabilities capabilities, FirefoxProfile fp) { capabilities.setCapability(FirefoxDriver.PROFILE, fp); capabilities.setCapability("marionette", false); - capabilities.setCapability("firefox_binary", new File(path).getAbsolutePath()); + capabilities.setCapability("firefox_binary", new File(config.path()).getAbsolutePath()); } private WebDriver getFirefoxDriver(DesiredCapabilities capabilities) { @@ -149,11 +126,8 @@ private WebDriver getFirefoxDriver(DesiredCapabilities capabilities) { } @Activate - public void activate(Map properties) { - this.name = PropertiesUtil.toString(properties.get(NAME), DEFAULT_FF_NAME); - this.path = PropertiesUtil.toString(properties.get(PATH), DEFAULT_FIREFOX_BINARY_PATH); - this.logFilePath = PropertiesUtil - .toString(properties.get(LOG_FILE_PATH), DEFAULT_FIREFOX_ERROR_LOG_FILE_PATH); + public void activate(FirefoxWebDriverFactoryConfig config) { + this.config = config; } } diff --git a/core/worker/src/main/java/com/cognifide/aet/worker/drivers/firefox/local/FirefoxWebDriverFactoryConfig.java b/core/worker/src/main/java/com/cognifide/aet/worker/drivers/firefox/local/FirefoxWebDriverFactoryConfig.java new file mode 100644 index 000000000..efab3427f --- /dev/null +++ b/core/worker/src/main/java/com/cognifide/aet/worker/drivers/firefox/local/FirefoxWebDriverFactoryConfig.java @@ -0,0 +1,42 @@ +/** + * AET + * + * Copyright (C) 2013 Cognifide Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package com.cognifide.aet.worker.drivers.firefox.local; + +import org.osgi.service.metatype.annotations.AttributeDefinition; +import org.osgi.service.metatype.annotations.ObjectClassDefinition; + +import static com.cognifide.aet.worker.drivers.WebDriverHelper.NAME_LABEL; + +@ObjectClassDefinition(name = "AET Firefox WebDriver Factory", description = "AET Firefox WebDriver Factory") +public @interface FirefoxWebDriverFactoryConfig { + + String PATH_LABEL = "Custom path to Firefox binary"; + String DEFAULT_FF_NAME = "ff"; + + String DEFAULT_FIREFOX_BINARY_PATH = "/usr/bin/firefox"; + + String LOG_FILE_PATH_LABEL = "Path to firefox error log"; + String DEFAULT_FIREFOX_ERROR_LOG_FILE_PATH = "/opt/aet/firefox/log/stderr.log"; + + @AttributeDefinition(name = NAME_LABEL, defaultValue = DEFAULT_FF_NAME) + String name(); + + @AttributeDefinition(name = PATH_LABEL, defaultValue = DEFAULT_FIREFOX_BINARY_PATH) + String path(); + + @AttributeDefinition(name = LOG_FILE_PATH_LABEL, defaultValue = DEFAULT_FIREFOX_ERROR_LOG_FILE_PATH) + String logFilePath(); +} diff --git a/core/worker/src/main/java/com/cognifide/aet/worker/impl/CollectorDispatcherImpl.java b/core/worker/src/main/java/com/cognifide/aet/worker/impl/CollectorDispatcherImpl.java index 1bad32015..538cf2fb9 100644 --- a/core/worker/src/main/java/com/cognifide/aet/worker/impl/CollectorDispatcherImpl.java +++ b/core/worker/src/main/java/com/cognifide/aet/worker/impl/CollectorDispatcherImpl.java @@ -29,14 +29,12 @@ import com.cognifide.aet.worker.api.JobRegistry; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; -import org.apache.felix.scr.annotations.Component; -import org.apache.felix.scr.annotations.Reference; -import org.apache.felix.scr.annotations.Service; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@Service -@Component(immediate = true, label = "AET Collector Dispatcher", description = "Collector Dispatcher") +@Component(immediate = true, name = "AET Collector Dispatcher") public class CollectorDispatcherImpl implements CollectorDispatcher { private static final Logger LOGGER = LoggerFactory.getLogger(CollectorDispatcherImpl.class); diff --git a/core/worker/src/main/java/com/cognifide/aet/worker/impl/ComparatorDispatcherImpl.java b/core/worker/src/main/java/com/cognifide/aet/worker/impl/ComparatorDispatcherImpl.java index a6b5b4891..2b50b7198 100644 --- a/core/worker/src/main/java/com/cognifide/aet/worker/impl/ComparatorDispatcherImpl.java +++ b/core/worker/src/main/java/com/cognifide/aet/worker/impl/ComparatorDispatcherImpl.java @@ -35,14 +35,12 @@ import javax.annotation.Nullable; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; -import org.apache.felix.scr.annotations.Component; -import org.apache.felix.scr.annotations.Reference; -import org.apache.felix.scr.annotations.Service; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@Service -@Component(label = "AET Comparator Dispatcher", description = "Comparator Dispatcher", immediate = true) +@Component(name = "AET Comparator Dispatcher", immediate = true) public class ComparatorDispatcherImpl implements ComparatorDispatcher { private static final Logger LOGGER = LoggerFactory.getLogger(ComparatorDispatcherImpl.class); diff --git a/core/worker/src/main/java/com/cognifide/aet/worker/impl/JobRegistryImpl.java b/core/worker/src/main/java/com/cognifide/aet/worker/impl/JobRegistryImpl.java index 5afe4eba6..58d1a04a9 100644 --- a/core/worker/src/main/java/com/cognifide/aet/worker/impl/JobRegistryImpl.java +++ b/core/worker/src/main/java/com/cognifide/aet/worker/impl/JobRegistryImpl.java @@ -21,31 +21,45 @@ import com.cognifide.aet.worker.api.JobRegistry; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import org.apache.felix.scr.annotations.Component; -import org.apache.felix.scr.annotations.Properties; -import org.apache.felix.scr.annotations.Property; -import org.apache.felix.scr.annotations.Reference; -import org.apache.felix.scr.annotations.ReferenceCardinality; -import org.apache.felix.scr.annotations.ReferencePolicy; -import org.apache.felix.scr.annotations.Service; import org.osgi.framework.Constants; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; +import org.osgi.service.component.annotations.ReferencePolicy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@Service -@Component(immediate = true, description = "AET JMS Registry", label = "AET Job Registry Implementation") -@Properties({@Property(name = Constants.SERVICE_VENDOR, value = "Cognifide Ltd")}) +@Component( + immediate = true, + name = "AET Job Registry Implementation", + property = {"name = " + Constants.SERVICE_VENDOR, "value = Cognifide Ltd"} +) public class JobRegistryImpl implements JobRegistry { private static final Logger LOGGER = LoggerFactory.getLogger(JobRegistryImpl.class); - @Reference(referenceInterface = CollectorFactory.class, policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, bind = "bindCollectorFactory", unbind = "unbindCollectorFactory") + @Reference( + service = CollectorFactory.class, + policy = ReferencePolicy.DYNAMIC, + cardinality = ReferenceCardinality.MULTIPLE, + bind = "bindCollectorFactory", + unbind = "unbindCollectorFactory") private Map collectorFactories = new ConcurrentHashMap<>(); - @Reference(referenceInterface = ComparatorFactory.class, policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, bind = "bindComparatorFactory", unbind = "unbindComparatorFactory") + @Reference( + service = ComparatorFactory.class, + policy = ReferencePolicy.DYNAMIC, + cardinality = ReferenceCardinality.MULTIPLE, + bind = "bindComparatorFactory", + unbind = "unbindComparatorFactory") private Map comparatorFactoryMap = new ConcurrentHashMap<>(); - @Reference(referenceInterface = DataFilterFactory.class, policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, bind = "bindDataModifierFactory", unbind = "unbindDataModifierFactory") + @Reference( + service = DataFilterFactory.class, + policy = ReferencePolicy.DYNAMIC, + cardinality = ReferenceCardinality.MULTIPLE, + bind = "bindDataModifierFactory", + unbind = "unbindDataModifierFactory") private Map dataModifierFactoryMap = new ConcurrentHashMap<>(); private Map defaultComparatorMap = new ConcurrentHashMap<>(); diff --git a/core/worker/src/main/java/com/cognifide/aet/worker/listeners/AbstractTaskMessageListener.java b/core/worker/src/main/java/com/cognifide/aet/worker/listeners/AbstractTaskMessageListener.java index 91c9346ca..5b3892a68 100644 --- a/core/worker/src/main/java/com/cognifide/aet/worker/listeners/AbstractTaskMessageListener.java +++ b/core/worker/src/main/java/com/cognifide/aet/worker/listeners/AbstractTaskMessageListener.java @@ -18,45 +18,20 @@ import com.cognifide.aet.communication.api.queues.JmsConnection; import com.cognifide.aet.queues.JmsUtils; import com.cognifide.aet.worker.results.FeedbackQueue; -import java.util.Map; import javax.jms.JMSException; import javax.jms.MessageConsumer; import javax.jms.MessageListener; import javax.jms.Session; -import org.apache.commons.lang3.StringUtils; -import org.apache.felix.scr.annotations.Component; -import org.apache.felix.scr.annotations.Property; -@Component public abstract class AbstractTaskMessageListener implements MessageListener { - protected static final String LISTENER_NAME = "name"; + private Session jmsSession; - protected static final String CONSUMER_QUEUE_NAME = "consumerQueueName"; + private MessageConsumer consumer; - protected static final String PRODUCER_QUEUE_NAME = "producerQueueName"; + FeedbackQueue feedbackQueue; - protected static final String PREFETCH_SIZE_NAME = "pf"; - - protected static final String PREFETCH_SIZE_DEFAULT_VALUE = "1"; - - protected Session jmsSession; - - protected MessageConsumer consumer; - - protected FeedbackQueue feedbackQueue; - - @Property(name = PREFETCH_SIZE_NAME, label = "Prefetch size", description = "http://activemq.apache.org/what-is-the-prefetch-limit-for.html", value = PREFETCH_SIZE_DEFAULT_VALUE) - private String prefetchSize; - - protected void doActivate(Map properties) { - setName(properties.get(LISTENER_NAME)); - this.prefetchSize = StringUtils.defaultString(properties.get(PREFETCH_SIZE_NAME), - PREFETCH_SIZE_DEFAULT_VALUE); - String consumerQueueName = properties.get(CONSUMER_QUEUE_NAME); - setConsumerQueueName(consumerQueueName); - String producerQueueName = properties.get(PRODUCER_QUEUE_NAME); - setProducerQueueName(producerQueueName); + void doActivate(String consumerQueueName, String producerQueueName, String prefetchSize) { String queueName = consumerQueueName + "?consumer.prefetchSize=" + prefetchSize; try { @@ -69,7 +44,7 @@ protected void doActivate(Map properties) { } } - protected void doDeactivate() { + void doDeactivate() { if (feedbackQueue != null) { feedbackQueue.close(); } @@ -77,12 +52,6 @@ protected void doDeactivate() { JmsUtils.closeQuietly(jmsSession); } - protected abstract void setName(String name); - - protected abstract void setConsumerQueueName(String consumerQueueName); - - protected abstract void setProducerQueueName(String producerQueueName); - protected abstract JmsConnection getJmsConnection(); } diff --git a/core/worker/src/main/java/com/cognifide/aet/worker/listeners/CollectorMessageListenerImpl.java b/core/worker/src/main/java/com/cognifide/aet/worker/listeners/CollectorMessageListenerImpl.java index 276bfc203..a9c04e5fb 100644 --- a/core/worker/src/main/java/com/cognifide/aet/worker/listeners/CollectorMessageListenerImpl.java +++ b/core/worker/src/main/java/com/cognifide/aet/worker/listeners/CollectorMessageListenerImpl.java @@ -28,35 +28,25 @@ import com.cognifide.aet.worker.api.CollectorDispatcher; import com.cognifide.aet.worker.drivers.WebDriverProvider; import com.cognifide.aet.worker.exceptions.WorkerException; -import java.util.Map; import javax.jms.JMSException; import javax.jms.Message; import org.apache.commons.lang3.StringUtils; -import org.apache.felix.scr.annotations.Activate; -import org.apache.felix.scr.annotations.Component; -import org.apache.felix.scr.annotations.ConfigurationPolicy; -import org.apache.felix.scr.annotations.Deactivate; -import org.apache.felix.scr.annotations.Property; -import org.apache.felix.scr.annotations.Reference; -import org.apache.felix.scr.annotations.Service; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.metatype.annotations.Designate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@Service -@Component(immediate = true, metatype = true, label = "AET Collector Message Listener", policy = ConfigurationPolicy.REQUIRE, configurationFactory = true) +@Component( + service = CollectorMessageListenerImpl.class, + immediate = true) +@Designate(ocd = CollectorMessageListenerImplConfig.class, factory = true) public class CollectorMessageListenerImpl extends AbstractTaskMessageListener { private static final Logger LOGGER = LoggerFactory.getLogger(CollectorMessageListenerImpl.class); - @Property(name = LISTENER_NAME, label = "Collector name", description = "Name of collector. Used in logs only", value = "Collector") - private String name; - - @Property(name = CONSUMER_QUEUE_NAME, label = "Consumer queue name", value = "AET.collectorJobs") - private String consumerQueueName; - - @Property(name = PRODUCER_QUEUE_NAME, label = "Producer queue name", value = "AET.collectorResults") - private String producerQueueName; - @Reference private JmsConnection jmsConnection; @@ -66,9 +56,12 @@ public class CollectorMessageListenerImpl extends AbstractTaskMessageListener { @Reference private WebDriverProvider webDriverProvider; + private CollectorMessageListenerImplConfig config; + @Activate - void activate(Map properties) { - super.doActivate(properties); + void activate(CollectorMessageListenerImplConfig config) { + this.config = config; + super.doActivate(config.consumerQueueName(), config.producerQueueName(), config.pf()); } @Deactivate @@ -90,7 +83,8 @@ public void onMessage(final Message message) { && requestMessageId != null) { LOGGER.info( "CollectorJobData [{}] message arrived with {} urls. CorrelationId: {} RequestMessageId: {}", - name, collectorJobData.getUrls().size(), correlationId, requestMessageId); + config.name(), collectorJobData.getUrls().size(), correlationId, + requestMessageId); WebCommunicationWrapper webCommunicationWrapper = null; int collected = 0; String preferredWebDriver = collectorJobData.getPreferredBrowserId(); @@ -181,21 +175,6 @@ private void quitWebDriver(WebCommunicationWrapper webCommunicationWrapper) { } } - @Override - protected void setName(String name) { - this.name = name; - } - - @Override - protected void setConsumerQueueName(String consumerQueueName) { - this.consumerQueueName = consumerQueueName; - } - - @Override - protected void setProducerQueueName(String producerQueueName) { - this.producerQueueName = producerQueueName; - } - @Override protected JmsConnection getJmsConnection() { return jmsConnection; diff --git a/core/worker/src/main/java/com/cognifide/aet/worker/listeners/CollectorMessageListenerImplConfig.java b/core/worker/src/main/java/com/cognifide/aet/worker/listeners/CollectorMessageListenerImplConfig.java new file mode 100644 index 000000000..fb4fcc39a --- /dev/null +++ b/core/worker/src/main/java/com/cognifide/aet/worker/listeners/CollectorMessageListenerImplConfig.java @@ -0,0 +1,59 @@ +/** + * AET + * + * Copyright (C) 2013 Cognifide Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package com.cognifide.aet.worker.listeners; + +import org.osgi.service.metatype.annotations.AttributeDefinition; +import org.osgi.service.metatype.annotations.ObjectClassDefinition; + +@ObjectClassDefinition(name = "AET Collector Message Listener") +public @interface CollectorMessageListenerImplConfig { + + String LISTENER_NAME_LABEL = "Collector name"; + String LISTENER_NAME_DESC = "Name of collector. Used in logs only"; + String LISTENER_NAME_DEFAULT_VALUE = "Collector"; + + String CONSUMER_QUEUE_NAME_LABEL = "Consumer queue name"; + String CONSUMER_QUEUE_NAME_DEFAULT_VALUE = "AET.collectorJobs"; + + String PRODUCER_QUEUE_NAME_LABEL = "Producer queue name"; + String PRODUCER_QUEUE_NAME_DEFAULT_VALUE = "AET.collectorResults"; + + String PREFETCH_SIZE_LABEL = "Prefetch size"; + String PREFETCH_SIZE_DESC = "http://activemq.apache.org/what-is-the-prefetch-limit-for.html"; + String PREFETCH_SIZE_DEFAULT_VALUE = "1"; + + @AttributeDefinition( + name = LISTENER_NAME_LABEL, + description = LISTENER_NAME_DESC, + defaultValue = LISTENER_NAME_DEFAULT_VALUE) + String name(); + + @AttributeDefinition( + name = CONSUMER_QUEUE_NAME_LABEL, + defaultValue = CONSUMER_QUEUE_NAME_DEFAULT_VALUE) + String consumerQueueName(); + + @AttributeDefinition( + name = PRODUCER_QUEUE_NAME_LABEL, + defaultValue = PRODUCER_QUEUE_NAME_DEFAULT_VALUE) + String producerQueueName(); + + @AttributeDefinition( + name = PREFETCH_SIZE_LABEL, + description = PREFETCH_SIZE_DESC, + defaultValue = PREFETCH_SIZE_DEFAULT_VALUE) + String pf(); +} diff --git a/core/worker/src/main/java/com/cognifide/aet/worker/listeners/ComparatorMessageListenerImpl.java b/core/worker/src/main/java/com/cognifide/aet/worker/listeners/ComparatorMessageListenerImpl.java index 1ab6bca17..2ec477be1 100644 --- a/core/worker/src/main/java/com/cognifide/aet/worker/listeners/ComparatorMessageListenerImpl.java +++ b/core/worker/src/main/java/com/cognifide/aet/worker/listeners/ComparatorMessageListenerImpl.java @@ -26,44 +26,37 @@ import com.cognifide.aet.job.api.comparator.ComparatorProperties; import com.cognifide.aet.queues.JmsUtils; import com.cognifide.aet.worker.api.ComparatorDispatcher; -import java.util.Map; import javax.jms.JMSException; import javax.jms.Message; import org.apache.commons.lang3.StringUtils; -import org.apache.felix.scr.annotations.Activate; -import org.apache.felix.scr.annotations.Component; -import org.apache.felix.scr.annotations.ConfigurationPolicy; -import org.apache.felix.scr.annotations.Deactivate; -import org.apache.felix.scr.annotations.Property; -import org.apache.felix.scr.annotations.Reference; -import org.apache.felix.scr.annotations.Service; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.metatype.annotations.Designate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@Service -@Component(immediate = true, metatype = true, label = "AET Comparator Message Listener", policy = ConfigurationPolicy.REQUIRE, configurationFactory = true) +@Component( + service = ComparatorMessageListenerImpl.class, + immediate = true) +@Designate(ocd = ComparatorMessageListenerImplConfig.class, factory = true) public class ComparatorMessageListenerImpl extends AbstractTaskMessageListener { private static final Logger LOGGER = LoggerFactory.getLogger(ComparatorMessageListenerImpl.class); - @Property(name = LISTENER_NAME, label = "Comparator name", description = "Name of comparator. Used in logs only", value = "Comparator") - private String name; - - @Property(name = CONSUMER_QUEUE_NAME, label = "Consumer queue name", value = "AET.comparatorJobs") - private String consumerQueueName; - - @Property(name = PRODUCER_QUEUE_NAME, label = "Producer queue name", value = "AET.comparatorResults") - private String producerQueueName; - @Reference private JmsConnection jmsConnection; @Reference private ComparatorDispatcher dispatcher; + private ComparatorMessageListenerImplConfig config; + @Activate - void activate(Map properties) { - super.doActivate(properties); + void activate(ComparatorMessageListenerImplConfig config) { + this.config = config; + super.doActivate(config.consumerQueueName(), config.producerQueueName(), config.pf()); } @Deactivate @@ -124,21 +117,6 @@ public void onMessage(final Message message) { } } - @Override - protected void setName(String name) { - this.name = name; - } - - @Override - protected void setConsumerQueueName(String consumerQueueName) { - this.consumerQueueName = consumerQueueName; - } - - @Override - protected void setProducerQueueName(String producerQueueName) { - this.producerQueueName = producerQueueName; - } - @Override protected JmsConnection getJmsConnection() { return jmsConnection; diff --git a/core/worker/src/main/java/com/cognifide/aet/worker/listeners/ComparatorMessageListenerImplConfig.java b/core/worker/src/main/java/com/cognifide/aet/worker/listeners/ComparatorMessageListenerImplConfig.java new file mode 100644 index 000000000..45f9f3749 --- /dev/null +++ b/core/worker/src/main/java/com/cognifide/aet/worker/listeners/ComparatorMessageListenerImplConfig.java @@ -0,0 +1,59 @@ +/** + * AET + * + * Copyright (C) 2013 Cognifide Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package com.cognifide.aet.worker.listeners; + +import org.osgi.service.metatype.annotations.AttributeDefinition; +import org.osgi.service.metatype.annotations.ObjectClassDefinition; + +@ObjectClassDefinition(name = "AET Comparator Message Listener") +public @interface ComparatorMessageListenerImplConfig { + + String LISTENER_NAME_LABEL = "Comparator name"; + String LISTENER_NAME_DESC = "Name of comparator. Used in logs only"; + String LISTENER_NAME_DEFAULT_VALUE = "Comparator"; + + String CONSUMER_QUEUE_NAME_LABEL = "Consumer queue name"; + String CONSUMER_QUEUE_NAME_DEFAULT_VALUE = "AET.comparatorJobs"; + + String PRODUCER_QUEUE_NAME_LABEL = "Producer queue name"; + String PRODUCER_QUEUE_NAME_DEFAULT_VALUE = "AET.comparatorResults"; + + String PREFETCH_SIZE_LABEL = "Prefetch size"; + String PREFETCH_SIZE_DESC = "http://activemq.apache.org/what-is-the-prefetch-limit-for.html"; + String PREFETCH_SIZE_DEFAULT_VALUE = "1"; + + @AttributeDefinition( + name = LISTENER_NAME_LABEL, + description = LISTENER_NAME_DESC, + defaultValue = LISTENER_NAME_DEFAULT_VALUE) + String name(); + + @AttributeDefinition( + name = CONSUMER_QUEUE_NAME_LABEL, + defaultValue = CONSUMER_QUEUE_NAME_DEFAULT_VALUE) + String consumerQueueName(); + + @AttributeDefinition( + name = PRODUCER_QUEUE_NAME_LABEL, + defaultValue = PRODUCER_QUEUE_NAME_DEFAULT_VALUE) + String producerQueueName(); + + @AttributeDefinition( + name = PREFETCH_SIZE_LABEL, + description = PREFETCH_SIZE_DESC, + defaultValue = PREFETCH_SIZE_DEFAULT_VALUE) + String pf(); +} diff --git a/pom.xml b/pom.xml index b74e0d006..841410aca 100644 --- a/pom.xml +++ b/pom.xml @@ -220,16 +220,19 @@ org.osgi org.osgi.service.component.annotations 1.3.0 + provided org.osgi org.osgi.annotation 6.0.0 + provided org.osgi org.osgi.service.metatype.annotations 1.3.0 + provided