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
55 public void init() throws PortletException {
56 viewJSP = getInitParameter("view-jsp");
57 editJSP = getInitParameter("edit-jsp");
58
59 }
60
61 public void doView(RenderRequest req, RenderResponse res) throws IOException, PortletException {
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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");
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;
151 }
152
153
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
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
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
199 if (level >= maxTreeLevel) {
200 return;
201 } else {
202 level++;
203 }
204
205
206
207 levelBuf.append("-" + level + ",");
208
209
210 boolean levelSelected= false;
211 int selectedIndex= -1;
212 int charPos= treePosition.indexOf("-" + level);
213 if( charPos > -1) {
214 levelSelected= true;
215 String indexString= treePosition.substring(charPos+3);
216
217 int minusPos= indexString.indexOf('-');
218 if( minusPos > -1 ) {
219 indexString= indexString.substring(0, minusPos);
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);
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
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
248 + "', expanded: " + expanded
249 + ", children: [ ");
250
251 createTreeViewChildren(folderBean, treeBuf, posBuf, maxTreeLevel, level, res, treePosition) ;
252 treeBuf.append( "] },");
253 }
254
255 int len= treeBuf.length();
256 treeBuf.setLength(len-1);
257
258
259 }
260
261 }
262
263
264 }