]> source.dussan.org Git - archiva.git/blob
bcb572083a8e3418b154d9c50de71786d20debab
[archiva.git] /
1 package org.apache.archiva.redback.struts2.result;
2
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
22 import java.util.Map;
23 import java.util.Set;
24
25 import org.apache.archiva.redback.struts2.interceptor.SavedActionInvocation;
26 import org.apache.struts2.dispatcher.ServletActionRedirectResult;
27 import org.apache.archiva.redback.struts2.interceptor.ActionInvocationTracker;
28 import com.opensymphony.xwork2.ActionInvocation;
29
30 @SuppressWarnings("serial")
31 public class AbstractBackTrackingResult
32     extends ServletActionRedirectResult
33 {
34     public static final int PREVIOUS = 1;
35
36     public static final int CURRENT = 2;
37     
38     protected boolean setupBackTrackPrevious( ActionInvocation invocation )
39     {
40         return setupBackTrack( invocation, PREVIOUS );
41     }
42
43     protected boolean setupBackTrackCurrent( ActionInvocation invocation )
44     {
45         return setupBackTrack( invocation, CURRENT );
46     }
47
48     @SuppressWarnings("unchecked")
49     protected boolean setupBackTrack( ActionInvocation invocation, int order )
50     {
51         Map session = invocation.getInvocationContext().getSession();
52         ActionInvocationTracker tracker = (ActionInvocationTracker) session.get( ActionInvocationTracker.SESSION_KEY );
53
54         if ( tracker != null && tracker.isBackTracked() )
55         {
56             SavedActionInvocation savedInvocation;
57
58             if ( order == PREVIOUS )
59             {
60                 savedInvocation = tracker.getPrevious();
61             }
62             else
63             {
64                 savedInvocation = tracker.getCurrent();
65             }
66
67             if ( savedInvocation != null )
68             {
69                 setNamespace( savedInvocation.getNamespace() );
70                 setActionName( savedInvocation.getActionName() );
71                 setMethod( savedInvocation.getMethodName() );
72                                 
73                 invocation.getInvocationContext().getParameters().clear();
74                 invocation.getInvocationContext().getParameters().putAll( savedInvocation.getParametersMap() );
75                 
76                 // hack for REDBACK-188
77                 String resultCode = invocation.getResultCode();
78
79                 if( resultCode != null )
80                 {
81                     // hack for REDBACK-262
82                     // set this to null so the ResultConfig parameters won't be added in the ServletActionRedirectResult
83                     // because we can't clear the parameters of ResultConfig since it's read-only
84                     invocation.setResultCode( null );
85                     
86                     Set<String> keys = savedInvocation.getParametersMap().keySet();
87                     
88                     for( String key : keys )
89                     {   
90                         if ( !getProhibitedResultParams().contains( key ) )
91                         {
92                             String value = ( (String[]) savedInvocation.getParametersMap().get( key ) )[0];
93                             if ( value != null && value.length() > 0 )
94                             {
95                                 addParameter( key, conditionalParse( value, invocation ) );
96                             }
97                         }
98                     }
99                 }
100
101                 tracker.unsetBackTrack();
102             }
103
104             return true;
105         }
106
107         return false;
108     }
109 }