001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. 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, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 * 019 */ 020 package org.apache.directory.shared.ldap.schema.normalizers; 021 022 023 import java.util.regex.Matcher; 024 import java.util.regex.Pattern; 025 026 import org.apache.directory.shared.ldap.entry.StringValue; 027 import org.apache.directory.shared.ldap.entry.Value; 028 import org.apache.directory.shared.ldap.schema.Normalizer; 029 030 031 /** 032 * A Normalizer that uses Perl5 based regular expressions to normalize values. 033 * 034 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> 035 * @version $Rev: 928945 $ 036 */ 037 public class RegexNormalizer extends Normalizer 038 { 039 /** The serial UID */ 040 public static final long serialVersionUID = 1L; 041 042 /** the perl 5 regex engine */ 043 private final Pattern[] regexes; 044 045 /** the set of regular expressions used to transform values */ 046 private final Matcher[] matchers; 047 048 049 /** 050 * Creates a Perl5 regular expression based normalizer. 051 * 052 * @param oid The MR OID to use for this Normalizer 053 * @param regexes the set of regular expressions used to transform values 054 */ 055 public RegexNormalizer( String oid, Pattern[] regexes ) 056 { 057 super( oid ); 058 if ( regexes != null ) 059 { 060 this.regexes = new Pattern[ regexes.length ]; 061 System.arraycopy( regexes, 0, this.regexes, 0, regexes.length ); 062 063 matchers = new Matcher[regexes.length]; 064 065 for ( int i = 0; i < regexes.length; i++ ) 066 { 067 matchers[i] = regexes[i].matcher( "" ); 068 } 069 } 070 else 071 { 072 this.regexes = null; 073 matchers = new Matcher[0]; 074 } 075 } 076 077 078 /** 079 * {@inheritDoc} 080 */ 081 public Value<?> normalize( final Value<?> value ) 082 { 083 if ( value == null ) 084 { 085 return null; 086 } 087 088 if ( !value.isBinary() ) 089 { 090 String str = value.getString(); 091 092 for ( int i = 0; i < matchers.length; i++ ) 093 { 094 095 str = matchers[i].replaceAll( str ); 096 } 097 098 return new StringValue( str ); 099 } 100 101 return value; 102 } 103 104 105 106 107 /** 108 * {@inheritDoc} 109 */ 110 public String normalize( String value ) 111 { 112 if ( value == null ) 113 { 114 return null; 115 } 116 117 String str = value; 118 119 for ( int i = 0; i < matchers.length; i++ ) 120 { 121 122 str = matchers[i].replaceAll( str ); 123 } 124 125 return str; 126 } 127 128 129 /** 130 * @see java.lang.Object#toString() 131 */ 132 public String toString() 133 { 134 StringBuffer buf = new StringBuffer(); 135 buf.append( "RegexNormalizer( " ); 136 137 for ( int i = 0; i < regexes.length; i++ ) 138 { 139 buf.append( regexes[i] ); 140 141 if ( i < regexes.length - 1 ) 142 { 143 buf.append( ", " ); 144 } 145 } 146 147 buf.append( " )" ); 148 return buf.toString(); 149 } 150 }