001: package org.drools.decisiontable.model;
002:
003: /*
004: * Copyright 2005 JBoss Inc
005: *
006: * Licensed under the Apache License, Version 2.0 (the "License");
007: * you may not use this file except in compliance with the License.
008: * You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing, software
013: * distributed under the License is distributed on an "AS IS" BASIS,
014: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: * See the License for the specific language governing permissions and
016: * limitations under the License.
017: */
018:
019: /**
020: * @author <a href="mailto:michael.neale@gmail.com"> Michael Neale </a>
021: *
022: * This utility class exists to convert rule script snippets to actual code. The
023: * snippets contain place holders for values to be substituted into. See the
024: * test case for how it really works !
025: *
026: * Snippet template example: "something.getBlah($param)" $param is the "place
027: * holder". This will get replaced with the "cellValue" that is passed in.
028: *
029: * 12-Oct-2005 change: moved from regex to using simple character based interpolation.
030: * Regex was overkill and couldn't not quite get it right.
031: */
032: public class SnippetBuilder {
033:
034: private static final String PARAM_PREFIX = "$";
035:
036: private static final String PARAM = SnippetBuilder.PARAM_PREFIX
037: + "param";
038:
039: private String _template;
040:
041: /**
042: * @param snippetTemplate
043: * The snippet including the "place holder" for a parameter. If
044: * no "place holder" is present,
045: */
046: public SnippetBuilder(final String snippetTemplate) {
047: this ._template = snippetTemplate;
048: }
049:
050: /**
051: * @param cellValue
052: * The value from the cell to populate the snippet with. If no
053: * place holder exists, will just return the snippet.
054: * @return The final snippet.
055: */
056: public String build(final String cellValue) {
057: if (this ._template == null) {
058: throw new RuntimeException(
059: "Script template is null - check for missing script definition.");
060: }
061:
062: if (this ._template.indexOf(SnippetBuilder.PARAM_PREFIX + "1") >= 0) {
063: return buildMulti(cellValue);
064: } else {
065: return buildSingle(cellValue);
066: }
067: }
068:
069: private String buildMulti(final String cellValue) {
070: final String[] cellVals = cellValue.split(",");
071: String result = this ._template;
072:
073: for (int paramNumber = 0; paramNumber < cellVals.length; paramNumber++) {
074: final String replace = SnippetBuilder.PARAM_PREFIX
075: + (paramNumber + 1);
076: result = replace(result, replace, cellVals[paramNumber]
077: .trim(), 256);
078:
079: }
080: return result;
081: }
082:
083: /**
084: * @param cellValue
085: * @return
086: */
087: private String buildSingle(final String cellValue) {
088:
089: return replace(this ._template, SnippetBuilder.PARAM, cellValue,
090: 256);
091:
092: }
093:
094: /**
095: * Simple replacer.
096: * jakarta commons provided the inspiration for this.
097: */
098: private String replace(final String text, final String repl,
099: final String with, int max) {
100: if (text == null || repl == null || repl.equals("")
101: || with == null || max == 0) {
102: return text;
103: }
104:
105: final StringBuffer buf = new StringBuffer(text.length());
106: int start = 0, end = 0;
107: while ((end = text.indexOf(repl, start)) != -1) {
108: buf.append(text.substring(start, end)).append(with);
109: start = end + repl.length();
110:
111: if (--max == 0) {
112: break;
113: }
114: }
115: buf.append(text.substring(start));
116: return buf.toString();
117: }
118:
119: }
|