From a4682ceae6774956461edd03b2485bbacea445f4 Mon Sep 17 00:00:00 2001 From: mharmsen Date: Tue, 4 Oct 2011 01:17:41 +0000 Subject: Bugzilla Bug #688225 - (dogtagIPAv2.1) TRACKER: of the Dogtag fixes for freeIPA 2.1 git-svn-id: svn+ssh://svn.fedorahosted.org/svn/pki/tags/IPA_v2_RHEL_6_2_20111003@2252 c9f7a03b-bd48-0410-a16d-cbbf54688b0b --- .../src/com/netscape/certsrv/pattern/Pattern.java | 164 +++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 pki/base/common/src/com/netscape/certsrv/pattern/Pattern.java (limited to 'pki/base/common/src/com/netscape/certsrv/pattern/Pattern.java') diff --git a/pki/base/common/src/com/netscape/certsrv/pattern/Pattern.java b/pki/base/common/src/com/netscape/certsrv/pattern/Pattern.java new file mode 100644 index 000000000..fe6426306 --- /dev/null +++ b/pki/base/common/src/com/netscape/certsrv/pattern/Pattern.java @@ -0,0 +1,164 @@ +// --- BEGIN COPYRIGHT BLOCK --- +// 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., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +// +// (C) 2007 Red Hat, Inc. +// All rights reserved. +// --- END COPYRIGHT BLOCK --- +package com.netscape.certsrv.pattern; + + +import java.util.*; +import com.netscape.certsrv.base.*; + + +/** + * This is a generic pattern subtitution engine. The + * pattern format should be: + *

+ * $[attribute set key].[attribute name]$ + *

+ * For example, + *

+ * $request.requestor_email$ + * $ctx.user_id$ + *

+ * + * @version $Revision$, $Date$ + */ +public class Pattern { + + private String mS = null; + + /** + * Constructs a pattern object with the given string. + * + * @param s string with pattern (i.e. $request.requestor_email$) + */ + public Pattern(String s) { + mS = s; + } + + /** + * Subtitutes this pattern with the given attribute set. + * + * @param key key name of the given attribute set + * @param attrSet attribute set + * @return substituted string + */ + public String substitute(String key, IAttrSet attrSet) { + return substitute2(key, attrSet); + } + + /** + * Subtitutes this pattern with the given attribute set. + * + * @param attrSetCollection attribute set collection + * @return substituted string + */ + public String substitute(AttrSetCollection attrSetCollection) { + String temp = mS; + Enumeration keys = attrSetCollection.keys(); + + while (keys.hasMoreElements()) { + String key = (String) keys.nextElement(); + Pattern p = new Pattern(temp); + + temp = p.substitute(key, + attrSetCollection.getAttrSet(key)); + + } + return temp; + } + + /** + * Subtitutes this pattern with the given attribute set. + * + * This is an extended version of the substitute() method. + * It takes a more flexible pattern format that could have + * non-token ($...$) format. e.g. + * $request.screenname$@redhat.com + * where "@redhat.com" is not in token pattern format, and will be + * literally put in place. e.g. + * TomRiddle@redhat.com + * + * @param key key name of the given attribute set + * @param attrSet attribute set + * @return substituted string + */ + public String substitute2(String key, IAttrSet attrSet) { + StringBuffer sb = new StringBuffer(); + + int startPos = 0; + int lastPos; + + do { + // from startPos to right before '$' or end of string + // need to be copied over + + lastPos = mS.indexOf('$', startPos); + + // if no '$', return the entire string + if (lastPos == -1 && startPos == 0) + return mS; + + // no more '$' found, copy the rest of chars, done + if (lastPos == -1) { + sb.append(mS.substring(startPos)); // + return sb.toString(); // + // continue; + } + + // found '$' + if (startPos < lastPos) { + sb.append(mS.substring(startPos, lastPos)); + } + + // look for the ending '$' + int endPos = mS.indexOf('$', lastPos + 1); + String token = mS.substring(lastPos + 1, endPos); + int dotPos = token.indexOf('.'); + + // it's assuming there's always a '.' + String attrKey = token.substring(0, dotPos); + String attrName = token.substring(dotPos + 1); + + if (!key.equals(attrKey)) { + startPos = endPos + 1; + sb.append("$" + attrKey + "." + attrName + "$"); + continue; + } + + try { + Object o = attrSet.get(attrName); + + if (!(o instanceof String)) { + startPos = endPos + 1; + // if no such attrName, copy the token pattern over + sb.append("$" + attrKey + "." + attrName + "$"); + continue; + } + String val = (String) o; + + sb.append(val); + } catch (EBaseException e) { + sb.append("$" + attrKey + "." + attrName + "$"); + } + startPos = endPos + 1; + } + while (lastPos != -1); + + return sb.toString(); + } + +} -- cgit