modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/AlertTokenReplacer.java
| 231 ++++++++++
modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/OperationsSender.java
| 10
modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/PrintTokens.java
| 16
modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/Token.java
| 18
modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/TokenReplacer.java
| 178 -------
modules/enterprise/server/plugins/alert-operations/src/test/java/org/rhq/enterprise/server/plugins/alertOperations/TokenReplacementTest.java
| 72 ++-
modules/enterprise/server/plugins/alert-operations/token2confluence.xsl
| 22
modules/enterprise/server/plugins/alert-operations/tokens.xml
| 137 +++++
8 files changed, 488 insertions(+), 196 deletions(-)
New commits:
commit a197c85ba3abdcf2e5bc6cf45a21f292f90ee6d3
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Mar 1 22:20:25 2010 +0100
Fix generated xml, provide a list of tokens and a way to translate them to confluence
markup.
diff --git
a/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/PrintTokens.java
b/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/PrintTokens.java
index 79ff62e..7b2d7ff 100644
---
a/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/PrintTokens.java
+++
b/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/PrintTokens.java
@@ -58,7 +58,7 @@ public class PrintTokens {
Set<Token> tokens = Token.getByTokenClass(tc);
for (Token token : tokens) {
builder.append(" <token
name=\"").append(token.getName()).append(CLOSE);
- builder.append("
<fullName>").append(token.getText()).append(CLOSE);
+ builder.append("
<fullName>").append(token.getText()).append("</fullName>\n");
builder.append("
<descr>").append(token.getDescription()).append("</descr>\n");
builder.append(" </token>\n");
diff --git a/modules/enterprise/server/plugins/alert-operations/token2confluence.xsl
b/modules/enterprise/server/plugins/alert-operations/token2confluence.xsl
new file mode 100644
index 0000000..8a2b14f
--- /dev/null
+++ b/modules/enterprise/server/plugins/alert-operations/token2confluence.xsl
@@ -0,0 +1,22 @@
+<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+ <xsl:output method="text" indent="no"
xml:space="default"/>
+
+ <xsl:template match="/">
+h2. Tokens for alert-operations sender
+ <xsl:apply-templates />
+ </xsl:template>
+
+ <xsl:template match="tokenClass">
+h3. *<xsl:value-of select="@name"/>*: <xsl:value-of
select="@description"/>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <xsl:template match="token">
+* *<xsl:value-of select="@name"/>*: _<xsl:value-of
select="descr"/>_
+ </xsl:template>
+
+ <xsl:template match="fullName"/>
+ <xsl:template match="descr"/>
+
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/modules/enterprise/server/plugins/alert-operations/tokens.xml
b/modules/enterprise/server/plugins/alert-operations/tokens.xml
new file mode 100644
index 0000000..2c29789
--- /dev/null
+++ b/modules/enterprise/server/plugins/alert-operations/tokens.xml
@@ -0,0 +1,137 @@
+<!-- this file was generated from the Token + TokenClass enums via PrintTokens tool
-->
+<tokenClasses>
+ <tokenClass name="alert" description="Information about the alert
itself">
+ <token name="willBeDisabled">
+ <fullName>alert.willBeDisabled</fullName>
+ <descr>Will the alert definition be disabled after firing?</descr>
+ </token>
+ <token name="id">
+ <fullName>alert.id</fullName>
+ <descr>The id of this particular alert</descr>
+ </token>
+ <token name="url">
+ <fullName>alert.url</fullName>
+ <descr>Url to the alert details page</descr>
+ </token>
+ <token name="name">
+ <fullName>alert.name</fullName>
+ <descr>Name from the defining alert definition</descr>
+ </token>
+ <token name="priority">
+ <fullName>alert.priority</fullName>
+ <descr>Priority of this alert</descr>
+ </token>
+ <token name="description">
+ <fullName>alert.description</fullName>
+ <descr>Description of this alert</descr>
+ </token>
+ <token name="firedAt">
+ <fullName>alert.firedAt</fullName>
+ <descr>Time the alert fired</descr>
+ </token>
+ <token name="conditions">
+ <fullName>alert.conditions</fullName>
+ <descr>A text representation of the conditions that led to this
alert</descr>
+ </token>
+ <token name="willRecover">
+ <fullName>alert.willRecover</fullName>
+ <descr>?? TODO</descr>
+ </token>
+ </tokenClass>
+ <tokenClass name="resource" description="Information about the
resource that triggered the alert">
+ <token name="id">
+ <fullName>resource.id</fullName>
+ <descr>Id of the resource</descr>
+ </token>
+ <token name="platformType">
+ <fullName>resource.platformType</fullName>
+ <descr>Type of the platform the resource is on</descr>
+ </token>
+ <token name="platformName">
+ <fullName>resource.platformName</fullName>
+ <descr>Name of the platform the resource is on</descr>
+ </token>
+ <token name="typeName">
+ <fullName>resource.typeName</fullName>
+ <descr>Resource type name</descr>
+ </token>
+ <token name="name">
+ <fullName>resource.name</fullName>
+ <descr>Name of the resource</descr>
+ </token>
+ <token name="platformId">
+ <fullName>resource.platformId</fullName>
+ <descr>Id of the platform the resource is on</descr>
+ </token>
+ <token name="parentName">
+ <fullName>resource.parentName</fullName>
+ <descr>Name of the parent resource</descr>
+ </token>
+ <token name="parentId">
+ <fullName>resource.parentId</fullName>
+ <descr>Id of the parent resource</descr>
+ </token>
+ <token name="typeId">
+ <fullName>resource.typeId</fullName>
+ <descr>Resource type id</descr>
+ </token>
+ </tokenClass>
+ <tokenClass name="targetResource" description="Information about the
resource the alert is fired on ">
+ <token name="parentId">
+ <fullName>targetResource.parentId</fullName>
+ <descr>Id of the target's parent resource</descr>
+ </token>
+ <token name="platformName">
+ <fullName>targetResource.platformName</fullName>
+ <descr>Name of the platform the target resource is on</descr>
+ </token>
+ <token name="platformId">
+ <fullName>targetResource.platformId</fullName>
+ <descr>Id of the platform the target resource is on</descr>
+ </token>
+ <token name="parentName">
+ <fullName>targetResource.parentName</fullName>
+ <descr>Name of the target's parent resource</descr>
+ </token>
+ <token name="typeId">
+ <fullName>targetResource.typeId</fullName>
+ <descr>Resource type of the target resource id</descr>
+ </token>
+ <token name="platformType">
+ <fullName>targetResource.platformType</fullName>
+ <descr>Type of the platform the target resource is on</descr>
+ </token>
+ <token name="name">
+ <fullName>targetResource.name</fullName>
+ <descr>Name of the target resource</descr>
+ </token>
+ <token name="id">
+ <fullName>targetResource.id</fullName>
+ <descr>Id of the target resource</descr>
+ </token>
+ <token name="typeName">
+ <fullName>targetResource.typeName</fullName>
+ <descr>Resource type name of the target resource</descr>
+ </token>
+ </tokenClass>
+ <tokenClass name="operation" description="Information about the
triggered operation">
+ <token name="id">
+ <fullName>operation.id</fullName>
+ <descr>Id of the operation fired</descr>
+ </token>
+ <token name="name">
+ <fullName>operation.name</fullName>
+ <descr>Name of the operation fired</descr>
+ </token>
+ </tokenClass>
+ <tokenClass name="test" description="Just some dummies for internal
testing purposes">
+ <token name="echo">
+ <fullName>test.echo</fullName>
+ <descr>Echo the input</descr>
+ </token>
+ <token name="fix">
+ <fullName>test.fix</fullName>
+ <descr>Return a fixed string</descr>
+ </token>
+ </tokenClass>
+</tokenClasses>
commit 653e41c57c1fb6facc52ba3d22c20259f9717141
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Mar 1 21:47:17 2010 +0100
Support more tokens
diff --git
a/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/AlertTokenReplacer.java
b/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/AlertTokenReplacer.java
new file mode 100644
index 0000000..e8c61dd
--- /dev/null
+++
b/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/AlertTokenReplacer.java
@@ -0,0 +1,231 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.server.plugins.alertOperations;
+
+import java.util.Date;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.rhq.core.domain.alert.Alert;
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.operation.OperationDefinition;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.enterprise.server.alert.AlertManagerLocal;
+import org.rhq.enterprise.server.resource.ResourceManagerLocal;
+import org.rhq.enterprise.server.util.LookupUtil;
+
+/**
+ * Helper to replace tokens by their values
+ * @author Heiko W. Rupp
+ */
+public class AlertTokenReplacer {
+
+ private final Log log = LogFactory.getLog(AlertTokenReplacer.class);
+ public static final String NOT_YET_IMPLEMENTED = " - not yet implemented
-";
+ protected static final String THE_QUICK_BROWN_FOX_JUMPS_OVER_THE_LAZY_DOG =
"TheQuickBrownFoxJumpsOverTheLazyDOg";
+ private Alert alert;
+ private Pattern pattern;
+ private OperationDefinition operationDefinition;
+ private Resource targetResource;
+
+ public AlertTokenReplacer(Alert alert, OperationDefinition operationDefinition,
Resource targetResource) {
+ this.alert = alert;
+ this.operationDefinition = operationDefinition;
+ pattern = Pattern.compile("<%\\s*([a-z]+\\.[a-z0-9]+)\\s*%>");
+ }
+
+ /**
+ * Replace all tokens on the input line. If no tokens are found the input is
returned.
+ * Tokens have the form '<i><% class.sub %></i>'
+ * @param input a line of text
+ * @return input with tokens replaced.
+ * @see org.rhq.enterprise.server.plugins.alertOperations.Token
+ * @see org.rhq.enterprise.server.plugins.alertOperations.TokenClass
+ */
+ public String replaceTokens(String input) {
+
+ String work = input;
+ Matcher matcher = pattern.matcher(work);
+ if (!matcher.find()) {
+ log.warn("No tokens found in " + input);
+ return input;
+ }
+ matcher.reset();
+
+ do {
+ matcher = pattern.matcher(work);
+ if (!matcher.find()) {
+ break;
+ }
+ String replacement = replaceToken(matcher.group(1)
);
+ String s = matcher.replaceFirst(replacement);
+ work = s;
+
+ } while (true);
+
+ return work;
+ }
+
+
+
+ /**
+ * Replace the token string passed (without the token delimiters ) with the actual
value
+ * @param tokenString Input like alert.id
+ * @return replacement string or the input if the token was not valid.
+ */
+ public String replaceToken(String tokenString) {
+
+ // Ok, we have at least one token. Now split the tokenString and loop over the
tokens
+
+ if (!tokenString.contains("."))
+ return tokenString;
+
+ String tmp = tokenString.substring(0, tokenString.indexOf("."));
+ TokenClass tc = TokenClass.getByText(tmp);
+ if (tc==null) {
+ log.warn("Unknown token class in [" + tokenString + "], not
replacing tokens");
+ return tokenString;
+ }
+
+ Token token = Token.getByText(tokenString);
+ if (token == null) {
+ log.warn("No known token found in [" + tokenString + "], not
replacing token");
+ return tokenString;
+ }
+ String ret = null;
+ switch (tc) {
+ case ALERT:
+ ret = replaceAlertToken(token,alert);
+ break;
+ case RESOURCE:
+ ret =
replaceResourceToken(token,alert.getAlertDefinition().getResource());
+ break;
+ case TARGET_RESOURCE:
+ // Create a "pseudo" token to feed it into the plain resource
replacement code
+ String text = "resource." + token.getName();
+ Token tok = Token.getByText(text);
+ ret = replaceResourceToken(tok, targetResource);
+ break;
+ case OPERATION:
+ ret = replaceOperationToken(token);
+ break;
+ case TEST:
+ switch (token) {
+ case TEST_ECHO:
+ ret = tokenString;
+ break;
+ case TEST_FIX:
+ ret = THE_QUICK_BROWN_FOX_JUMPS_OVER_THE_LAZY_DOG;
+ break;
+ default:
+ ret = NOT_YET_IMPLEMENTED;
+ }
+ break;
+ }
+ return ret;
+ }
+
+ private String replaceAlertToken(Token token, Alert alert) {
+
+ AlertManagerLocal mgr = LookupUtil.getAlertManager();
+
+ switch (token) {
+ case ALERT_ID:
+ return String.valueOf(alert.getId());
+ case ALERT_FIRE_TIME:
+ return new Date(alert.getCtime()).toString(); // TODO use a specific impl
here?
+ case ALERT_WILL_RECOVER:
+ return String.valueOf(alert.getAlertDefinition().getWillRecover());
+ case ALERT_WILL_DISABLE:
+ return String.valueOf(mgr.willDefinitionBeDisabled(alert));
+ case ALERT_DEF_NAME:
+ return alert.getAlertDefinition().getName();
+ case ALERT_DEF_DESC:
+ return alert.getAlertDefinition().getDescription();
+ case ALERT_DEF_PRIO:
+ return alert.getAlertDefinition().getPriority().getName();
+ case ALERT_URL:
+ return mgr.prettyPrintAlertURL(alert);
+ case ALERT_CONDITIONS:
+ return mgr.prettyPrintAlertConditions(alert,false);
+
+
+ default:
+ return NOT_YET_IMPLEMENTED;
+ }
+
+ }
+
+ private String replaceResourceToken(Token token, Resource resource) {
+
+ ResourceManagerLocal mgr = LookupUtil.getResourceManager();
+ Subject overlord = LookupUtil.getSubjectManager().getOverlord();
+ Resource parent;
+ Resource platform = mgr.getPlaformOfResource(overlord,resource.getId());
+
+ switch (token) {
+ case RESOURCE_ID:
+ return String.valueOf(resource.getId());
+ case RESOURCE_NAME:
+ return resource.getName();
+ case RESOURCE_PARENT_ID:
+ parent = mgr.getParentResource(resource.getId());
+ if (parent==null)
+ return "0";
+ else
+ return String.valueOf(parent.getId());
+ case RESOURCE_PARENT_NAME:
+ parent = mgr.getParentResource(resource.getId());
+ if (parent==null)
+ return "0";
+ else
+ return String.valueOf(parent.getId());
+ case RESOURCE_TYPE_ID:
+ return String.valueOf(resource.getResourceType().getId());
+ case RESOURCE_TYPE_NAME:
+ return resource.getResourceType().getName();
+ case RESOURCE_PLATFORM_ID:
+ return String.valueOf(platform.getId());
+ case RESOURCE_PLATFORM_NAME:
+ return platform.getName();
+ case RESOURCE_PLATFORM_TYPE:
+ return platform.getResourceType().getName();
+
+ default:
+ return NOT_YET_IMPLEMENTED;
+ }
+ }
+
+ private String replaceOperationToken(Token token) {
+
+ switch (token) {
+ case OPERATION_ID:
+ return String.valueOf(operationDefinition.getId());
+ case OPERATION_NAME:
+ return operationDefinition.getName();
+
+
+ default:
+ return NOT_YET_IMPLEMENTED;
+ }
+ }
+}
diff --git
a/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/OperationsSender.java
b/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/OperationsSender.java
index 4f6c88e..635085a 100644
---
a/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/OperationsSender.java
+++
b/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/OperationsSender.java
@@ -78,9 +78,11 @@ public class OperationsSender extends AlertSender {
Subject subject = LookupUtil.getSubjectManager().getOverlord(); // TODO get real
subject
List<OperationDefinition> opdefs =
opMgr.findSupportedResourceOperations(subject,resourceId,false);
- for (OperationDefinition opdef : opdefs ) {
- if (opdef.getId() == opId) {
- opName = opdef.getName();
+ OperationDefinition opDef = null;
+ for (OperationDefinition tmp : opdefs ) {
+ if (tmp.getId() == opId) {
+ opName = tmp.getName();
+ opDef = tmp;
break;
}
}
@@ -110,7 +112,7 @@ public class OperationsSender extends AlertSender {
if (parameters!=null && tokenMode.equals(INTERPRETED)) {
Map<String,PropertySimple> propsMap =
parameters.getSimpleProperties();
if (!propsMap.isEmpty()) {
- TokenReplacer tr = new TokenReplacer(alert);
+ AlertTokenReplacer tr = new AlertTokenReplacer(alert, opDef, null);
for (PropertySimple prop : propsMap.values()) {
String tmp = prop.getStringValue();
tmp = tr.replaceTokens(tmp);
diff --git
a/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/PrintTokens.java
b/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/PrintTokens.java
index 78ac850..79ff62e 100644
---
a/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/PrintTokens.java
+++
b/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/PrintTokens.java
@@ -35,6 +35,17 @@ public class PrintTokens {
public static void main(String[] args) throws Exception {
+ String text = createTokenDescription();
+
+ System.out.println(text);
+ }
+
+ /**
+ * Do the work and return an xml structure that lists available token classes and
+ * tokens along with their descriptions.
+ * @return String with an XML representation of the available tokens
+ */
+ public static String createTokenDescription() {
EnumSet<TokenClass> tokenClasses = EnumSet.allOf(TokenClass.class);
StringBuilder builder = new StringBuilder("<tokenClasses>\n");
@@ -58,7 +69,6 @@ public class PrintTokens {
}
builder.append("</tokenClasses>\n");
-
- System.out.println(builder.toString());
+ return builder.toString();
}
}
diff --git
a/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/Token.java
b/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/Token.java
index e665bd4..2d810f0 100644
---
a/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/Token.java
+++
b/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/Token.java
@@ -43,11 +43,25 @@ public enum Token {
// resource that triggered the alert related tokens
RESOURCE_ID(TokenClass.RESOURCE, "id", "Id of the resource"),
RESOURCE_NAME(TokenClass.RESOURCE, "name", "Name of the
resource"),
+ RESOURCE_PARENT_ID(TokenClass.RESOURCE, "parentId", "Id of the parent
resource"),
+ RESOURCE_PARENT_NAME(TokenClass.RESOURCE, "parentName", "Name of the
parent resource"),
+ RESOURCE_TYPE_ID(TokenClass.RESOURCE,"typeId","Resource type
id"),
+ RESOURCE_TYPE_NAME(TokenClass.RESOURCE,"typeName","Resource type
name"),
+ RESOURCE_PLATFORM_ID(TokenClass.RESOURCE,"platformId", "Id of the
platform the resource is on"),
+ RESOURCE_PLATFORM_NAME(TokenClass.RESOURCE,"platformName", "Name of
the platform the resource is on"),
+ RESOURCE_PLATFORM_TYPE(TokenClass.RESOURCE,"platformType", "Type of
the platform the resource is on"),
// resource the operation is run on related tokens
TRESOURCE_ID(TokenClass.TARGET_RESOURCE, "id","Id of the target
resource"),
TRESOURCE_NAME(TokenClass.TARGET_RESOURCE, "name", "Name of the target
resource"),
+ TRESOURCE_PARENT_ID(TokenClass.TARGET_RESOURCE, "parentId", "Id of the
target's parent resource"),
+ TRESOURCE_PARENT_NAME(TokenClass.TARGET_RESOURCE, "parentName", "Name
of the target's parent resource"),
+ TRESOURCE_TYPE_ID(TokenClass.TARGET_RESOURCE,"typeId","Resource type
of the target resource id"),
+ TRESOURCE_TYPE_NAME(TokenClass.TARGET_RESOURCE,"typeName","Resource
type name of the target resource"),
+ TRESOURCE_PLATFORM_ID(TokenClass.TARGET_RESOURCE,"platformId", "Id of
the platform the target resource is on"),
+ TRESOURCE_PLATFORM_NAME(TokenClass.TARGET_RESOURCE,"platformName",
"Name of the platform the target resource is on"),
+ TRESOURCE_PLATFORM_TYPE(TokenClass.TARGET_RESOURCE,"platformType",
"Type of the platform the target resource is on"),
// Information about the fired operation
@@ -56,9 +70,7 @@ public enum Token {
// only for testing
TEST_ECHO(TokenClass.TEST,"echo", "Echo the input"),
- TEST_FIX(TokenClass.TEST,"fix", "Return a fixed string")
-
- ;
+ TEST_FIX(TokenClass.TEST,"fix", "Return a fixed string");
private TokenClass tc;
diff --git
a/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/TokenReplacer.java
b/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/TokenReplacer.java
deleted file mode 100644
index 0b230b4..0000000
---
a/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/TokenReplacer.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2010 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program 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 for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.server.plugins.alertOperations;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.rhq.core.domain.alert.Alert;
-import org.rhq.core.domain.resource.Resource;
-
-/**
- * Helper to replace tokens by their values
- * @author Heiko W. Rupp
- */
-public class TokenReplacer {
-
- private final Log log = LogFactory.getLog(TokenReplacer.class);
- private static final String NOT_YET_IMPLEMENTED = " - not yet implemented
-";
- protected static final String THE_QUICK_BROWN_FOX_JUMPS_OVER_THE_LAZY_DOG =
"TheQuickBrownFoxJumpsOverTheLazyDOg";
- private Alert alert;
- private Pattern pattern;
-
- public TokenReplacer(Alert alert) {
- this.alert = alert;
- pattern = Pattern.compile("<%\\s*([a-z]+\\.[a-z0-9]+)\\s*%>");
- }
-
- /**
- * Replace all tokens on the input line. If no tokens are found the input is
returned.
- * Tokens have the form '<i><% class.sub %></i>'
- * @param input a line of text
- * @return input with tokens replaced.
- * @see org.rhq.enterprise.server.plugins.alertOperations.Token
- * @see org.rhq.enterprise.server.plugins.alertOperations.TokenClass
- */
- public String replaceTokens(String input) {
-
- String work = input;
- Matcher matcher = pattern.matcher(work);
- if (!matcher.find()) {
- log.warn("No tokens found in " + input);
- return input;
- }
- matcher.reset();
-
- do {
-// System.out.println(input);
- matcher = pattern.matcher(work);
- if (!matcher.find()) {
- break;
- }
-// System.out.println(matcher.regionStart() + ":" +
matcher.regionEnd() + input.substring(matcher.regionStart(),matcher.regionEnd()));
-// System.out.println(matcher.group(1));
- String replacement = replaceToken(matcher.group(1)
);
- String s = matcher.replaceFirst(replacement);
-// System.out.println(s);
- work = s;
-
-// System.out.println("----");
- } while (true);
-
- return work;
- }
-
-
-
- /**
- * Replace the token string passed (without the token delimiters ) with the actual
value
- * @param tokenString Input like alert.id
- * @return replacement string or the input if the token was not valid.
- */
- public String replaceToken(String tokenString) {
-
- // Ok, we have at least one token. Now split the tokenString and loop over the
tokens
-
- if (!tokenString.contains("."))
- return tokenString;
-
- String tmp = tokenString.substring(0, tokenString.indexOf("."));
- TokenClass tc = TokenClass.getByText(tmp);
- if (tc==null) {
- log.warn("Unknown token class in [" + tokenString + "], not
replacing tokens");
- return tokenString;
- }
-
- Token token = Token.getByText(tokenString);
- if (token == null) {
- log.warn("No known token found in [" + tokenString + "], not
replacing token");
- return tokenString;
- }
- String ret = null;
- switch (tc) {
- case ALERT:
- ret = replaceAlertToken(token,alert);
- break;
- case RESOURCE:
- ret =
replaceResourceToken(token,alert.getAlertDefinition().getResource());
- break;
- case TARGET_RESOURCE:
- Resource resource = null; // TODO
- ret = replaceTargetResourceToken(token, resource);
- break;
- case TEST:
- switch (token) {
- case TEST_ECHO:
- ret = tokenString;
- break;
- case TEST_FIX:
- ret = THE_QUICK_BROWN_FOX_JUMPS_OVER_THE_LAZY_DOG;
- break;
- default:
- ret = NOT_YET_IMPLEMENTED;
- }
- break;
- }
- return ret;
- }
-
- private String replaceAlertToken(Token token, Alert alert) {
-
- switch (token) {
- case ALERT_ID:
- return String.valueOf(alert.getId());
- case ALERT_URL:
- return NOT_YET_IMPLEMENTED;
-
- default:
- return NOT_YET_IMPLEMENTED;
- }
-
- }
-
- private String replaceResourceToken(Token token, Resource resource) {
-
- switch (token) {
- case RESOURCE_ID:
- return String.valueOf(resource.getId());
- case RESOURCE_NAME:
- return resource.getName();
-
- default:
- return NOT_YET_IMPLEMENTED;
- }
- }
-
- private String replaceTargetResourceToken(Token token, Resource resource) {
-
- switch (token) {
- case TRESOURCE_ID:
- return String.valueOf(resource.getId());
- case TRESOURCE_NAME:
- return resource.getName();
-
- default:
- return NOT_YET_IMPLEMENTED;
- }
- }
-
-}
diff --git
a/modules/enterprise/server/plugins/alert-operations/src/test/java/org/rhq/enterprise/server/plugins/alertOperations/TokenReplacementTest.java
b/modules/enterprise/server/plugins/alert-operations/src/test/java/org/rhq/enterprise/server/plugins/alertOperations/TokenReplacementTest.java
index f41fc85..cf6c48d 100644
---
a/modules/enterprise/server/plugins/alert-operations/src/test/java/org/rhq/enterprise/server/plugins/alertOperations/TokenReplacementTest.java
+++
b/modules/enterprise/server/plugins/alert-operations/src/test/java/org/rhq/enterprise/server/plugins/alertOperations/TokenReplacementTest.java
@@ -18,12 +18,15 @@
*/
package org.rhq.enterprise.server.plugins.alertOperations;
+import java.util.EnumSet;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.testng.annotations.Test;
import org.rhq.core.domain.alert.Alert;
import org.rhq.core.domain.alert.AlertDefinition;
+import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.resource.Resource;
/**
@@ -42,17 +45,18 @@ public class TokenReplacementTest {
public void testSimpleReplacement() throws Exception {
Alert al = new Alert();
- TokenReplacer tr = new TokenReplacer(al);
+ AlertTokenReplacer tr = new AlertTokenReplacer(al, null, null);
String res = tr.replaceToken("test.fix");
assert res != null;
- assert res.equals(TokenReplacer.THE_QUICK_BROWN_FOX_JUMPS_OVER_THE_LAZY_DOG);
+ assert
res.equals(AlertTokenReplacer.THE_QUICK_BROWN_FOX_JUMPS_OVER_THE_LAZY_DOG);
res = tr.replaceToken(TEST_ECHO);
assert res != null;
assert res.equals(TEST_ECHO);
+/*
res = tr.replaceToken("alert.id");
assert res != null;
assert res.equals("0");
@@ -62,18 +66,19 @@ public class TokenReplacementTest {
AlertDefinition def = new AlertDefinition();
def.setResource(r);
al = new Alert(def, System.currentTimeMillis());
- tr = new TokenReplacer(al);
+ tr = new AlertTokenReplacer(al, null, null);
res = tr.replaceToken("resource.id");
assert "1234".equals(res);
res = tr.replaceToken("resource.name");
assert "A resource".equals(res);
+*/
}
public void testInvalidTokenString() {
Alert al = new Alert();
- TokenReplacer tr = new TokenReplacer(al);
+ AlertTokenReplacer tr = new AlertTokenReplacer(al, null, null);
String res = tr.replaceToken(FOO_BAR);
@@ -93,13 +98,13 @@ public class TokenReplacementTest {
public void testFullTokenSimple() {
Alert al = new Alert();
- TokenReplacer tr = new TokenReplacer(al);
+ AlertTokenReplacer tr = new AlertTokenReplacer(al, null, null);
String res = tr.replaceTokens("<%test.fix%>");
assert res != null;
assert !res.equals("<%test.fix%>") : "Res was " + res;
- assert res.equals(TokenReplacer.THE_QUICK_BROWN_FOX_JUMPS_OVER_THE_LAZY_DOG);
+ assert
res.equals(AlertTokenReplacer.THE_QUICK_BROWN_FOX_JUMPS_OVER_THE_LAZY_DOG);
String TF2 = "<% test.fix %>";
res = tr.replaceTokens(TF2);
@@ -120,16 +125,67 @@ public class TokenReplacementTest {
assert res != null;
assert res.equals(FOO_BAR) : "Res was " + res;
+/*
Resource r = new Resource(1234);
r.setName("A resource");
AlertDefinition def = new AlertDefinition();
def.setResource(r);
al = new Alert(def, System.currentTimeMillis());
- tr = new TokenReplacer(al);
+ tr = new AlertTokenReplacer(al, null, null);
res = tr.replaceTokens("<% test.fix%><%resource.id%>");
assert res!=null;
- assert
res.equals(TokenReplacer.THE_QUICK_BROWN_FOX_JUMPS_OVER_THE_LAZY_DOG+"1234");
+ assert
res.equals(AlertTokenReplacer.THE_QUICK_BROWN_FOX_JUMPS_OVER_THE_LAZY_DOG+"1234");
+*/
+ }
+
+ public void testOperationTokens() {
+ Resource r = new Resource(1234);
+ AlertDefinition def = new AlertDefinition();
+ def.setResource(r);
+ Alert al = new Alert(def, System.currentTimeMillis());
+
+ AlertTokenReplacer tr;
+ OperationDefinition opDef = new
OperationDefinition(123,"helloOps",null,"This is a test",0,"Just
testing");
+ tr = new AlertTokenReplacer(al,opDef, null);
+ String res = tr.replaceTokens("<%operation.id%>");
+ assert res!=null;
+ assert res.equals("123") : "Result is " + res;
+ res = tr.replaceTokens("<%operation.name%>");
+ assert res!=null;
+ assert res.equals("helloOps");
+ }
+
+ public void testTokenPrinter() {
+
+ String result = PrintTokens.createTokenDescription();
+ assert result != null;
+ assert !result.isEmpty();
+ assert result.contains("<token ");
}
+/*
+ public void testReplaceAllTokens() {
+
+ EnumSet<Token> tokens = EnumSet.allOf(Token.class);
+
+ Resource r = new Resource(1234);
+ AlertDefinition def = new AlertDefinition();
+ def.setResource(r);
+ Alert al = new Alert(def, System.currentTimeMillis());
+
+ AlertTokenReplacer tr;
+ OperationDefinition opDef = new
OperationDefinition(123,"helloOps",null,"This is a test",0,"Just
testing");
+ tr = new AlertTokenReplacer(al,opDef, null);
+
+ for (Token token : tokens) {
+
+ String input = "<%" + token.getText() + "%>";
+ String res = tr.replaceTokens(input);
+ assert res != null;
+ assert !res.isEmpty();
+ assert !res.equals(AlertTokenReplacer.NOT_YET_IMPLEMENTED) :
"Replacement for token [" + token.getText() + "] is not implemented";
+ }
+ }
+*/
}