/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.gateway.identityasserter.regex.filter;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTemplate {
private static Pattern directPattern = Pattern.compile( "\\{(\\[?\\d+?\\]?)\\}" );
private static Pattern indirectPattern = Pattern.compile( "\\[(\\d+?)\\]" );
Pattern inputPattern;
String outputTemplate;
Map<String,String> lookupTable;
public RegexTemplate( String regex, String template ) {
this( regex, template, null );
}
public RegexTemplate( String regex, String template, Map<String,String> map ) {
this.inputPattern = Pattern.compile( regex );
this.outputTemplate = template;
this.lookupTable = map;
}
public String apply( String input ) {
String output = outputTemplate;
Matcher inputMatcher = inputPattern.matcher( input );
if( inputMatcher.find() ) {
output = expandTemplate( inputMatcher, output );
}
return output;
}
private String expandTemplate( Matcher inputMatcher, String output ) {
Matcher directMatcher = directPattern.matcher( output );
while( directMatcher.find() ) {
String lookupValue = null;
String lookupStr = directMatcher.group( 1 );
Matcher indirectMatcher = indirectPattern.matcher( lookupStr );
if( indirectMatcher.find() ) {
lookupStr = indirectMatcher.group( 1 );
int lookupIndex = Integer.parseInt( lookupStr );
if( lookupTable != null ) {
String lookupKey = inputMatcher.group( lookupIndex );
lookupValue = lookupTable.get( lookupKey );
}
} else {
int lookupIndex = Integer.parseInt( lookupStr );
lookupValue = inputMatcher.group( lookupIndex );
}
output = directMatcher.replaceFirst( lookupValue == null ? "" : lookupValue );
directMatcher = directPattern.matcher( output );
}
return output;
}
}