Package org.ocpsoft.rewrite.annotation.handler

Source Code of org.ocpsoft.rewrite.annotation.handler.ParameterHandler

/*
* Copyright 2011 <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*
* Licensed 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.
*/
package org.ocpsoft.rewrite.annotation.handler;

import java.lang.reflect.Field;

import org.ocpsoft.common.util.Assert;
import org.ocpsoft.logging.Logger;
import org.ocpsoft.rewrite.annotation.api.FieldContext;
import org.ocpsoft.rewrite.annotation.api.HandlerChain;
import org.ocpsoft.rewrite.annotation.spi.FieldAnnotationHandler;
import org.ocpsoft.rewrite.bind.Binding;
import org.ocpsoft.rewrite.config.Condition;
import org.ocpsoft.rewrite.config.ConditionBuilder;
import org.ocpsoft.rewrite.config.Or;
import org.ocpsoft.rewrite.config.True;
import org.ocpsoft.rewrite.el.El;
import org.ocpsoft.rewrite.param.ConfigurableParameter;
import org.ocpsoft.rewrite.param.Parameter;
import org.ocpsoft.rewrite.param.ParameterBuilder;
import org.ocpsoft.rewrite.servlet.config.RequestParameter;

public class ParameterHandler extends FieldAnnotationHandler<org.ocpsoft.rewrite.annotation.Parameter>
{

   private final Logger log = Logger.getLogger(ParameterHandler.class);

   @Override
   public Class<org.ocpsoft.rewrite.annotation.Parameter> handles()
   {
      return org.ocpsoft.rewrite.annotation.Parameter.class;
   }

   @Override
   public int priority()
   {
      return HandlerWeights.WEIGHT_TYPE_STRUCTURAL;
   }

   @Override
   public void process(FieldContext context, org.ocpsoft.rewrite.annotation.Parameter annotation, HandlerChain chain)
   {

      // default name is the name of the field
      Field field = context.getJavaField();
      String param = field.getName();

      // but the name specified in the annotation is preferred
      if (!annotation.value().isEmpty()) {
         param = annotation.value().trim();
      }

      if (log.isTraceEnabled()) {
         log.trace("Binding parameter [{}] to field [{}]", param, field);
      }

      /*
      * Add the query parameter condition to the condition tree that will capture a
      * corresponding query parameter. We must make sure that
      * the condition is evaluated even if the existing part of the tree evaluates to true.
      */
      Condition requestParameter = RequestParameter.matches(param, "{" + param + "}");
      ConditionBuilder composite = context.getRuleBuilder().getConditionBuilder().and(
               Or.any(requestParameter, new True()));
      context.getRuleBuilder().when(composite);

      // builder for this parameter
      ConfigurableParameter<?> parameterBuilder = context.getRuleBuilder().where(param);

      // subsequent handlers need the binding to configure deferred behavior
      El binding = El.property(context.getJavaClass(), field.getName());
      context.put(Binding.class, binding);

      // subsequent handlers need the builder to configure the parameter
      context.put(ParameterBuilder.class, parameterBuilder);

      // create the binding and publish it in the context
      context.put(Parameter.class, parameterBuilder);

      // run subsequent handler to enrich the parameter and wrap the binding
      chain.proceed();

      // add the enriched binding to the parameter
      Binding enrichedBinding = (Binding) context.get(Binding.class);
      Assert.notNull(enrichedBinding, "Binding was removed from the context");
      parameterBuilder.bindsTo(enrichedBinding);
   }

}
TOP

Related Classes of org.ocpsoft.rewrite.annotation.handler.ParameterHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.