1   /**
2    * Copyright (c) 2000-2004 Liferay, LLC. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portlet;
24  
25  import com.liferay.portal.PortalException;
26  import com.liferay.portal.SystemException;
27  import com.liferay.portal.ejb.PortletManagerUtil;
28  import com.liferay.portal.language.LanguageUtil;
29  import com.liferay.portal.model.Layout;
30  import com.liferay.portal.model.Portlet;
31  import com.liferay.portal.model.User;
32  import com.liferay.portal.util.Constants;
33  import com.liferay.portal.util.PortalUtil;
34  import com.liferay.portal.util.WebKeys;
35  import com.liferay.util.GetterUtil;
36  import com.liferay.util.Http;
37  import com.liferay.util.ParamUtil;
38  import com.liferay.util.StringPool;
39  import com.liferay.util.StringUtil;
40  import com.liferay.util.servlet.SessionMessages;
41  
42  import java.io.IOException;
43  
44  import javax.portlet.ActionRequest;
45  import javax.portlet.ActionResponse;
46  import javax.portlet.GenericPortlet;
47  import javax.portlet.PortletException;
48  import javax.portlet.PortletMode;
49  import javax.portlet.PortletPreferences;
50  import javax.portlet.PortletSession;
51  import javax.portlet.RenderRequest;
52  import javax.portlet.RenderResponse;
53  import javax.portlet.WindowState;
54  
55  /**
56   * <a href="IFramePortlet.java.html"><b><i>View Source</i></b></a>
57   *
58   * @author  Brian Wing Shun Chan
59   * @version $Revision: 1.33 $
60   *
61   */
62  public class IFramePortlet extends GenericPortlet {
63  
64      public static final String DEFAULT_CELLPADDING = "4";
65      public static final String DEFAULT_CELLSPACING = "0";
66      public static final String DEFAULT_ALIGN = "left";
67      public static final String DEFAULT_BORDER = "0";
68      public static final String DEFAULT_BORDERCOLOR = "#000000";
69      public static final String DEFAULT_FRAMEBORDER = "0";
70      public static final String DEFAULT_HEIGHT_MAXIMIZED = "600";
71      public static final String DEFAULT_HEIGHT_NORMAL = "300";
72      public static final String DEFAULT_HSPACE = "0";
73      public static final String DEFAULT_SCROLLING = "auto";
74      public static final String DEFAULT_SRC = "http://www.liferay.com";
75      public static final String DEFAULT_VSPACE = "0";
76      public static final String DEFAULT_WIDTH = "100%";
77  
78      public void doEdit(RenderRequest req, RenderResponse res)
79          throws IOException, PortletException {
80  
81          try {
82              PortletPreferences prefs = req.getPreferences();
83  
84              User user = PortalUtil.getUser(req);
85  
86              boolean auth = GetterUtil.getBoolean(
87                  prefs.getValue("auth", StringPool.BLANK), false);
88              String authType = prefs.getValue("auth-type", StringPool.BLANK);
89              String formMethod = prefs.getValue("form-method", StringPool.BLANK);
90              String userName = prefs.getValue("user-name", StringPool.BLANK);
91              String password = prefs.getValue("password", StringPool.BLANK);
92              String hiddenVariables = prefs.getValue(
93                  "hidden-variables", StringPool.BLANK);
94  
95              String cellpadding = prefs.getValue(
96                  "cellpadding", DEFAULT_CELLPADDING);
97              String cellspacing = prefs.getValue(
98                  "cellspacing", DEFAULT_CELLSPACING);
99              String align = prefs.getValue("align", DEFAULT_ALIGN);
100             String border = prefs.getValue("border", DEFAULT_BORDER);
101             String bordercolor = prefs.getValue(
102                 "bordercolor", DEFAULT_BORDERCOLOR);
103             String frameborder = prefs.getValue(
104                 "frameborder", DEFAULT_FRAMEBORDER);
105             String heightMaximized = prefs.getValue(
106                 "height-maximized", DEFAULT_HEIGHT_MAXIMIZED);
107             String heightNormal = prefs.getValue(
108                 "height-normal", DEFAULT_HEIGHT_NORMAL);
109             String hspace = prefs.getValue("hspace", DEFAULT_HSPACE);
110             String scrolling = prefs.getValue("scrolling", DEFAULT_SCROLLING);
111             String src = prefs.getValue("src", DEFAULT_SRC);
112             String vspace = prefs.getValue("vspace", DEFAULT_VSPACE);
113             String width = prefs.getValue("width", DEFAULT_WIDTH);
114 
115             String htmlAttributes =
116                 "cellpadding=" + cellpadding + "\n" +
117                 "cellspacing=" + cellspacing + "\n" +
118                 "align=" + align + "\n" +
119                 "border=" + border + "\n" +
120                 "bordercolor=" + bordercolor + "\n" +
121                 "frameborder=" + frameborder + "\n" +
122                 "height-maximized=" + heightMaximized + "\n" +
123                 "height-normal=" + heightNormal + "\n" +
124                 "hspace=" + hspace + "\n" +
125                 "scrolling=" + scrolling + "\n" +
126                 "vspace=" + vspace + "\n" +
127                 "width=" + width + "\n";
128 
129             StringBuffer sb = new StringBuffer();
130 
131             sb.append("<table border=\"0\" cellpadding=\"4\" ");
132             sb.append("cellspacing=\"0\" width=\"100%\">");
133 
134             sb.append("<form action=\"" + res.createActionURL() + "\" ");
135             sb.append("method=\"post\" name=\"" + res.getNamespace() + "fm");
136             sb.append("\" onSubmit=\"submitForm(this); return false;\">");
137             sb.append("<input name=\"" + res.getNamespace() + Constants.CMD);
138             sb.append("\" type=\"hidden\" value=\"" + Constants.UPDATE + "\">");
139 
140             sb.append("<tr>");
141             sb.append("<td align=\"center\">");
142             sb.append("<table border=\"0\" cellpadding=\"0\" ");
143             sb.append("cellspacing=\"0\">");
144 
145             if (SessionMessages.contains(
146                     req, getPortletConfig().getPortletName() + ".doEdit")) {
147 
148                 sb.append("<tr>");
149                 sb.append("<td>");
150                 sb.append("<font class=\"gamma\" size=\"1\"><span ");
151                 sb.append("class=\"gamma-pos-alert\">");
152                 sb.append(
153                     LanguageUtil.get(
154                         user,
155                         "you-have-successfully-updated-your-preferences"));
156                 sb.append("</span></font>");
157                 sb.append("</td>");
158                 sb.append("</tr>");
159                 sb.append("<tr>");
160                 sb.append("<td>");
161                 sb.append("<br>");
162                 sb.append("</td>");
163                 sb.append("</tr>");
164             }
165 
166             sb.append("<tr>");
167             sb.append("<td>");
168             sb.append("<table border=\"0\" cellpadding=\"0\" ");
169             sb.append("cellspacing=\"0\">");
170 
171             sb.append("<tr>");
172             sb.append("<td>");
173             sb.append("<font class=\"gamma\" size=\"2\">");
174             sb.append(LanguageUtil.get(user, "source-url"));
175             sb.append("</font>");
176             sb.append("</td>");
177             sb.append("<td width=\"10\">");
178             sb.append("&nbsp;");
179             sb.append("</td>");
180             sb.append("<td>");
181             sb.append("<input class=\"form-text\" ");
182             sb.append("name=\"" + res.getNamespace() + "src\" size=\"40\" ");
183             sb.append("type=\"text\" value=\"");
184             sb.append(src + "\">");
185             sb.append("</td>");
186             sb.append("</tr>");
187 
188             sb.append("<tr>");
189             sb.append("<td colspan=\"3\">");
190             sb.append("<br>");
191             sb.append("</td>");
192             sb.append("</tr>");
193 
194             sb.append("<tr>");
195             sb.append("<td>");
196             sb.append("<font class=\"gamma\" size=\"2\">");
197             sb.append(LanguageUtil.get(user, "authenticate"));
198             sb.append("</font>");
199             sb.append("</td>");
200             sb.append("<td width=\"10\">");
201             sb.append("&nbsp;");
202             sb.append("</td>");
203             sb.append("<td>");
204             sb.append("<select name=\"" + res.getNamespace() + "auth\">");
205             sb.append("<option ");
206             sb.append(auth ? "selected" : "");
207             sb.append(" value=\"1\">");
208             sb.append(LanguageUtil.get(user, "true"));
209             sb.append("</option>");
210             sb.append("<option ");
211             sb.append(!auth ? "selected" : "");
212             sb.append(" value=\"0\">");
213             sb.append(LanguageUtil.get(user, "false"));
214             sb.append("</option>");
215             sb.append("</select>");
216             sb.append("</td>");
217             sb.append("</tr>");
218 
219             sb.append("<tr>");
220             sb.append("<td colspan=\"3\">");
221             sb.append("<br>");
222             sb.append("</td>");
223             sb.append("</tr>");
224 
225             sb.append("<tr>");
226             sb.append("<td>");
227             sb.append("<font class=\"gamma\" size=\"2\">");
228             sb.append(LanguageUtil.get(user, "authentication-type"));
229             sb.append("</font>");
230             sb.append("</td>");
231             sb.append("<td width=\"10\">");
232             sb.append("&nbsp;");
233             sb.append("</td>");
234             sb.append("<td>");
235             sb.append("<select name=\"" + res.getNamespace() + "auth_type\">");
236             sb.append("<option ");
237             sb.append(authType.equals("basic") ? "selected" : "");
238             sb.append(" value=\"basic\">");
239             sb.append(LanguageUtil.get(user, "basic"));
240             sb.append("</option>");
241             sb.append("<option ");
242             sb.append(authType.equals("form") ? "selected" : "");
243             sb.append(" value=\"form\">");
244             sb.append(LanguageUtil.get(user, "form"));
245             sb.append("</option>");
246             sb.append("</select>");
247             sb.append("</td>");
248             sb.append("</tr>");
249 
250             sb.append("<tr>");
251             sb.append("<td colspan=\"3\">");
252             sb.append("<br>");
253             sb.append("</td>");
254             sb.append("</tr>");
255 
256             sb.append("<tr>");
257             sb.append("<td>");
258             sb.append("<font class=\"gamma\" size=\"2\">");
259             sb.append(LanguageUtil.get(user, "form-method"));
260             sb.append("</font>");
261             sb.append("</td>");
262             sb.append("<td width=\"10\">");
263             sb.append("&nbsp;");
264             sb.append("</td>");
265             sb.append("<td>");
266             sb.append("<select name=\"" + res.getNamespace());
267             sb.append("form_method\">");
268             sb.append("<option ");
269             sb.append(formMethod.equals("get") ? "selected" : "");
270             sb.append(" value=\"get\">");
271             sb.append("Get");
272             sb.append("</option>");
273             sb.append("<option ");
274             sb.append(formMethod.equals("post") ? "selected" : "");
275             sb.append(" value=\"post\">");
276             sb.append("Post");
277             sb.append("</option>");
278             sb.append("</select>");
279             sb.append("</td>");
280             sb.append("</tr>");
281 
282             sb.append("<tr>");
283             sb.append("<td colspan=\"3\">");
284             sb.append("<br>");
285             sb.append("</td>");
286             sb.append("</tr>");
287 
288             sb.append("<tr>");
289             sb.append("<td>");
290             sb.append("<font class=\"gamma\" size=\"2\">");
291             sb.append(LanguageUtil.get(user, "user-name"));
292             sb.append("</font>");
293             sb.append("</td>");
294             sb.append("<td width=\"10\">");
295             sb.append("&nbsp;");
296             sb.append("</td>");
297             sb.append("<td>");
298             sb.append("<input class=\"form-text\" ");
299             sb.append("name=\"" + res.getNamespace() + "user_name\" ");
300             sb.append("size=\"23\" type=\"text\" value=\"");
301             sb.append(userName + "\">");
302             sb.append("</td>");
303             sb.append("</tr>");
304 
305             sb.append("<tr>");
306             sb.append("<td colspan=\"3\">");
307             sb.append("<br>");
308             sb.append("</td>");
309             sb.append("</tr>");
310 
311             sb.append("<tr>");
312             sb.append("<td>");
313             sb.append("<font class=\"gamma\" size=\"2\">");
314             sb.append(LanguageUtil.get(user, "password"));
315             sb.append("</font>");
316             sb.append("</td>");
317             sb.append("<td width=\"10\">");
318             sb.append("&nbsp;");
319             sb.append("</td>");
320             sb.append("<td>");
321             sb.append("<input class=\"form-text\" ");
322             sb.append("name=\"" + res.getNamespace() + "password\" ");
323             sb.append("size=\"23\" type=\"password\" value=\"");
324             sb.append(password + "\">");
325             sb.append("</td>");
326             sb.append("</tr>");
327 
328             sb.append("<tr>");
329             sb.append("<td colspan=\"3\">");
330             sb.append("<br>");
331             sb.append("</td>");
332             sb.append("</tr>");
333 
334             sb.append("<tr>");
335             sb.append("<td>");
336             sb.append("<font class=\"gamma\" size=\"2\">");
337             sb.append(LanguageUtil.get(user, "hidden-variables"));
338             sb.append("</font>");
339             sb.append("</td>");
340             sb.append("<td width=\"10\">");
341             sb.append("&nbsp;");
342             sb.append("</td>");
343             sb.append("<td>");
344             sb.append("<input class=\"form-text\" ");
345             sb.append("name=\"" + res.getNamespace() + "hidden_variables\" ");
346             sb.append("size=\"40\" type=\"text\" value=\"");
347             sb.append(hiddenVariables + "\">");
348             sb.append("</td>");
349             sb.append("</tr>");
350 
351             sb.append("<tr>");
352             sb.append("<td colspan=\"3\">");
353             sb.append("<br>");
354             sb.append("</td>");
355             sb.append("</tr>");
356 
357             sb.append("<tr>");
358             sb.append("<td>");
359             sb.append("<font class=\"gamma\" size=\"2\">");
360             sb.append(LanguageUtil.get(user, "html-attributes"));
361             sb.append("</font>");
362             sb.append("</td>");
363             sb.append("<td width=\"10\">");
364             sb.append("&nbsp;");
365             sb.append("</td>");
366             sb.append("<td>");
367             sb.append("<textarea class=\"form-text\" cols=\"40\" ");
368             sb.append("name=\"" + res.getNamespace() + "html_attributes\" ");
369             sb.append("rows=\"10\">");
370             sb.append(htmlAttributes);
371             sb.append("</textarea>");
372             sb.append("</td>");
373             sb.append("</tr>");
374 
375             sb.append("</table>");
376             sb.append("</td>");
377             sb.append("</tr>");
378             sb.append("<tr>");
379             sb.append("<td>");
380             sb.append("<br>");
381             sb.append("</td>");
382             sb.append("</tr>");
383             sb.append("<tr>");
384             sb.append("<td align=\"center\">");
385             sb.append("<input type=\"submit\" value=\"");
386             sb.append(LanguageUtil.get(user, "save-settings"));
387             sb.append("\">");
388             sb.append("</td>");
389             sb.append("</tr>");
390             sb.append("</table>");
391 
392             sb.append("<br>");
393 
394             sb.append("<table border=\"0\" cellpadding=\"0\" ");
395             sb.append("cellspacing=\"0\">");
396             sb.append("<tr>");
397             sb.append("<td>");
398             sb.append("<font class=\"gamma\" size=\"1\">");
399             sb.append("<span class=\"gamma-neg-alert\">");
400             sb.append(
401                 LanguageUtil.get(
402                     user,
403                     "leave-the-user-name-and-password-fields-blank-to-use-" +
404                         "your-current-login-information"));
405             sb.append("</span>");
406             sb.append("</font>");
407             sb.append("</td>");
408             sb.append("</tr>");
409             sb.append("</table>");
410 
411             sb.append("</td>");
412             sb.append("</tr>");
413 
414             sb.append("</form>");
415 
416             sb.append("</table>");
417 
418             sb.append("<script language=\"JavaScript\">");
419             sb.append("document." + res.getNamespace() + "fm.");
420             sb.append(res.getNamespace() + "src.focus();");
421             sb.append("</script>");
422 
423             res.setContentType(Constants.TEXT_HTML);
424 
425             res.getWriter().print(sb.toString());
426         }
427         catch (Exception e) {
428             throw new PortletException(e);
429         }
430     }
431 
432     public void doView(RenderRequest req, RenderResponse res)
433         throws IOException, PortletException {
434 
435         try {
436             PortletPreferences prefs = req.getPreferences();
437 
438             String cellpadding = prefs.getValue(
439                 "cellpadding", DEFAULT_CELLPADDING);
440             String cellspacing = prefs.getValue(
441                 "cellspacing", DEFAULT_CELLSPACING);
442             String align = prefs.getValue("align", DEFAULT_ALIGN);
443             String border = prefs.getValue("border", DEFAULT_BORDER);
444             String bordercolor = prefs.getValue(
445                 "bordercolor", DEFAULT_BORDERCOLOR);
446             String frameborder = prefs.getValue(
447                 "frameborder", DEFAULT_FRAMEBORDER);
448             String heightMaximized = prefs.getValue(
449                 "height-maximized", DEFAULT_HEIGHT_MAXIMIZED);
450             String heightNormal = prefs.getValue(
451                 "height-normal", DEFAULT_HEIGHT_NORMAL);
452             String hspace = prefs.getValue("hspace", DEFAULT_HSPACE);
453             String scrolling = prefs.getValue("scrolling", DEFAULT_SCROLLING);
454             String src = prefs.getValue("src", DEFAULT_SRC);
455             String vspace = prefs.getValue("vspace", DEFAULT_VSPACE);
456             String width = prefs.getValue("width", DEFAULT_WIDTH);
457 
458             String height = heightNormal;
459             if (req.getWindowState().equals(WindowState.MAXIMIZED)) {
460                 height = heightMaximized;
461             }
462 
463             src = transformSrc(req, res);
464 
465             StringBuffer sb = new StringBuffer();
466 
467             sb.append("<table ");
468             sb.append("cellpadding=\"").append(cellpadding).append("\" ");
469             sb.append("cellspacing=\"").append(cellspacing).append("\" ");
470             sb.append("width=\"100%\">");
471             sb.append("<tr><td>");
472 
473             sb.append("<iframe ");
474             sb.append("align=\"").append(align).append("\" ");
475             sb.append("border=\"").append(border).append("\" ");
476             sb.append("bordercolor=\"").append(bordercolor).append("\" ");
477             sb.append("frameborder=\"").append(frameborder).append("\" ");
478             sb.append("height=\"").append(height).append("\" ");
479             sb.append("hspace=\"").append(hspace).append("\" ");
480             sb.append("name=\"").append(
481                 res.getNamespace()).append("_iframe\" ");
482             sb.append("scrolling=\"").append(scrolling).append("\" ");
483             sb.append("src=\"").append(src).append("\" ");
484             sb.append("vspace=\"").append(vspace).append("\" ");
485             sb.append("width=\"").append(width).append("\" ");
486             sb.append("></iframe>");
487 
488             sb.append("</td></tr>");
489             sb.append("</table>");
490 
491             res.setContentType(Constants.TEXT_HTML);
492 
493             res.getWriter().print(sb.toString());
494         }
495         catch (Exception e) {
496             throw new PortletException(e);
497         }
498     }
499 
500     public void processAction(ActionRequest req, ActionResponse res)
501         throws IOException, PortletException {
502 
503         if (req.getPortletMode().equals(PortletMode.EDIT)) {
504             String cmd = ParamUtil.getString(req, Constants.CMD);
505 
506             if (cmd.equals(Constants.UPDATE)) {
507                 PortletPreferences prefs = req.getPreferences();
508 
509                 String src = ParamUtil.get(req, "src", DEFAULT_SRC);
510                 if (!src.startsWith("/") &&
511                     !StringUtil.startsWith(src, "http://") &&
512                     !StringUtil.startsWith(src, "https://")) {
513 
514                     src = Http.getProtocol(req) + "://" + src;
515                 }
516 
517                 boolean auth = ParamUtil.getBoolean(req, "auth");
518                 String authType = ParamUtil.getString(req, "auth_type");
519                 String formMethod = ParamUtil.getString(req, "form_method");
520                 String userName = ParamUtil.getString(req, "user_name");
521                 String password = ParamUtil.getString(req, "password");
522                 String hiddenVariables = ParamUtil.getString(
523                     req, "hidden_variables");
524                 String[] htmlAttributes = StringUtil.split(ParamUtil.getString(
525                     req, "html_attributes"), "\n");
526 
527                 prefs.setValue("src", src);
528 
529                 prefs.setValue("auth", Boolean.toString(auth));
530                 prefs.setValue("auth-type", authType);
531                 prefs.setValue("form-method", formMethod);
532                 prefs.setValue("user-name", userName);
533                 prefs.setValue("password", password);
534                 prefs.setValue("hidden-variables", hiddenVariables);
535 
536                 for (int i = 0; i < htmlAttributes.length; i++) {
537                     int pos = htmlAttributes[i].indexOf("=");
538 
539                     if (pos != -1) {
540                         String key = htmlAttributes[i].substring(0, pos);
541                         String value = htmlAttributes[i].substring(
542                             pos + 1, htmlAttributes[i].length());
543 
544                         prefs.setValue(key, value);
545                     }
546                 }
547 
548                 prefs.store();
549 
550                 SessionMessages.add(
551                     req, getPortletConfig().getPortletName() + ".doEdit");
552             }
553         }
554     }
555 
556     protected String getSrc(RenderRequest req, RenderResponse res) {
557         PortletPreferences prefs = req.getPreferences();
558 
559         return prefs.getValue("src", DEFAULT_SRC);
560     }
561 
562     protected String getUserName(RenderRequest req, RenderResponse res) {
563         PortletPreferences prefs = req.getPreferences();
564 
565         return prefs.getValue("user-name", req.getRemoteUser());
566     }
567 
568     protected String getPassword(RenderRequest req, RenderResponse res)
569         throws PortalException, SystemException {
570 
571         PortletPreferences prefs = req.getPreferences();
572 
573         String defaultPassword = null;
574         if (req.getRemoteUser() != null) {
575             defaultPassword = PortalUtil.getUser(req).getPassword();
576         }
577 
578         return prefs.getValue("password", defaultPassword);
579     }
580 
581     protected String transformSrc(RenderRequest req, RenderResponse res)
582         throws PortalException, SystemException {
583 
584         PortletPreferences prefs = req.getPreferences();
585 
586         String src = getSrc(req, res);
587 
588         boolean auth = GetterUtil.getBoolean(
589             prefs.getValue("auth", StringPool.BLANK), false);
590         String authType = prefs.getValue("auth-type", StringPool.BLANK);
591         String userName = getUserName(req, res);
592         String password = getPassword(req, res);
593 
594         if (auth) {
595             if (authType.equals("basic")) {
596                 int pos = src.indexOf("://");
597 
598                 String protocol = src.substring(0, pos + 3);
599                 String url = src.substring(pos + 3, src.length());
600 
601                 src =
602                     protocol + userName + ":" + password +
603                     "@" + url;
604             }
605             else {
606                 String ctxPath =
607                     (String)req.getPortletSession().getAttribute(
608                         WebKeys.CTX_PATH, PortletSession.APPLICATION_SCOPE);
609 
610                 String companyId = PortalUtil.getCompanyId(req);
611 
612                 Layout layout = (Layout)req.getAttribute(WebKeys.LAYOUT);
613 
614                 Portlet portlet = PortletManagerUtil.getPortletById(
615                     companyId, getPortletConfig().getPortletName());
616 
617                 src =
618                     ctxPath + "/" + portlet.getStrutsPath() +
619                         "/proxy?p_l_id=" + layout.getLayoutId();
620             }
621         }
622 
623         return src;
624     }
625 
626 }