From 621d9e5c413e561293d7484b93882d985b3fe15f Mon Sep 17 00:00:00 2001 From: Endi Sukma Dewata Date: Sat, 24 Mar 2012 02:27:47 -0500 Subject: Removed unnecessary pki folder. Previously the source code was located inside a pki folder. This folder was created during svn migration and is no longer needed. This folder has now been removed and the contents have been moved up one level. Ticket #131 --- .../certsrv/pattern/AttrSetCollection.java | 63 ++++++++ .../src/com/netscape/certsrv/pattern/Pattern.java | 162 +++++++++++++++++++++ 2 files changed, 225 insertions(+) create mode 100644 base/common/src/com/netscape/certsrv/pattern/AttrSetCollection.java create mode 100644 base/common/src/com/netscape/certsrv/pattern/Pattern.java (limited to 'base/common/src/com/netscape/certsrv/pattern') diff --git a/base/common/src/com/netscape/certsrv/pattern/AttrSetCollection.java b/base/common/src/com/netscape/certsrv/pattern/AttrSetCollection.java new file mode 100644 index 000000000..5f73fc257 --- /dev/null +++ b/base/common/src/com/netscape/certsrv/pattern/AttrSetCollection.java @@ -0,0 +1,63 @@ +// --- 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.Hashtable; + +import com.netscape.certsrv.base.IAttrSet; + +/** + * This class represents a collection of attribute + * sets. + * + * @version $Revision$, $Date$ + */ +public class AttrSetCollection extends Hashtable { + + /** + * + */ + private static final long serialVersionUID = -8499028375092730021L; + + /** + * Constructs a collection. + */ + public AttrSetCollection() { + super(); + } + + /** + * Retrieves a attribute set from this collection. + * + * @param name name of the attribute set + * @return attribute set + */ + public IAttrSet getAttrSet(String name) { + return (IAttrSet) get(name); + } + + /** + * Sets attribute set in this collection. + * + * @param name set of the attribute set + * @param set attribute set + */ + public void putAttrSet(String name, IAttrSet set) { + put(name, set); + } +} diff --git a/base/common/src/com/netscape/certsrv/pattern/Pattern.java b/base/common/src/com/netscape/certsrv/pattern/Pattern.java new file mode 100644 index 000000000..bce3a426b --- /dev/null +++ b/base/common/src/com/netscape/certsrv/pattern/Pattern.java @@ -0,0 +1,162 @@ +// --- 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.Enumeration; + +import com.netscape.certsrv.base.EBaseException; +import com.netscape.certsrv.base.IAttrSet; + +/** + * 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