Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
   * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
   * The contents of this file are subject to the terms of either the GNU
   * General Public License Version 2 only ("GPL") or the Common Development
   * and Distribution License("CDDL") (collectively, the "License").  You
   * may not use this file except in compliance with the License. You can obtain
  * a copy of the License at
  * or glassfish/bootstrap/legal/LICENSE.txt.  See the License for the specific
  * language governing permissions and limitations under the License.
  * When distributing the software, include this License Header Notice in each
  * file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
  * Sun designates this particular file as subject to the "Classpath" exception
  * as provided by Sun in the GPL Version 2 section of the License file that
  * accompanied this code.  If applicable, add the following below the License
  * Header, with the fields enclosed by brackets [] replaced by your own
  * identifying information: "Portions Copyrighted [year]
  * [name of copyright owner]"
  * Contributor(s):
  * If you wish your version of this file to be governed by only the CDDL or
  * only the GPL Version 2, indicate your decision by adding "[Contributor]
  * elects to include this software in this distribution under the [CDDL or GPL
  * Version 2] license."  If you don't indicate a single choice of license, a
  * recipient has the option to distribute your version of this file under
  * either the CDDL, the GPL Version 2 or to extend the choice of license to
  * its licensees as provided above.  However, if you add GPL Version 2 code
  * and therefore, elected the GPL Version 2 license, then the option applies
  * only if the new code is made subject to such option by the copyright
  * holder.
 package com.sun.enterprise.web.ara.rules;
Based on the application context-root, configure the ReadTask Pipeline. Based on the thread-ratio defined in domain.xml, an application can have privileged Pipeline, configured to use specific percentage of the maximum number of threads. This Rule instanciate two types of Pipeline privilegedPipeline is will be used to execute privileged applications. victimsPipeline is will be used to execute others application that aren't included within the privileged tokens. An application is marked privileged if the set of Rule applied to the application requests is matched.

Jeanfrancois Arcand
 public class ThreadRatioRule implements Rule<ReadTask> {
     protected final static String RESERVE = "reserve";
     protected final static String CEILING = "ceiling";
     protected final static String ALLOCATION_MODE = 
     protected final static String RULE_TOKENS = 
     protected final static String QUERY_STRING="?";   
     protected final static String PATH_STRING="/";
The ReadTask attached to this Rule
     protected ReadTask readTask;
The Pipeline configured based on the threadRatio. This Pipeline is only used by privileged application.
     protected final static ConcurrentHashMap<String,Pipelinepipelines 
             = new ConcurrentHashMap<String,Pipeline>();
The list of privileged token used to decide if a request can be serviced by the privileged Pipeline.
    protected final static ConcurrentHashMap<String,Double
            privilegedTokens = new ConcurrentHashMap<String,Double>();
The thread ratio used when an application isn't listed as a privileged application.
    protected static double leftRatio = 1;
The allocation mode used: celling or Reserve. With Ceiling policy, the strategy is to wait until all apps queus are showing some slack. With Reserve policiy, if 100% reservation is made by other apps, cancel the request processing.
    protected static String allocationPolicy = ;
    static {
            if ( System.getProperty() != null){
                StringTokenizer privList = 
                        new StringTokenizer(System.getProperty(),",");
                StringTokenizer privElement;
                String tokens;
                double countRatio = 0;
                double tokenValue;
                while (privList.hasMoreElements()){
                    privElement = new StringTokenizer(privList.nextToken()); 
                    while (privElement.hasMoreElements()){
                        tokens = privElement.nextToken();
                        int index = tokens.indexOf("|");
                        tokenValue = Double.valueOf(tokens.substring(index+1));
                                (tokens.substring(0, index),tokenValue);
                        countRatio += tokenValue;
                if ( countRatio > 1 ) {
                     "Thread ratio too high. The total must be lower or equal to 1");
                }  else {
                     = 1 - countRatio;
        } catch (Exception ex){
                .log(.,"Unable to parse thread ratio"ex);
        if ( System.getProperty() != null){
             = System.getProperty();   
            if ( !.equals() && 
                    !.equals() ){
                    .log(.,"Invalid allocation policy");
                 = ;
Creates a new ThreadRationRule.
    public ThreadRatioRule() {

Attach a ReadTask to this rule.
    public void attach(ReadTask o) {
        this. = o;

Return the current attachement.
    public ReadTask attachement(){
        return ;

Invoke the rule. Based on the result of the ContextRootAlgorithm, configure the ReadTask Pipeline.
    public Integer call() throws Exception{
        boolean noCache = false;
        if (  == 0 ) {
            if ( .equals() )
                return .;
            else if ( .equals() ) {
                // If true, then we need to wait for free space. If false, then
                // we can go ahead and let the task execute with its default
                // pipeline
                if ( isPipelineInUse() )
                    return .;   
                    noCache = true;
        String token = getContextRoot();
        // Lazy instanciation
        Pipeline pipeline = .get(token);
        if (pipeline == null){
            pipeline = applyRule(token);
        if (!noCache)
            return .;
            return .;
    // ------------------------------------------------ Pipeline ------------//

Get the context-root from the ByteBuffer
    protected String getContextRoot(){
        // (1) Get the token the Algorithm has processed for us.
        ByteBuffer byteBuffer = .getByteBuffer();
        byte[] chars = new byte[byteBuffer.limit() - byteBuffer.position()];
        String token = new String(chars);
        int index = token.indexOf();
        if (index != -1){
            token = token.substring(0,index);
        // Remove query string.
        index = token.indexOf();
        if ( index != -1){
            token = token.substring(0,index);
        boolean slash = token.endsWith();
        if ( slash ){
            token = token.substring(0,token.length() -1);
        return token;
Apply the thread ratio.
    protected Pipeline applyRule(String token){  
        Pipeline p = .getPipeline();
        int maxThreads = p.getMaxThreads();
        Double threadRatio = .get(token);
        boolean defaultPipeline = false;
        Pipeline pipeline = null;
        if (threadRatio == null) {
            // Try to lookup the default Pipeline
            pipeline = .get("*");
            if (pipeline != null){
                return pipeline;
            threadRatio = ( == 0? 0.5:);
            defaultPipeline = true;
        int privilegedCount  = (threadRatio==1 ? maxThreads : 
            (int) (maxThreads * threadRatio) + 1);
        pipeline = newPipeline(privilegedCount,p);
        if (defaultPipeline){
        return pipeline;
Creates a new Pipeline
    protected Pipeline newPipeline(int threadCount,Pipeline p){
        // Run the Task on the SelectorThread
        if ( threadCount == 0){
            return null;
        Pipeline pipeline = new LinkedListPipeline();
        pipeline.setName("httpWorkerThread-" + .getSelectorThread().getPort());
        return pipeline;

Check to see if the privileged pipeline are in-use right now.
    protected boolean isPipelineInUse(){
        Collection<Pipelinecollection = .values();
        for (Pipeline pipelinecollection){
            if (pipeline.size() > 0) {
                return true;
        return false;
    // ---------------------------------------------------------------------//
Cancel execution of this rule.
    public void cancel() {
         = null;

Return the time in second before this rule will be executed.
    public int getExecutionTime() {
        return -1; // now
Set the interval in seconds to wait before executing this rule.
    public void setExecutionTime(int time) {
Set the Future associated with this execution of this rule.
    public void setFuture(java.util.concurrent.Future future) {
New to GrepCode? Check out our FAQ X