View Javadoc

1   package de.iqser.portlets;
2   
3   import com.liferay.portal.kernel.exception.SystemException;
4   import com.liferay.portal.kernel.log.Log;
5   import com.liferay.portal.kernel.log.LogFactoryUtil;
6   import com.liferay.portal.kernel.util.WebKeys;
7   import com.liferay.portal.model.Layout;
8   import com.liferay.portal.model.LayoutTypePortlet;
9   import com.liferay.portal.model.Portlet;
10  import com.liferay.portal.theme.ThemeDisplay;
11  import com.liferay.portal.util.PortalUtil;
12  
13  import de.iqser.beans.BreadcrumbBean;
14  import de.iqser.beans.ContentBean;
15  import de.iqser.beans.FolderBean;
16  import de.iqser.beans.ItemBean;
17  import de.iqser.portlets.IqserBasePortlet;
18  import de.iqser.service.PortletIQserService;
19  
20  import java.io.IOException;
21  import java.io.PrintWriter;
22  import java.util.ArrayList;
23  import java.util.List;
24  import java.util.Set;
25  
26  import javax.portlet.ActionRequest;
27  import javax.portlet.ActionResponse;
28  import javax.portlet.PortletContext;
29  import javax.portlet.PortletException;
30  import javax.portlet.PortletPreferences;
31  import javax.portlet.PortletRequestDispatcher;
32  import javax.portlet.PortletURL;
33  import javax.portlet.RenderRequest;
34  import javax.portlet.RenderResponse;
35  import javax.portlet.ResourceRequest;
36  import javax.portlet.ResourceResponse;
37  import javax.servlet.http.HttpServletRequest;
38  import javax.servlet.http.HttpSession;
39  
40  public class TreePortlet extends IqserBasePortlet {
41  	
42  	public final static String PARAM_ACTION= "PARAM_ACTION";
43  	public final static String PARAM_TITLE= "PARAM_TITLE";
44  	public final static String PARAM_TREE_CHILDS= "PARAM_TREE_CHILDS";
45  	public final static String PARAM_TREE_POSITION= "PARAM_TREE_POSITION";
46  	public final static String PARAM_ROOTFOLDER= "PARAM_ROOTFOLDER";
47  	
48  	public final static String PREF_MAX_TREE_LEVEL= "maxTreeLevel";
49  	public final static String PREF_SCROLLBAR_HEIGHT= "treeHeight";
50  	public final static String PREF_SCROLLBAR_WIDTH= "treeWidth";
51  	
52  	private static Log _ilog = LogFactoryUtil.getLog(TreePortlet.class);
53  	
54  	// Portlet init-Params
55  	public void init() throws PortletException {
56  		viewJSP = getInitParameter("view-jsp");
57  		editJSP = getInitParameter("edit-jsp");
58  		// helpJSP = getInitParameter("help-jsp");
59  	}
60  	
61  	public void doView(RenderRequest req, RenderResponse res) throws IOException, PortletException {
62  /*		
63  		ThemeDisplay themeDisplay = (ThemeDisplay) req
64  		.getAttribute(WebKeys.THEME_DISPLAY);
65  
66  Layout myLayout= themeDisplay.getLayout();
67  
68  LayoutTypePortlet layoutTypePortlet = (LayoutTypePortlet)myLayout.getLayoutType();
69  List<Portlet> portlets= null;
70  try {
71  	portlets = layoutTypePortlet.getPortlets();
72  } catch (SystemException e) {
73  
74  	e.printStackTrace();
75  }
76  if(portlets != null && portlets.size() > 0 ) {
77  	for( int index= 0; index < portlets.size(); index++) {
78  		Portlet portlet= portlets.get(index);
79  		boolean isCacheable= portlet.isLayoutCacheable();
80  		int weight= portlet.getRenderWeight();
81  		String path= portlet.getVirtualPath();
82  		String name= portlet.getClass().getName();
83  		System.out.println("************* TreeView: portlet :" + name);
84  		System.out.println("************* TreeView: path :" + path);
85  		System.out.println("************* TreeView: isCacheable :" + isCacheable);
86  		System.out.println("************* TreeView: weight :" + weight);
87  	}
88  }
89  	*/	
90  		res.setContentType("text/html");
91  		
92  		String title= getTitle();
93  	
94  		PortletPreferences prefs= req.getPreferences();
95  		String iqserWebserviceUrl= prefs.getValue(PREF_IQSER_WEBSERVICE, "");
96  		String maxTreeLevelStr= prefs.getValue(PREF_MAX_TREE_LEVEL, "4");	// default is 4
97  		int maxTreeLevel= 4;
98  		try {
99  			maxTreeLevel= (new Integer(maxTreeLevelStr)).intValue();
100 		}
101 		catch( NumberFormatException ex) {
102 			_ilog.error("Illegal entry for preference " + PREF_MAX_TREE_LEVEL + " (" + maxTreeLevelStr + ")");
103 		}
104 		if( _ilog.isInfoEnabled()) {
105 			_ilog.info("Using a maxTreeLevel of : " + maxTreeLevel);
106 		}
107 		
108 		FolderBean rootFolder= PortletIQserService.getIQSERToplevelCategories(iqserWebserviceUrl, maxTreeLevel);
109 		if( rootFolder == null) {
110 			String errorMessage= "No connection to iQser Server!";
111 			req.setAttribute(PARAM_ERROR_MESSAGE, errorMessage);
112 			rootFolder= new FolderBean();
113 		}
114 		
115 		StringBuffer treeBuf = new StringBuffer();
116 		StringBuffer posBuf = new StringBuffer();
117 		HttpServletRequest servletRequest= PortalUtil.getHttpServletRequest( req);
118 		HttpSession servletSession= servletRequest.getSession();
119 		String treePosition= (String) servletSession.getAttribute(DEIQSER_TREE_POSITION);
120 		if( treePosition == null) {
121 			treePosition= "";
122 		}
123 		createTreeViewChildren(rootFolder, treeBuf, posBuf, maxTreeLevel, 0, res, treePosition);
124 
125 		req.setAttribute(PARAM_TREE_CHILDS, treeBuf.toString());
126 		
127 		req.setAttribute(PARAM_TITLE, title);
128 		req.setAttribute(PARAM_ROOTFOLDER, rootFolder);
129 
130 		PortletContext portletContext = getPortletContext();
131 
132 		PortletRequestDispatcher reqDispatcher = null;
133 		
134 		reqDispatcher = portletContext.getRequestDispatcher(viewJSP);
135 		reqDispatcher.include(req, res);
136 
137 	}
138 
139 	private String getTitle() {
140 		return "Categories";
141 	}
142 	
143 	public void processAction(ActionRequest actionRequest, ActionResponse actionResponse)
144 		throws IOException, PortletException {
145 		
146 		super.processAction(actionRequest, actionResponse);
147 		
148 		String action= actionRequest.getParameter(PARAM_ACTION);
149 		if( action == null || !action.equals(ACTION_SEARCH) )  {
150 			return;	// probably a preferences action handled by base portlet
151 		}
152 		
153 		// remove old cached data, if any to force a reload in the display portlet
154 		HttpServletRequest servletRequest= PortalUtil.getHttpServletRequest( actionRequest);
155 		HttpSession servletSession= servletRequest.getSession();
156 		List<ContentBean> contentList= (List<ContentBean>) servletSession.getAttribute(DEIQSER_CACHED_DATA);
157 		if( contentList != null) {
158 			servletSession.removeAttribute(DEIQSER_CACHED_DATA);
159 		}
160 		List<BreadcrumbBean> relatedList= (List<BreadcrumbBean>) servletSession.getAttribute(DEIQSER_RELATED_LIST);
161 		if( relatedList != null) {
162 			servletSession.removeAttribute(DEIQSER_RELATED_LIST);
163 		}
164 		Set<String> selectedTypes= (Set<String>) servletSession.getAttribute(DisplayPortlet.DEIQSER_SELECTED_TYPES);
165 		if( selectedTypes != null) {
166 			servletSession.removeAttribute(DEIQSER_SELECTED_TYPES);
167 		}
168 		
169 		String searchInput= actionRequest.getParameter(PARAM_SEARCH_INPUT);
170 		if( searchInput != null) {
171 			searchInput= searchInput.trim();
172 			actionResponse.setRenderParameter(PUBLIC_RENDER_PARAM_SEARCH_INPUT, searchInput);
173 			// create a new list for breadcrumb
174 			BreadcrumbBean bcBean= new BreadcrumbBean();
175 			bcBean.setId(searchInput);
176 			bcBean.setDisplayName(searchInput);
177 			relatedList= new ArrayList<BreadcrumbBean>();
178 			relatedList.add(bcBean);
179 			servletSession.setAttribute(DEIQSER_RELATED_LIST, relatedList);
180 		
181 		}
182 		String treePosition= actionRequest.getParameter(PARAM_TREE_POSITION);
183 		// marks the position of the selected node
184 		servletSession.setAttribute(DEIQSER_TREE_POSITION, treePosition);
185 		
186 	}
187 
188 	private void createTreeViewChildren(FolderBean folder, StringBuffer treeBuf,
189 			StringBuffer levelBuf, int maxTreeLevel, int level, RenderResponse res, String treePosition) {
190 		String tab = "\t";
191 		for (int i = 0; i <= level; i++) {
192 			tab = tab + "\t";
193 		}
194 
195 		List<FolderBean> folderList= folder.getFolderList();
196 		if( folderList != null && folderList.size() > 0) {
197 			int numFolders= folderList.size();
198 			// check if max display level reached
199 			if (level >= maxTreeLevel) {
200 				return;
201 			} else {
202 				level++;
203 			}
204 		
205 			// posBuf is something like -1,5-2,10-3,5
206 			// where the number before the comma is the level, the number after is the index position
207 			levelBuf.append("-" + level + ",");
208 			
209 			// treePosition is the posBuf of the selected tree node, if any
210 			boolean levelSelected= false;
211 			int selectedIndex= -1;
212 			int charPos= treePosition.indexOf("-" + level);		// do not use '-' here!
213 			if( charPos > -1) {
214 				levelSelected= true;	// a node of this level was selected, get its index
215 				String indexString= treePosition.substring(charPos+3);
216 				// check if this is the last leaf of the tree or something in between
217 				int minusPos= indexString.indexOf('-');
218 				if( minusPos > -1 ) {
219 					indexString= indexString.substring(0, minusPos);	// something in between
220 				}
221 				try {
222 					selectedIndex= (new Integer(indexString)).intValue();
223 				} catch (NumberFormatException e) {
224 					_ilog.error("NumberFormatException in createTreeViewChildren");
225 				}
226 			}
227 			
228 			for( int index= 0; index < numFolders; index++) {
229 				StringBuffer posBuf= new StringBuffer(levelBuf);
230 				posBuf.append(index);	// we cannot use posBuf here, because we need the index
231 				
232 				FolderBean folderBean = folderList.get(index);
233 				String folderName= folderBean.getFolderName();
234 				PortletURL searchURL = res.createActionURL();
235 				searchURL.setParameter(PARAM_ACTION, ACTION_SEARCH);
236 				searchURL.setParameter(PARAM_SEARCH_INPUT, folderName);
237 				searchURL.setParameter(PARAM_TREE_POSITION, posBuf.toString());
238 				
239 				// check if the node should be expanded
240 				boolean expanded= false;
241 				if( levelSelected && selectedIndex == index) {
242 					expanded= true;
243 				}
244 				treeBuf.append(
245 						"{ label: '"
246 					    + "<a href=\"" + searchURL + "\">" + folderName + "</a>"
247 					    // + folderName
248 						+ "', expanded: " + expanded		// expanded is a boolean, no ' around value
249 						+ ", children: [ ");
250 				
251 				createTreeViewChildren(folderBean, treeBuf, posBuf, maxTreeLevel, level, res, treePosition) ;
252 				treeBuf.append( "] },");
253 			} // END for
254 			// remove last ,
255 			int len= treeBuf.length();
256 			treeBuf.setLength(len-1);
257 			
258 			//out.append( "] }\n");
259 		} //END if
260 	
261 	}
262 
263 
264 }