1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    * 
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.jetspeed.aggregator;
18  
19  import java.io.File;
20  import java.net.URL;
21  import java.net.URLClassLoader;
22  import java.security.PrivilegedAction;
23  import java.util.ArrayList;
24  import java.util.HashMap;
25  
26  import javax.security.auth.Subject;
27  import javax.servlet.ServletConfig;
28  import javax.servlet.ServletContext;
29  
30  import junit.framework.Test;
31  import junit.framework.TestCase;
32  import junit.framework.TestSuite;
33  
34  import org.apache.jetspeed.PortalReservedParameters;
35  import org.apache.jetspeed.capabilities.Capabilities;
36  import org.apache.jetspeed.components.portletregistry.PortletRegistry;
37  import org.apache.jetspeed.container.state.NavigationalStateComponent;
38  import org.apache.jetspeed.engine.Engine;
39  import org.apache.jetspeed.factory.PortletFactory;
40  import org.apache.jetspeed.mocks.ResourceLocatingServletContext;
41  import org.apache.jetspeed.om.common.portlet.PortletApplication;
42  import org.apache.jetspeed.om.page.ContentPageImpl;
43  import org.apache.jetspeed.om.page.Page;
44  import org.apache.jetspeed.page.PageManager;
45  import org.apache.jetspeed.profiler.ProfileLocator;
46  import org.apache.jetspeed.profiler.Profiler;
47  import org.apache.jetspeed.request.RequestContext;
48  import org.apache.jetspeed.request.RequestContextComponent;
49  import org.apache.jetspeed.security.JSSubject;
50  import org.apache.jetspeed.security.SecurityHelper;
51  import org.apache.jetspeed.testhelpers.SpringEngineHelper;
52  
53  import com.mockrunner.mock.web.MockHttpServletRequest;
54  import com.mockrunner.mock.web.MockHttpServletResponse;
55  import com.mockrunner.mock.web.MockHttpSession;
56  import com.mockrunner.mock.web.MockServletConfig;
57  
58  /***
59   * <P>Test the aggregation service</P>
60   *
61   * @author <a href="mailto:david@bluesunrise.com">David Sean Taylor</a>
62   * @version $Id: TestAggregator.java 517719 2007-03-13 15:05:48Z ate $
63   * 
64   */
65  public class TestAggregator extends TestCase
66  {
67      private SpringEngineHelper engineHelper;
68      private Engine engine;
69      private PortletAggregator portletAggregator;
70      private PageAggregator pageAggregator;
71      private PageAggregator asyncPageAggregator;
72      private Profiler profiler;
73      private Capabilities capabilities;
74      private NavigationalStateComponent navComponent;
75      private PortletFactory portletFactory;
76      private ServletConfig servletConfig;
77      private ServletContext servletContext;
78      private PortletRegistry portletRegistry;
79      private RequestContextComponent rcc;
80      private String testPage = "/default-page.psml";
81  
82      /***
83       * Start the tests.
84       *
85       * @param args the arguments. Not used
86       */
87      public static void main(String args[])
88      {
89          junit.awtui.TestRunner.main(new String[] { TestAggregator.class.getName()});
90      }
91  
92      protected void setUp() throws Exception
93      {
94          try
95          {
96              super.setUp();
97          }
98          catch (Exception e)
99          {
100             e.printStackTrace();
101             return;
102         }
103         
104         HashMap context = new HashMap();
105         engineHelper = new SpringEngineHelper(context);
106         engineHelper.setUp();
107         engine = (Engine) context.get(SpringEngineHelper.ENGINE_ATTR);
108 
109         pageAggregator = (PageAggregator) engine.getComponentManager().getComponent(PageAggregator.class);
110         asyncPageAggregator = 
111             (PageAggregator) engine.getComponentManager().getComponent("org.apache.jetspeed.aggregator.AsyncPageAggregator");
112         portletAggregator = (PortletAggregator) engine.getComponentManager().getComponent(PortletAggregator.class);
113         
114         profiler = (Profiler) engine.getComponentManager().getComponent(Profiler.class);
115         capabilities = (Capabilities) engine.getComponentManager().getComponent(Capabilities.class);
116         navComponent = 
117             (NavigationalStateComponent) engine.getComponentManager().getComponent(NavigationalStateComponent.class);
118 
119         servletConfig = engine.getServletConfig();
120         servletContext = servletConfig.getServletContext();
121 
122         portletRegistry = (PortletRegistry) engine.getComponentManager().getComponent("portletRegistry");
123         portletFactory = (PortletFactory) engine.getComponentManager().getComponent("portletFactory");
124         rcc = (RequestContextComponent) engine.getComponentManager().getComponent("org.apache.jetspeed.request.RequestContextComponent");
125 
126         File paRootDir = null;
127         paRootDir = new File("../../layout-portlets/target/jetspeed-layout-portlets");
128         initPA("jetspeed-layouts", "/jetspeed-layouts", paRootDir);
129 
130         paRootDir = new File("../../applications/demo/target/demo");
131         initPA("demo", "/demo", paRootDir);
132 
133         paRootDir = new File("../../applications/j2-admin/target/j2-admin");
134         initPA("j2-admin", "/j2-admin", paRootDir);
135  
136         // j2-admin portlet needs user manager component, but the followings does not effect..
137 //        userManager = (UserManager) engine.getComponentManager().getComponent(UserManager.class);
138 //        paContext.setAttribute(CommonPortletServices.CPS_USER_MANAGER_COMPONENT, userManager);
139 //        assertEquals(userManager, paContext.getAttribute(CommonPortletServices.CPS_USER_MANAGER_COMPONENT));
140     }
141 
142     public static Test suite()
143     {
144         // All methods starting with "test" will be executed in the test suite.
145         return new TestSuite(TestAggregator.class);
146     }
147 
148 //    public void testBasic() throws Exception
149 //    {
150 //        doAggregation(false);
151 //    }
152 
153     public void testParallelMode() throws Exception
154     {
155         doAggregation(true);
156     }
157 
158     protected void tearDown() throws Exception
159     {
160         engineHelper.tearDown();
161         super.tearDown();
162     }
163 
164     private void doAggregation(final boolean isParallelMode) throws Exception
165     {
166         assertNotNull("portlet aggregator is null", portletAggregator);
167         assertNotNull("page aggregator is null", pageAggregator);
168         assertNotNull("async page aggregator is null", asyncPageAggregator);
169         assertNotNull("profiler is null", profiler);
170         assertNotNull("capabilities is null", capabilities);
171         assertNotNull("navigational state component is null", navComponent);
172         assertNotNull("portal servlet config is null", servletConfig);
173         assertNotNull("portal servlet context is null", servletContext);
174         assertNotNull("portlet registry is null", portletRegistry);
175         assertNotNull("request context component is null", rcc);
176 
177         final RequestContext requestContext = initRequestContext();
178         final Subject subject = SecurityHelper.createSubject("user");
179         requestContext.getRequest().getSession().setAttribute(PortalReservedParameters.SESSION_KEY_SUBJECT, subject);
180         requestContext.setSubject(subject);
181         
182         ProfileLocator locator = profiler.createLocator(requestContext);
183         HashMap locators = new HashMap();
184         locators.put(ProfileLocator.PAGE_LOCATOR, locator);
185         requestContext.setProfileLocators(locators);
186 
187         requestContext.setCapabilityMap(capabilities.getCapabilityMap("Mozilla/5"));
188         requestContext.setPortalURL(navComponent.createURL(requestContext.getRequest(), requestContext.getCharacterEncoding()));
189 
190         Exception ex = (Exception) JSSubject.doAsPrivileged(subject, new PrivilegedAction()
191             {
192                 public Object run()
193                 {
194                     try {
195                         PageManager pageManager = 
196                             (PageManager) engine.getComponentManager().getComponent(PageManager.class);
197                         Page page = pageManager.getPage(testPage);
198                         assertNotNull(page);
199                         requestContext.setPage(new ContentPageImpl(page));
200 
201                         if (!isParallelMode) {
202                             pageAggregator.build(requestContext);
203                         } else {
204                             asyncPageAggregator.build(requestContext);
205                         }
206 
207                         MockHttpServletResponse rsp = (MockHttpServletResponse) requestContext.getResponse();
208                         System.out.println(">>>> " + rsp.getOutputStreamContent());
209                     } catch (Exception e) {
210                         return e;
211                     }
212                     return null;
213                 }
214             }, null);
215 
216         if (ex != null)
217             throw ex;
218     }
219 
220     private RequestContext initRequestContext()
221     {
222         MockHttpSession session = new MockHttpSession();
223         session.setupServletContext(servletContext);
224         assertEquals(servletContext, session.getServletContext());
225 
226         MockHttpServletRequest request = new MockHttpServletRequest();
227         MockHttpServletResponse response = new MockHttpServletResponse();
228 
229         request.setSession(session);
230 
231         //Principal p = new UserPrincipalImpl("user");
232         //request.setUserPrincipal(p);
233 
234         request.setScheme("http");
235         request.setContextPath("/jetspeed");
236         request.setServletPath("/portal" + testPage);
237         request.setMethod("GET");
238 
239 //        RequestContext rc = 
240 //            new JetspeedRequestContext(request, response, servletConfig, null);
241         RequestContext rc = rcc.create(request, response, servletConfig);
242         return rc;
243     }
244 
245     private ResourceLocatingServletContext initPA(String paName, String paContextPath, File paRootDir) 
246     {
247         ResourceLocatingServletContext paContext = new ResourceLocatingServletContext(paRootDir, true);   
248         MockServletConfig paConfig = new MockServletConfig();
249         paConfig.setServletContext(paContext);
250         ((ResourceLocatingServletContext) servletContext).setContext(paContextPath, paContext);
251 
252         try
253         {
254             ClassLoader paCl = createPAClassLoader(new File(paRootDir, "WEB-INF"));
255             PortletApplication pa = portletRegistry.getPortletApplication(paName);        
256             portletFactory.registerPortletApplication(pa, paCl);
257         }
258         catch (Exception e)
259         {
260             System.out.println("Failed to register portlet application, " + paName + ": " + e);
261         }        
262 
263         return paContext;
264     }
265 
266     protected ClassLoader createPAClassLoader(File webInfDir)
267     {
268         ClassLoader localPAClassLoader = null;
269 
270         ArrayList urls = new ArrayList();
271         File webInfClassesDir = null;
272 
273         try 
274         {
275             webInfClassesDir = new File(webInfDir, "classes");            
276             if (webInfClassesDir.isDirectory())
277             {
278                 urls.add(webInfClassesDir.toURL());
279             }
280             
281             File webInfLibDir = new File(webInfDir, "lib");
282             if (webInfLibDir.isDirectory())
283             {
284                 File [] jars = webInfLibDir.listFiles();           
285                 for (int i = 0; i < jars.length; i++)
286                 {
287                     File jar = jars[i];
288                     urls.add(jar.toURL());
289                 }
290             }
291             
292             localPAClassLoader = 
293                 new URLClassLoader((URL[]) urls.toArray(new URL[urls.size()]), getClass().getClassLoader());
294         } catch (Exception e) 
295         {
296             throw new RuntimeException("Failed to create classloader for PA.", e);
297         }
298 
299         return localPAClassLoader;
300     }
301 
302 }