diff --git a/pom.xml b/pom.xml
index 4c871f5..59a44e7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -69,6 +69,13 @@
+
+ maven-compiler-plugin
+
+ 1.6
+ 1.6
+
+
diff --git a/src/main/java/hudson/plugins/sitemonitor/SiteMonitorDescriptor.java b/src/main/java/hudson/plugins/sitemonitor/SiteMonitorDescriptor.java
index 8d5b9ce..f938c93 100644
--- a/src/main/java/hudson/plugins/sitemonitor/SiteMonitorDescriptor.java
+++ b/src/main/java/hudson/plugins/sitemonitor/SiteMonitorDescriptor.java
@@ -152,15 +152,13 @@ public final Publisher newInstance(final StaplerRequest request,
Object sitesObject = json.get("sites");
if (sitesObject instanceof JSONObject) {
- for (Object siteObject : json.getJSONObject("sites").values()) {
- String url = String.valueOf(siteObject);
- sites.add(new Site(url));
- }
+ Site site = toSite((JSONObject) sitesObject);
+ sites.add(site);
} else if (sitesObject instanceof JSONArray) {
for (Object siteObject : (JSONArray) sitesObject) {
if (siteObject instanceof JSONObject) {
- String url = ((JSONObject) siteObject).getString("url");
- sites.add(new Site(url));
+ Site site = toSite((JSONObject) siteObject);
+ sites.add(site);
}
}
} else {
@@ -170,6 +168,19 @@ public final Publisher newInstance(final StaplerRequest request,
return new SiteMonitorRecorder(sites);
}
+ /**
+ * Converts the json object to the Site.
+ * @param siteObject
+ * the siteObject submitted
+ * @return the new Site
+ */
+ private Site toSite(JSONObject siteObject) {
+ String url = siteObject.getString("url");
+ String regex = siteObject.getString("regularExpression");
+ boolean regexFlag = siteObject.getBoolean("failWhenRegexNotFound");
+ return new Site(url, regex, regexFlag);
+ }
+
/**
* Handles SiteMonitor global configuration per Jenkins instance.
* @param request
@@ -205,6 +216,15 @@ public final FormValidation doCheckUrl(@QueryParameter final String value) {
return mValidator.validateUrl(value);
}
+ /**
+ * @param value
+ * the value to validate
+ * @return true if value is a valid Regex, false otherwise
+ */
+ public final FormValidation doCheckRegex(@QueryParameter final String value) {
+ return mValidator.validateRegex(value);
+ }
+
/**
* @param value
* the value to validate
@@ -225,4 +245,13 @@ public final FormValidation doCheckTimeout(
@QueryParameter final String value) {
return mValidator.validateTimeout(value);
}
+
+ /**
+ * @return the url to the help fule
+ */
+ @Override
+ public String getHelpFile() {
+ return "/plugin/sitemonitor/url.html";
+ }
+
}
diff --git a/src/main/java/hudson/plugins/sitemonitor/SiteMonitorRecorder.java b/src/main/java/hudson/plugins/sitemonitor/SiteMonitorRecorder.java
index 946a669..3497674 100644
--- a/src/main/java/hudson/plugins/sitemonitor/SiteMonitorRecorder.java
+++ b/src/main/java/hudson/plugins/sitemonitor/SiteMonitorRecorder.java
@@ -35,7 +35,6 @@
import java.net.MalformedURLException;
import java.net.SocketTimeoutException;
import java.net.URL;
-import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
@@ -48,8 +47,12 @@
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
+
+import org.apache.commons.io.IOUtils;
+
import java.util.ArrayList;
import java.util.List;
+import java.util.regex.Matcher;
/**
* Performs the web site monitoring process.
@@ -161,6 +164,13 @@ public final boolean perform(final AbstractBuild, ?> build,
} else {
status = Status.ERROR;
}
+
+ if (status == Status.UP && site.getRegularExpressionPattern() != null) {
+ Result regexResult = validateWithRegularExpression(site, connection);
+ note = regexResult.getNote();
+ status = regexResult.getStatus();
+ }
+
} catch (SocketTimeoutException ste) {
listener.getLogger().println(ste + " - " + ste.getMessage());
status = Status.DOWN;
@@ -203,6 +213,42 @@ public final boolean perform(final AbstractBuild, ?> build,
return !hasFailure;
}
+ /**
+ * @param site
+ * the Site configuration object
+ * @param connection
+ * the connection to the site
+ * @return the Result with the status and note
+ * @throws IOException
+ * When any IO fails
+ */
+ private Result validateWithRegularExpression(Site site, HttpURLConnection connection) throws IOException {
+ String page = IOUtils.toString(connection.getInputStream());
+ Matcher matcher = site.getRegularExpressionPattern().matcher(page);
+ boolean found = matcher.find();
+ String foundString = null;
+ boolean exact = false;
+ if (found) {
+ foundString = matcher.group();
+ if (site.getRegularExpression().equals(foundString)) {
+ exact = true;
+ }
+ }
+ Status status = Status.UP;
+ if (site.isFailWhenRegexNotFound() != found) {
+ status = Status.DOWN;
+ }
+ String note;
+ if (exact) {
+ note = Messages.SiteMonitor_Status_RegularExpressionExactMatch(foundString);
+ } else if (found) {
+ note = Messages.SiteMonitor_Status_RegularExpressionFound(site.getRegularExpression(), foundString);
+ } else {
+ note = Messages.SiteMonitor_Status_RegularExpressionNotFound(site.getRegularExpression());
+ }
+ return new Result(null, 0, status, note);
+ }
+
/**
* Gets the required monitor service.
* @return the BuildStepMonitor
diff --git a/src/main/java/hudson/plugins/sitemonitor/SiteMonitorValidator.java b/src/main/java/hudson/plugins/sitemonitor/SiteMonitorValidator.java
index b4dbc04..1108aa8 100644
--- a/src/main/java/hudson/plugins/sitemonitor/SiteMonitorValidator.java
+++ b/src/main/java/hudson/plugins/sitemonitor/SiteMonitorValidator.java
@@ -27,6 +27,7 @@
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
+import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
@@ -60,6 +61,24 @@ public final FormValidation validateUrl(final String url) {
return validation;
}
+ /**
+ * Validates a regex.
+ * @param regex
+ * the regex
+ * @return false when regex is malformed, true otherwise
+ */
+ public final FormValidation validateRegex(final String regex) {
+ FormValidation validation = FormValidation.ok();
+ if (StringUtils.isNotBlank(regex)) {
+ try {
+ Pattern.compile(regex);
+ } catch (Exception e) {
+ validation = FormValidation.error(e, e.getLocalizedMessage());
+ }
+ }
+ return validation;
+ }
+
/**
* Validates HTTP connection timeout value.
* @param timeout
diff --git a/src/main/java/hudson/plugins/sitemonitor/model/Site.java b/src/main/java/hudson/plugins/sitemonitor/model/Site.java
index 4fbd16e..f158b2f 100644
--- a/src/main/java/hudson/plugins/sitemonitor/model/Site.java
+++ b/src/main/java/hudson/plugins/sitemonitor/model/Site.java
@@ -21,6 +21,10 @@
*/
package hudson.plugins.sitemonitor.model;
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang.StringUtils;
+
/**
* This class keeps the details of the web site to be monitored.
* @author cliffano
@@ -32,6 +36,37 @@ public class Site {
*/
private String mUrl;
+ /**
+ * The regular expression to check.
+ */
+ private String mRegularExpression;
+
+ /**
+ * The pattern for the expression to check.
+ */
+ transient private Pattern mRegularExpressionPattern;
+
+ /**
+ * The flag for checking the regex.
+ */
+ private boolean mFailWhenRegexNotFound = true;
+
+ /**
+ * Constructs a Site with specified details.
+ * @param url
+ * the web site URL
+ * @param regularExpression
+ * the regular expression to check
+ * @param failWhenRegexNotFound
+ * the flag for checking the regex
+ */
+ public Site(final String url, final String regularExpression, final boolean failWhenRegexNotFound) {
+ mUrl = url;
+ mRegularExpression = regularExpression;
+ mFailWhenRegexNotFound = failWhenRegexNotFound;
+ setRegexPattern();
+ }
+
/**
* Constructs a Site with specified details.
* @param url
@@ -41,10 +76,51 @@ public Site(final String url) {
mUrl = url;
}
+ /**
+ * Sets the regex pattern based on the regex.
+ */
+ private void setRegexPattern() {
+ if (!StringUtils.isEmpty(mRegularExpression)) {
+ mRegularExpressionPattern = Pattern.compile(mRegularExpression);
+ } else {
+ mRegularExpressionPattern = null;
+ }
+ }
+
+ /**
+ * Part of the serialization strategy.
+ * @return this
+ */
+ Object readResolve() {
+ setRegexPattern();
+ return this;
+ }
+
/**
* @return the web site URL
*/
public final String getUrl() {
return mUrl;
}
+
+ /**
+ * @return the regular expression to check
+ */
+ public final String getRegularExpression() {
+ return mRegularExpression;
+ }
+
+ /**
+ * @return the Pattern for the regular expression to check
+ */
+ public final Pattern getRegularExpressionPattern() {
+ return mRegularExpressionPattern;
+ }
+
+ /**
+ * @return the flag for checking the regex
+ */
+ public final boolean isFailWhenRegexNotFound() {
+ return mFailWhenRegexNotFound;
+ }
}
diff --git a/src/main/resources/hudson/plugins/sitemonitor/Messages.properties b/src/main/resources/hudson/plugins/sitemonitor/Messages.properties
old mode 100755
new mode 100644
index 7bde220..50dc075
--- a/src/main/resources/hudson/plugins/sitemonitor/Messages.properties
+++ b/src/main/resources/hudson/plugins/sitemonitor/Messages.properties
@@ -5,6 +5,9 @@ SiteMonitor.Error.PrefixOfURL=URL must start with http:// or https://
SiteMonitor.Error.TimeoutIsBlank=Timeout value must be provided
SiteMonitor.Error.TimeoutIsNotDigit=Timeout value must be a number
SiteMonitor.Error.InvalidResponseCode=Invalid response code(s):
+SiteMonitor.Status.RegularExpressionNotFound=Regular expression "{0}" was not found.
+SiteMonitor.Status.RegularExpressionExactMatch=Exact text "{0}" was found.
+SiteMonitor.Status.RegularExpressionFound=Regular expression "{0}" was found. Matching text was "{1}".
SiteMonitor.Console.URL=URL:
SiteMonitor.Console.ResponseCode=response code:
SiteMonitor.Console.Status=status:
diff --git a/src/main/resources/hudson/plugins/sitemonitor/SiteMonitorRecorder/config.jelly b/src/main/resources/hudson/plugins/sitemonitor/SiteMonitorRecorder/config.jelly
index 7312c89..16710e1 100644
--- a/src/main/resources/hudson/plugins/sitemonitor/SiteMonitorRecorder/config.jelly
+++ b/src/main/resources/hudson/plugins/sitemonitor/SiteMonitorRecorder/config.jelly
@@ -2,10 +2,20 @@
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/webapp/url.html b/src/main/webapp/url.html
index 52a2717..97bbc7c 100644
--- a/src/main/webapp/url.html
+++ b/src/main/webapp/url.html
@@ -1 +1,6 @@
-The URL address of the web site to be monitored. URL should start with http:// or https:// .
\ No newline at end of file
+Provides monitoring of one or more sites. Each site can be configured with
+
+
The URL address of the web site to be monitored. URL should start with http:// or https:// .
+
An optional Regular Expression to check for on the website's page.
+
A flag indicating whether to fail/succeed when the regular expression is found.
+
\ No newline at end of file
diff --git a/src/test/java/hudson/plugins/sitemonitor/model/SiteTest.java b/src/test/java/hudson/plugins/sitemonitor/model/SiteTest.java
index ee9788d..d198e15 100644
--- a/src/test/java/hudson/plugins/sitemonitor/model/SiteTest.java
+++ b/src/test/java/hudson/plugins/sitemonitor/model/SiteTest.java
@@ -11,4 +11,16 @@ public void testGetUrlShouldGiveExpectedUrlValue() {
site = new Site("http://hudson-ci.org");
assertEquals("http://hudson-ci.org", site.getUrl());
}
+
+ public void testGetRegularExpressionShouldGiveExpectedUrlValue() {
+ site = new Site(null, "regex1", false);
+ assertEquals("regex1", site.getRegularExpression());
+ assertEquals("regex1", site.getRegularExpressionPattern().pattern());
+ }
+
+ public void testGetRegularExpressionFlagShouldGiveExpectedUrlValue() {
+ site = new Site(null, null, false);
+ assertEquals(false, site.isFailWhenRegexNotFound());
+ }
+
}