Created PortletConfigurationGenerator that generates portlet.xml and liferay xml:s from web.xml.
svn changeset:4189/svn branch:trunk
+++ /dev/null
-/**\r
- * \r
- */\r
-package com.itmill.toolkit.demo;\r
-\r
-import java.util.Iterator;\r
-import java.util.Map;\r
-\r
-import javax.portlet.ActionRequest;\r
-import javax.portlet.ActionResponse;\r
-import javax.portlet.PortletMode;\r
-import javax.portlet.PortletRequest;\r
-import javax.portlet.PortletURL;\r
-import javax.portlet.RenderRequest;\r
-import javax.portlet.RenderResponse;\r
-import javax.portlet.WindowState;\r
-\r
-import com.itmill.toolkit.Application;\r
-import com.itmill.toolkit.terminal.ExternalResource;\r
-import com.itmill.toolkit.terminal.gwt.server.PortletApplicationContext;\r
-import com.itmill.toolkit.terminal.gwt.server.PortletApplicationContext.PortletListener;\r
-import com.itmill.toolkit.ui.Label;\r
-import com.itmill.toolkit.ui.Link;\r
-import com.itmill.toolkit.ui.TextField;\r
-import com.itmill.toolkit.ui.Window;\r
-import com.itmill.toolkit.ui.Window.Notification;\r
-\r
-/**\r
- * @author marc\r
- * \r
- */\r
-public class PortletDemo extends Application {\r
-\r
- Window main = new Window();\r
- TextField tf = new TextField("Some value");\r
- Label userInfo = new Label();\r
- Link portletEdit = new Link();\r
- Link portletMax = new Link();\r
- Link someAction = null;\r
-\r
- public void init() {\r
- main = new Window();\r
- setMainWindow(main);\r
-\r
- userInfo.setCaption("User info");\r
- userInfo.setContentMode(Label.CONTENT_PREFORMATTED);\r
- main.addComponent(userInfo);\r
-\r
- tf.setEnabled(false);\r
- tf.setImmediate(true);\r
- main.addComponent(tf);\r
-\r
- portletEdit.setEnabled(false);\r
- main.addComponent(portletEdit);\r
- portletMax.setEnabled(false);\r
- main.addComponent(portletMax);\r
-\r
- if (getContext() instanceof PortletApplicationContext) {\r
- PortletApplicationContext ctx = (PortletApplicationContext) getContext();\r
- ctx.addPortletListener(this, new DemoPortletListener());\r
- } else {\r
- getMainWindow().showNotification("Not inited via Portal!",\r
- Notification.TYPE_ERROR_MESSAGE);\r
- }\r
-\r
- }\r
-\r
- private class DemoPortletListener implements PortletListener {\r
-\r
- public void handleActionRequest(ActionRequest request,\r
- ActionResponse response) {\r
-\r
- main.addComponent(new Label("Action received"));\r
-\r
- }\r
-\r
- public void handleRenderRequest(RenderRequest request,\r
- RenderResponse response) {\r
- // Portlet up-and-running, enable stuff\r
- portletEdit.setEnabled(true);\r
- portletMax.setEnabled(true);\r
-\r
- // Editable if we're in editmode\r
- tf.setEnabled((request.getPortletMode() == PortletMode.EDIT));\r
-\r
- // Show notification about current mode and state\r
- getMainWindow().showNotification(\r
- "Portlet status",\r
- "Mode: " + request.getPortletMode() + " State: "\r
- + request.getWindowState(),\r
- Notification.TYPE_WARNING_MESSAGE);\r
-\r
- // Display current user info\r
- Map uinfo = (Map) request.getAttribute(PortletRequest.USER_INFO);\r
- if (uinfo != null) {\r
- String s = "";\r
- for (Iterator it = uinfo.keySet().iterator(); it.hasNext();) {\r
- Object key = it.next();\r
- Object val = uinfo.get(key);\r
- s += key + ": " + val + "\n";\r
- }\r
- if (request.isUserInRole("administrator")) {\r
- s += "(administrator)";\r
- }\r
- userInfo.setValue(s);\r
- } else {\r
- userInfo.setValue("-");\r
- }\r
-\r
- // Create Edit/Done link (actionUrl)\r
- PortletURL url = response.createActionURL();\r
- try {\r
- url\r
- .setPortletMode((request.getPortletMode() == PortletMode.VIEW ? PortletMode.EDIT\r
- : PortletMode.VIEW));\r
- portletEdit.setResource(new ExternalResource(url.toString()));\r
- portletEdit\r
- .setCaption((request.getPortletMode() == PortletMode.VIEW ? "Edit"\r
- : "Done"));\r
- } catch (Exception e) {\r
- portletEdit.setEnabled(false);\r
- }\r
- // Create Maximize/Normal link (actionUrl)\r
- url = response.createActionURL();\r
- try {\r
- url\r
- .setWindowState((request.getWindowState() == WindowState.NORMAL ? WindowState.MAXIMIZED\r
- : WindowState.NORMAL));\r
- portletMax.setResource(new ExternalResource(url.toString()));\r
- portletMax\r
- .setCaption((request.getWindowState() == WindowState.NORMAL ? "Maximize"\r
- : "Back to normal"));\r
- } catch (Exception e) {\r
- portletMax.setEnabled(false);\r
- }\r
-\r
- if (someAction == null) {\r
- url = response.createActionURL();\r
- try {\r
- someAction = new Link("An action", new ExternalResource(url\r
- .toString()));\r
- main.addComponent(someAction);\r
- } catch (Exception e) {\r
- // Oops\r
- System.err.println("Could not create someAction: " + e);\r
- }\r
-\r
- }\r
-\r
- }\r
- }\r
-}\r
--- /dev/null
+/**\r
+ * \r
+ */\r
+package com.itmill.toolkit.demo.portlet;\r
+\r
+import java.util.Iterator;\r
+import java.util.Map;\r
+\r
+import javax.portlet.ActionRequest;\r
+import javax.portlet.ActionResponse;\r
+import javax.portlet.PortletMode;\r
+import javax.portlet.PortletRequest;\r
+import javax.portlet.PortletURL;\r
+import javax.portlet.RenderRequest;\r
+import javax.portlet.RenderResponse;\r
+import javax.portlet.WindowState;\r
+\r
+import com.itmill.toolkit.Application;\r
+import com.itmill.toolkit.terminal.ExternalResource;\r
+import com.itmill.toolkit.terminal.gwt.server.PortletApplicationContext;\r
+import com.itmill.toolkit.terminal.gwt.server.PortletApplicationContext.PortletListener;\r
+import com.itmill.toolkit.ui.Label;\r
+import com.itmill.toolkit.ui.Link;\r
+import com.itmill.toolkit.ui.TextField;\r
+import com.itmill.toolkit.ui.Window;\r
+import com.itmill.toolkit.ui.Window.Notification;\r
+\r
+/**\r
+ * @author marc\r
+ * \r
+ */\r
+public class PortletDemo extends Application {\r
+\r
+ Window main = new Window();\r
+ TextField tf = new TextField("Some value");\r
+ Label userInfo = new Label();\r
+ Link portletEdit = new Link();\r
+ Link portletMax = new Link();\r
+ Link someAction = null;\r
+\r
+ public void init() {\r
+ main = new Window();\r
+ setMainWindow(main);\r
+\r
+ userInfo.setCaption("User info");\r
+ userInfo.setContentMode(Label.CONTENT_PREFORMATTED);\r
+ main.addComponent(userInfo);\r
+\r
+ tf.setEnabled(false);\r
+ tf.setImmediate(true);\r
+ main.addComponent(tf);\r
+\r
+ portletEdit.setEnabled(false);\r
+ main.addComponent(portletEdit);\r
+ portletMax.setEnabled(false);\r
+ main.addComponent(portletMax);\r
+\r
+ if (getContext() instanceof PortletApplicationContext) {\r
+ PortletApplicationContext ctx = (PortletApplicationContext) getContext();\r
+ ctx.addPortletListener(this, new DemoPortletListener());\r
+ } else {\r
+ getMainWindow().showNotification("Not inited via Portal!",\r
+ Notification.TYPE_ERROR_MESSAGE);\r
+ }\r
+\r
+ }\r
+\r
+ private class DemoPortletListener implements PortletListener {\r
+\r
+ public void handleActionRequest(ActionRequest request,\r
+ ActionResponse response) {\r
+\r
+ main.addComponent(new Label("Action received"));\r
+\r
+ }\r
+\r
+ public void handleRenderRequest(RenderRequest request,\r
+ RenderResponse response) {\r
+ // Portlet up-and-running, enable stuff\r
+ portletEdit.setEnabled(true);\r
+ portletMax.setEnabled(true);\r
+\r
+ // Editable if we're in editmode\r
+ tf.setEnabled((request.getPortletMode() == PortletMode.EDIT));\r
+\r
+ // Show notification about current mode and state\r
+ getMainWindow().showNotification(\r
+ "Portlet status",\r
+ "Mode: " + request.getPortletMode() + " State: "\r
+ + request.getWindowState(),\r
+ Notification.TYPE_WARNING_MESSAGE);\r
+\r
+ // Display current user info\r
+ Map uinfo = (Map) request.getAttribute(PortletRequest.USER_INFO);\r
+ if (uinfo != null) {\r
+ String s = "";\r
+ for (Iterator it = uinfo.keySet().iterator(); it.hasNext();) {\r
+ Object key = it.next();\r
+ Object val = uinfo.get(key);\r
+ s += key + ": " + val + "\n";\r
+ }\r
+ if (request.isUserInRole("administrator")) {\r
+ s += "(administrator)";\r
+ }\r
+ userInfo.setValue(s);\r
+ } else {\r
+ userInfo.setValue("-");\r
+ }\r
+\r
+ // Create Edit/Done link (actionUrl)\r
+ PortletURL url = response.createActionURL();\r
+ try {\r
+ url\r
+ .setPortletMode((request.getPortletMode() == PortletMode.VIEW ? PortletMode.EDIT\r
+ : PortletMode.VIEW));\r
+ portletEdit.setResource(new ExternalResource(url.toString()));\r
+ portletEdit\r
+ .setCaption((request.getPortletMode() == PortletMode.VIEW ? "Edit"\r
+ : "Done"));\r
+ } catch (Exception e) {\r
+ portletEdit.setEnabled(false);\r
+ }\r
+ // Create Maximize/Normal link (actionUrl)\r
+ url = response.createActionURL();\r
+ try {\r
+ url\r
+ .setWindowState((request.getWindowState() == WindowState.NORMAL ? WindowState.MAXIMIZED\r
+ : WindowState.NORMAL));\r
+ portletMax.setResource(new ExternalResource(url.toString()));\r
+ portletMax\r
+ .setCaption((request.getWindowState() == WindowState.NORMAL ? "Maximize"\r
+ : "Back to normal"));\r
+ } catch (Exception e) {\r
+ portletMax.setEnabled(false);\r
+ }\r
+\r
+ if (someAction == null) {\r
+ url = response.createActionURL();\r
+ try {\r
+ someAction = new Link("An action", new ExternalResource(url\r
+ .toString()));\r
+ main.addComponent(someAction);\r
+ } catch (Exception e) {\r
+ // Oops\r
+ System.err.println("Could not create someAction: " + e);\r
+ }\r
+\r
+ }\r
+\r
+ }\r
+ }\r
+}\r
--- /dev/null
+/**\r
+ * \r
+ */\r
+package com.itmill.toolkit.portlet.util;\r
+\r
+import java.io.BufferedReader;\r
+import java.io.File;\r
+import java.io.FileNotFoundException;\r
+import java.io.FileOutputStream;\r
+import java.io.FileReader;\r
+import java.io.IOException;\r
+import java.io.OutputStreamWriter;\r
+import java.nio.charset.Charset;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
+\r
+/**\r
+ * Generates portlet.xml, liferay-portlet.xml, liferay-display.xml from web.xml.\r
+ * Currently uses regular expressions to avoid dependencies; does not strictly\r
+ * adhere to xml rules, but should work with a 'normal' web.xml.\r
+ * \r
+ * @author marc\r
+ */\r
+public class PortletConfigurationGenerator {\r
+ // can be changed for debugging:\r
+ private static final String WEB_XML_FILE = "web.xml";\r
+ private static final String PORTLET_XML_FILE = "portlet.xml";\r
+ private static final String LIFERAY_PORTLET_XML_FILE = "liferay-portlet.xml";\r
+ private static final String LIFERAY_DISPLAY_XML_FILE = "liferay-display.xml";\r
+\r
+ // "templates" follow;\r
+ private static final String PORTLET_XML_HEAD = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"\r
+ + "<portlet-app\r\n"\r
+ + " xmlns=\"http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd\"\r\n"\r
+ + " version=\"1.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n"\r
+ + " xsi:schemaLocation=\"http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd\">\r\n";\r
+ private static final String PORTLET_XML_SECTION = " <portlet>\r\n"\r
+ + " <portlet-name>%PORTLETNAME%</portlet-name>\r\n"\r
+ + " <display-name>IT Mill Toolkit %NAME%</display-name>\r\n"\r
+ + " <portlet-class>com.itmill.toolkit.terminal.gwt.server.ApplicationPortlet</portlet-class>\r\n"\r
+ + " <init-param>\r\n"\r
+ + " <name>application</name>\r\n"\r
+ + " <value>%URL%</value>\r\n"\r
+ + " </init-param>\r\n"\r
+ + " <supports>\r\n"\r
+ + " <mime-type>text/html</mime-type>\r\n"\r
+ + " <portlet-mode>view</portlet-mode>\r\n"\r
+ + " <portlet-mode>edit</portlet-mode>\r\n"\r
+ + " <portlet-mode>help</portlet-mode>\r\n"\r
+ + " </supports>\r\n"\r
+ + " <portlet-info>\r\n"\r
+ + " <title>IT Mill Toolkit %NAME%</title>\r\n"\r
+ + " <short-title>%NAME%</short-title>\r\n"\r
+ + " </portlet-info>\r\n"\r
+ + " \r\n"\r
+ + " <security-role-ref>\r\n"\r
+ + " <role-name>administrator</role-name>\r\n"\r
+ + " </security-role-ref>\r\n"\r
+ + " <security-role-ref>\r\n"\r
+ + " <role-name>guest</role-name>\r\n"\r
+ + " </security-role-ref>\r\n"\r
+ + " <security-role-ref>\r\n"\r
+ + " <role-name>power-user</role-name>\r\n"\r
+ + " </security-role-ref>\r\n"\r
+ + " <security-role-ref>\r\n"\r
+ + " <role-name>user</role-name>\r\n"\r
+ + " </security-role-ref>\r\n"\r
+ + " </portlet>\r\n";\r
+ private static final String PORTLET_XML_FOOT = "</portlet-app>";\r
+\r
+ private static final String LIFERAY_PORTLET_XML_HEAD = "<?xml version=\"1.0\"?>\r\n"\r
+ + "<!DOCTYPE liferay-portlet-app PUBLIC \"-//Liferay//DTD Portlet Application 4.3.0//EN\" \"http://www.liferay.com/dtd/liferay-portlet-app_4_3_0.dtd\">\r\n"\r
+ + "\r\n" + "<liferay-portlet-app>\r\n" + "";\r
+ private static final String LIFERAY_PORTLET_XML_SECTION = " <portlet>\r\n"\r
+ + " <portlet-name>%PORTLETNAME%</portlet-name>\r\n"\r
+ + " <instanceable>true</instanceable> \r\n"\r
+ + " <ajaxable>false</ajaxable>\r\n"\r
+ + " </portlet>\r\n" + "";\r
+ private static final String LIFERAY_PORTLET_XML_FOOT = " \r\n"\r
+ + " <role-mapper>\r\n"\r
+ + " <role-name>administrator</role-name>\r\n"\r
+ + " <role-link>Administrator</role-link>\r\n"\r
+ + " </role-mapper>\r\n" + " <role-mapper>\r\n"\r
+ + " <role-name>guest</role-name>\r\n"\r
+ + " <role-link>Guest</role-link>\r\n"\r
+ + " </role-mapper>\r\n" + " <role-mapper>\r\n"\r
+ + " <role-name>power-user</role-name>\r\n"\r
+ + " <role-link>Power User</role-link>\r\n"\r
+ + " </role-mapper>\r\n" + " <role-mapper>\r\n"\r
+ + " <role-name>user</role-name>\r\n"\r
+ + " <role-link>User</role-link>\r\n"\r
+ + " </role-mapper>\r\n" + " \r\n"\r
+ + "</liferay-portlet-app>";\r
+ private static final String LIFERAY_DISPLAY_XML_HEAD = "<?xml version=\"1.0\"?>\r\n"\r
+ + "<!DOCTYPE display PUBLIC \"-//Liferay//DTD Display 4.0.0//EN\" \"http://www.liferay.com/dtd/liferay-display_4_0_0.dtd\">\r\n"\r
+ + "\r\n"\r
+ + "<display>\r\n"\r
+ + " <category name=\"IT Mill Toolkit\">\r\n" + "";\r
+ private static final String LIFERAY_DISPLAY_XML_SECTION = " <portlet id=\"%PORTLETNAME%\" />\r\n";\r
+ private static final String LIFERAY_DISPLAY_XML_FOOT = "\r\n"\r
+ + " </category>\r\n" + "</display>";\r
+\r
+ /**\r
+ * @param args\r
+ * <path to directory with web.xml>\r
+ */\r
+ public static void main(String[] args) {\r
+ if (args.length < 1 || !new File(args[0]).isDirectory()) {\r
+ System.err\r
+ .println("Usage: PortletConfigurationGenerator <directory>");\r
+ return;\r
+ }\r
+\r
+ /*\r
+ * Read web.xml\r
+ */\r
+ File dir = new File(args[0]);\r
+ File webxmlFile = new File(dir.getAbsolutePath() + File.separatorChar\r
+ + WEB_XML_FILE);\r
+ String webXml = "";\r
+ BufferedReader in = null;\r
+ try {\r
+ in = new BufferedReader(new FileReader(webxmlFile));\r
+ String line = in.readLine();\r
+ while (line != null) {\r
+ webXml += line;\r
+ line = in.readLine();\r
+ }\r
+ } catch (FileNotFoundException e1) {\r
+ System.out.println(webxmlFile + " not found!");\r
+ return;\r
+ } catch (IOException e2) {\r
+ System.out.println("IOException while reading " + webxmlFile);\r
+ webXml = null;\r
+ }\r
+ try {\r
+ if (in != null) {\r
+ in.close();\r
+ }\r
+ } catch (IOException e1) {\r
+ System.out.println("IOException while closing " + webxmlFile);\r
+ }\r
+ if (webXml == null) {\r
+ System.out.println("Could not read web.xml!");\r
+ return;\r
+ }\r
+\r
+ /*\r
+ * Open outputs\r
+ */\r
+\r
+ // Open portlet.xml\r
+ File portletXmlFile = new File(args[0] + File.separatorChar\r
+ + PORTLET_XML_FILE);\r
+ OutputStreamWriter pout = null;\r
+ try {\r
+ pout = new OutputStreamWriter(new FileOutputStream(portletXmlFile),\r
+ Charset.forName("UTF-8"));\r
+ } catch (FileNotFoundException e) {\r
+ System.out.println(portletXmlFile + " not found!");\r
+ }\r
+ // open liferay-portlet.xml\r
+ File liferayPortletXmlFile = new File(args[0] + File.separatorChar\r
+ + LIFERAY_PORTLET_XML_FILE);\r
+ OutputStreamWriter lpout = null;\r
+ try {\r
+ lpout = new OutputStreamWriter(new FileOutputStream(\r
+ liferayPortletXmlFile), Charset.forName("UTF-8"));\r
+ } catch (FileNotFoundException e) {\r
+ System.out.println(liferayPortletXmlFile + " not found!");\r
+ }\r
+ // open liferay-display.xml\r
+ File liferayDisplayXmlFile = new File(args[0] + File.separatorChar\r
+ + LIFERAY_DISPLAY_XML_FILE);\r
+ OutputStreamWriter ldout = null;\r
+ try {\r
+ ldout = new OutputStreamWriter(new FileOutputStream(\r
+ liferayDisplayXmlFile), Charset.forName("UTF-8"));\r
+ } catch (FileNotFoundException e) {\r
+ System.out.println(liferayDisplayXmlFile + " not found!");\r
+ }\r
+\r
+ if (pout != null && lpout != null && ldout != null) {\r
+\r
+ String pstring = PORTLET_XML_HEAD;\r
+ String lpstring = LIFERAY_PORTLET_XML_HEAD;\r
+ String ldstring = LIFERAY_DISPLAY_XML_HEAD;\r
+\r
+ Pattern p = Pattern\r
+ .compile(\r
+ "<servlet-mapping>.*?<servlet-name>(.*?)<\\/servlet-name>.*?<url-pattern>(.*?)<\\/url-pattern>.*?<\\/servlet-mapping>",\r
+ Pattern.MULTILINE);\r
+ Matcher m = p.matcher(webXml);\r
+ while (m.find()) {\r
+ if (m.groupCount() != 2) {\r
+ System.out\r
+ .println("Could not find servlet-name and url-pattern for: "\r
+ + m.group());\r
+ continue;\r
+ }\r
+ String name = m.group(1);\r
+ // remove leading- and trailing whitespace\r
+ name = name.replaceAll("^\\s*", "");\r
+ name = name.replaceAll("\\s*$", "");\r
+ String pname = name + "Portlet";\r
+ String url = m.group(2);\r
+ // remove leading- and trailing whitespace\r
+ url = url.replaceAll("^\\s*", "");\r
+ url = url.replaceAll("\\s*$", "");\r
+ if (url.startsWith("/")) {\r
+ url = url.substring(1);\r
+ }\r
+ if (url.endsWith("*")) {\r
+ url = url.substring(0, url.length() - 1);\r
+ }\r
+ if (url.endsWith("/")) {\r
+ url = url.substring(0, url.length() - 1);\r
+ }\r
+ System.out.println("Mapping " + pname + " to " + url);\r
+ String s = PORTLET_XML_SECTION;\r
+ s = s.replaceAll("%NAME%", name);\r
+ s = s.replaceAll("%PORTLETNAME%", pname);\r
+ s = s.replaceAll("%URL%", url);\r
+ pstring += s;\r
+\r
+ s = LIFERAY_PORTLET_XML_SECTION;\r
+ s = s.replaceAll("%NAME%", name);\r
+ s = s.replaceAll("%PORTLETNAME%", pname);\r
+ s = s.replaceAll("%URL%", url);\r
+ lpstring += s;\r
+\r
+ s = LIFERAY_DISPLAY_XML_SECTION;\r
+ s = s.replaceAll("%NAME%", name);\r
+ s = s.replaceAll("%PORTLETNAME%", pname);\r
+ s = s.replaceAll("%URL%", url);\r
+ ldstring += s;\r
+\r
+ }\r
+\r
+ pstring += PORTLET_XML_FOOT;\r
+ lpstring += LIFERAY_PORTLET_XML_FOOT;\r
+ ldstring += LIFERAY_DISPLAY_XML_FOOT;\r
+\r
+ try {\r
+ pout.write(pstring);\r
+ lpout.write(lpstring);\r
+ ldout.write(ldstring);\r
+ } catch (IOException e) {\r
+ System.out.println("Write FAILED:" + e);\r
+ }\r
+\r
+ }\r
+\r
+ try {\r
+ if (pout != null) {\r
+ pout.close();\r
+ }\r
+ if (lpout != null) {\r
+ lpout.close();\r
+ }\r
+ if (ldout != null) {\r
+ ldout.close();\r
+ }\r
+ } catch (IOException e) {\r
+ System.out.println("Close FAILED: " + e);\r
+ }\r
+ System.out.println("Done.");\r
+ }\r
+}\r
\r
public class ApplicationPortlet implements Portlet {\r
// The application to show\r
- protected String app = "Calc";\r
+ protected String app = null;\r
// some applications might require that the height is specified\r
protected String height = null; // e.g "200px"\r
\r