View Javadoc
1   /*
2    * Copyright (c) 2002-2017, Mairie de Paris
3    * All rights reserved.
4    *
5    * Redistribution and use in source and binary forms, with or without
6    * modification, are permitted provided that the following conditions
7    * are met:
8    *
9    *  1. Redistributions of source code must retain the above copyright notice
10   *     and the following disclaimer.
11   *
12   *  2. Redistributions in binary form must reproduce the above copyright notice
13   *     and the following disclaimer in the documentation and/or other materials
14   *     provided with the distribution.
15   *
16   *  3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
17   *     contributors may be used to endorse or promote products derived from
18   *     this software without specific prior written permission.
19   *
20   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
24   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30   * POSSIBILITY OF SUCH DAMAGE.
31   *
32   * License 1.0
33   */
34  package fr.paris.lutece.plugins.jsr286.pluto;
35  
36  import fr.paris.lutece.portal.service.util.AppPropertiesService;
37  
38  import java.util.ArrayList;
39  import java.util.Enumeration;
40  import java.util.Iterator;
41  import java.util.List;
42  
43  import javax.portlet.PortletMode;
44  import javax.portlet.WindowState;
45  
46  import javax.servlet.http.HttpServletRequest;
47  import javax.servlet.http.HttpServletResponse;
48  
49  import org.apache.pluto.container.PortletURLProvider;
50  import org.apache.pluto.container.PortletWindowID;
51  import org.apache.pluto.container.om.portlet.PortletDefinition;
52  import org.apache.pluto.driver.core.PortletWindowImpl;
53  import org.apache.pluto.driver.services.container.PortletURLProviderImpl;
54  import org.apache.pluto.driver.url.PortalURL;
55  import org.apache.pluto.driver.url.PortalURLParser;
56  import org.apache.pluto.driver.url.impl.PortalURLParserImpl;
57  import org.apache.pluto.driver.url.impl.RelativePortalURLImpl;
58  
59  
60  /**
61   * Buttons list to be displayed in portlet title
62   */
63  public class Buttons
64  {
65      private static final String PROPERTIES_MODE_PREFIX = "portlet.jsr286.mode.";
66      private static final String PROPERTIES_STATE_PREFIX = "portlet.jsr286.state.";
67      private static final String PROPERTIES_IMAGE_SUFFIX = ".image";
68      private final List _listModes;
69      private final List _listStates;
70  
71      /**
72       * Public default constructor
73       */
74      Buttons(  )
75      {
76          _listModes = new ArrayList(  );
77          _listStates = new ArrayList(  );
78      }
79  
80      /**
81       * Initialize list by inspecting current defined parameters
82       *
83       * @param request Current HTTP request
84       * @param response Current HTTP response (needed to encode URLs)
85       * @param portletDef Portlet definition (needed to access modes and states list)
86       * @param portletWindow Current portlet window
87       */
88      void init( HttpServletRequest request, HttpServletResponse response, PortletDefinition portletDef,
89          PortletWindowImpl portletWindow )
90      {
91          PortletWindowID portletID = portletWindow.getId(  );
92  
93          ArrayList listModes = new ArrayList(  );
94  
95          String strMimeType = "text/html";
96          
97          //ContentType contentTypeSet = portletDef.getContentTypeSet(  ).get( strMimeType );
98  
99          //define the url to add mode and window states
100         String contextPath = request.getContextPath();
101     	String servletName = request.getServletPath();
102     	PortalURL portalURL = PortalURLParserImpl.getParser().parse(request);
103     	Enumeration<String> paramNames = request.getParameterNames();
104         while(paramNames.hasMoreElements())
105         {        	  
106         	String paramName = paramNames.nextElement();        	
107     		portalURL.getPrivateRenderParameters().put(paramName, request.getParameterValues(paramName));	        	
108     	}
109     	PortletURLProviderImpl portletURLProvider = new PortletURLProviderImpl(portalURL, PortletURLProvider.TYPE.RENDER, portletWindow);
110     	String strHelpRenderURL = null;
111     	
112         //for ( Iterator itModes = contentTypeSet.getPortletModes(  ); itModes.hasNext(  ); )
113         for ( Iterator itModes = portletDef.getSupports(strMimeType).getPortletModes().iterator(); itModes.hasNext(  ); )
114         {
115             listModes.add( itModes.next(  ) );
116         }
117 
118         for ( Iterator itModesStr = listModes.iterator(  ); itModesStr.hasNext(  ); )
119         {
120         	
121             PortletMode mode = new PortletMode( (String)itModesStr.next(  ) );
122 
123             if ( !portletWindow.getPortletMode(  ).equals( mode ) )
124             {
125             	portletURLProvider.setPortletMode(mode);
126                 strHelpRenderURL = portletURLProvider.toURL();
127                 String strHelpImagePath = AppPropertiesService.getProperty( PROPERTIES_MODE_PREFIX + mode +
128                         PROPERTIES_IMAGE_SUFFIX );
129 
130                 _listModes.add( new Button( strHelpRenderURL, strHelpImagePath ) );
131             }
132         }
133         portletURLProvider = new PortletURLProviderImpl(portalURL, PortletURLProvider.TYPE.RENDER, portletWindow);
134         portletURLProvider.setPortletMode(portletWindow.getPortletMode());
135         if ( !WindowState.MINIMIZED.equals( portletWindow.getWindowState(  ) ) )
136         {
137         	portletURLProvider.setWindowState(WindowState.MINIMIZED);
138         	strHelpRenderURL = portletURLProvider.toURL();
139             String strHelpImagePath = AppPropertiesService.getProperty( PROPERTIES_STATE_PREFIX +
140                     WindowState.MINIMIZED + PROPERTIES_IMAGE_SUFFIX );
141 
142             _listStates.add( new Button( strHelpRenderURL, strHelpImagePath ) );
143         }
144 
145         // TODO il n'y a pas d'acces a la definition des etats (WindowState) en plus...
146         if ( !WindowState.NORMAL.equals( portletWindow.getWindowState(  ) ) )
147         {
148         	portletURLProvider.setWindowState(WindowState.NORMAL);
149         	strHelpRenderURL = portletURLProvider.toURL();
150             String strHelpImagePath = AppPropertiesService.getProperty( PROPERTIES_STATE_PREFIX + WindowState.NORMAL +
151                     PROPERTIES_IMAGE_SUFFIX );
152 
153             _listStates.add( new Button( strHelpRenderURL, strHelpImagePath ) );
154         }
155 
156         if ( !WindowState.MAXIMIZED.equals( portletWindow.getWindowState(  ) ) )
157         {
158         	portletURLProvider.setWindowState(WindowState.MAXIMIZED);
159         	strHelpRenderURL = portletURLProvider.toURL();
160             String strHelpImagePath = AppPropertiesService.getProperty( PROPERTIES_STATE_PREFIX +
161                     WindowState.MAXIMIZED + PROPERTIES_IMAGE_SUFFIX );
162 
163             _listStates.add( new Button( strHelpRenderURL, strHelpImagePath ) );
164         }
165     }
166 
167     /**
168      * Return an iterator for defined buttons for modes
169      *
170      * @return an iterator for defined buttons for modes
171      */
172     public Iterator modes(  )
173     {
174         return _listModes.iterator(  );
175     }
176 
177     /**
178      * Return an iterator for defined buttons for states
179      *
180      * @return an iterator for defined buttons for states
181      */
182     public Iterator states(  )
183     {
184         return _listStates.iterator(  );
185     }
186 }