/**
* 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.filter.rewrite.impl.html;
import org.apache.hadoop.gateway.filter.rewrite.api.FrontendFunctionDescriptor;
import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteEnvironment;
import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteFunctionDescriptor;
import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteFunctionDescriptorFactory;
import org.apache.hadoop.gateway.filter.rewrite.impl.UrlRewriteFunctionProcessorFactory;
import org.apache.hadoop.gateway.filter.rewrite.spi.UrlRewriteContext;
import org.apache.hadoop.gateway.filter.rewrite.spi.UrlRewriteFunctionProcessor;
import java.util.Arrays;
import java.util.List;
/**
* This function enhances the 'frontend' function with the ability to add a prefix to the rewritten frontend portion
* along with the '@import' literal. This is a workaround for the requirement to provide the ability to rewrite
* a portion of html content that contains a tag like the following
*
* <head> <style type=\"text/css\">@import "pretty.css";</style></head>
*
* and needs to be rewritten to something like
*
* <head> <style type=\"text/css\">@import "http://localhost:8443/sandbox/service/pretty.css";</style></head>
*
* The rewrite rule could then contain the $import function that would delegate to the frontend function.
*
* If there are more than one params passed, the first one is used as a prefix to the value of the frontend function.
*
*/
public class HtmlImportFunctionProcessor implements UrlRewriteFunctionProcessor<HtmlImportFunctionDescriptor> {
private static final String IMPORT_LITERAL = "@import";
private UrlRewriteFunctionProcessor frontend;
@Override
public void initialize(UrlRewriteEnvironment environment, HtmlImportFunctionDescriptor descriptor) throws Exception {
UrlRewriteFunctionDescriptor frontendDescriptor = UrlRewriteFunctionDescriptorFactory.create(FrontendFunctionDescriptor.FUNCTION_NAME);
frontend = UrlRewriteFunctionProcessorFactory.create(FrontendFunctionDescriptor.FUNCTION_NAME, frontendDescriptor);
frontend.initialize(environment, frontendDescriptor);
}
@Override
public void destroy() throws Exception {
frontend.destroy();
}
@Override
public List<String> resolve(UrlRewriteContext context, List<String> parameters) throws Exception {
String prefix = "";
if ( parameters != null && parameters.size() > 1 ) {
prefix = parameters.get(0);
parameters = parameters.subList(1, parameters.size());
}
List<String> frontendValues = frontend.resolve(context, parameters);
StringBuffer buffer = new StringBuffer(IMPORT_LITERAL);
buffer.append(" ");
buffer.append(prefix);
if ( frontendValues != null && frontendValues.size() > 0 ) {
for ( String value : frontendValues ) {
buffer.append(value);
}
}
return Arrays.asList(buffer.toString());
}
@Override
public String name() {
return HtmlImportFunctionDescriptor.FUNCTION_NAME;
}
}