119 lines
4.1 KiB
Java
119 lines
4.1 KiB
Java
/*
|
|
* 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
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* 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.
|
|
*
|
|
* $Header:$
|
|
*/
|
|
package org.apache.beehive.controls.runtime.bean;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Set;
|
|
import java.util.HashSet;
|
|
import java.io.BufferedReader;
|
|
import java.io.InputStream;
|
|
import java.io.InputStreamReader;
|
|
import java.io.IOException;
|
|
|
|
/**
|
|
* Class used to support prioritizing interceptors on methods of a {@link ControlBean}.
|
|
*/
|
|
public final class InterceptorUtils {
|
|
|
|
private InterceptorUtils() {}
|
|
|
|
/**
|
|
* Filename that contains ordering priority for controls interceptor services.
|
|
* Each line in the file is a fully qualified interface name. The first line in the file
|
|
* is highest priority.
|
|
*/
|
|
public static final String INTERCEPTOR_CONFIG_FILE = "controls-interceptors.config";
|
|
|
|
// todo: this interceptor priority list should be stored by ClassLoader instead of shared between them
|
|
/**
|
|
* List that keeps track of the interceptors in their priority order.
|
|
*/
|
|
private static ArrayList<String> _interceptorPriorities;
|
|
|
|
/**
|
|
* Applies externally defined (via {@link #INTERCEPTOR_CONFIG_FILE}) ordering priority for
|
|
* controls interceptor services.
|
|
*
|
|
* @param interceptors
|
|
* @return String[]
|
|
*/
|
|
public static String[] prioritizeInterceptors( String [] interceptors )
|
|
{
|
|
if ( interceptors == null )
|
|
return null;
|
|
|
|
// Read external configuration to obtain desired prioritization.
|
|
if ( _interceptorPriorities == null )
|
|
{
|
|
// Only attempt to read the external configuration once; bounce the VM if you
|
|
// want to try again.
|
|
_interceptorPriorities = new ArrayList<String>();
|
|
BufferedReader in = null;
|
|
try
|
|
{
|
|
InputStream configFileStream =
|
|
ControlBeanContext.class.getClassLoader().getResourceAsStream( INTERCEPTOR_CONFIG_FILE );
|
|
|
|
if ( configFileStream != null )
|
|
{
|
|
in = new BufferedReader(new InputStreamReader(configFileStream));
|
|
String str;
|
|
while ((str = in.readLine()) != null)
|
|
_interceptorPriorities.add(str);
|
|
}
|
|
}
|
|
catch (IOException e)
|
|
{
|
|
// ignore
|
|
}
|
|
finally
|
|
{
|
|
try {
|
|
if (in != null)
|
|
in.close();
|
|
}
|
|
catch ( IOException ie ) { /* ignore */ }
|
|
}
|
|
}
|
|
|
|
// Put input list of interceptors into a Set for easy lookup
|
|
Set<String> input = new HashSet<String>();
|
|
for ( String ii : interceptors )
|
|
input.add( ii );
|
|
|
|
// Scan through priorities list, building a prioritized list
|
|
ArrayList<String> prioritized = new ArrayList<String>(interceptors.length);
|
|
for ( String p : _interceptorPriorities )
|
|
{
|
|
if ( input.contains(p) )
|
|
{
|
|
input.remove(p);
|
|
prioritized.add(p);
|
|
}
|
|
}
|
|
|
|
// Anything still left in the input set did not have a priority associated with it,
|
|
// so they just go at the end in arbitrary order.
|
|
for ( String p : input )
|
|
prioritized.add(p);
|
|
|
|
return prioritized.toArray(new String[prioritized.size()]);
|
|
}
|
|
}
|