View Javadoc

1   /*
2    * $Id: InterceptorAdapter.java 471756 2006-11-06 15:01:43Z husted $
3    *
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  // Copyright 2006 Google Inc. All Rights Reserved.
22  
23  package org.apache.struts2.impl;
24  
25  import static org.apache.struts2.impl.RequestContextImpl.ILLEGAL_PROCEED;
26  
27  import java.util.concurrent.Callable;
28  
29  import com.opensymphony.xwork2.ActionInvocation;
30  import com.opensymphony.xwork2.interceptor.Interceptor;
31  
32  public class InterceptorAdapter implements Interceptor {
33  
34      private static final long serialVersionUID = 8020658947818231684L;
35      final org.apache.struts2.spi.Interceptor delegate;
36  
37      public InterceptorAdapter(org.apache.struts2.spi.Interceptor delegate) {
38          this.delegate = delegate;
39      }
40  
41      public String intercept(final ActionInvocation invocation) throws Exception {
42          final RequestContextImpl requestContext = RequestContextImpl.get();
43  
44          // Save the existing proceed implementation so we can restore it later.
45          Callable<String> previous = requestContext.getProceed();
46  
47          requestContext.setProceed(new Callable<String>() {
48              public String call() throws Exception {
49                  // This proceed implementation is no longer valid past this point.
50                  requestContext.setProceed(ILLEGAL_PROCEED);
51                  try {
52                      return invocation.invoke();
53                  } finally {
54                      // We're valid again.
55                      requestContext.setProceed(this);
56                  }
57              }
58          });
59  
60          try {
61              return delegate.intercept(requestContext);
62          } finally {
63              requestContext.setProceed(previous);
64          }
65      }
66  
67      public void destroy() {}
68      public void init() {}
69  }