001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.deploy.sandbox;
016    
017    import com.liferay.portal.kernel.deploy.Deployer;
018    import com.liferay.portal.kernel.plugin.PluginPackage;
019    import com.liferay.portal.kernel.util.FileUtil;
020    import com.liferay.portal.kernel.util.TextFormatter;
021    import com.liferay.portal.kernel.xml.Document;
022    import com.liferay.portal.kernel.xml.Element;
023    import com.liferay.portal.kernel.xml.Namespace;
024    import com.liferay.portal.kernel.xml.QName;
025    import com.liferay.portal.kernel.xml.SAXReaderUtil;
026    
027    import java.io.File;
028    
029    import java.util.ArrayList;
030    import java.util.HashMap;
031    import java.util.List;
032    import java.util.Map;
033    
034    /**
035     * @author Igor Spasic
036     * @author Brian Wing Shun Chan
037     */
038    public class PortletSandboxHandler extends BaseSandboxHandler {
039    
040            public PortletSandboxHandler(Deployer deployer) {
041                    super(deployer);
042    
043                    _deployer = deployer;
044            }
045    
046            @Override
047            protected void clonePlugin(File dir, PluginPackage pluginPackage)
048                    throws Exception {
049    
050                    Map<String, String> filterMap = new HashMap<String, String>();
051    
052                    filterMap.put(
053                            "portlet_class", "com.liferay.util.bridges.alloy.AlloyPortlet");
054                    filterMap.put("portlet_name", "1");
055                    filterMap.put("portlet_title", pluginPackage.getName());
056                    filterMap.put("restore_current_view", "false");
057                    filterMap.put(
058                            "friendly_url_mapper_class",
059                            "com.liferay.util.bridges.alloy.AlloyFriendlyURLMapper");
060                    filterMap.put(
061                            "friendly_url_mapping",
062                            TextFormatter.format(pluginPackage.getName(), TextFormatter.B));
063                    filterMap.put(
064                            "friendly_url_routes",
065                            "com/liferay/util/bridges/alloy/alloy-friendly-url-routes.xml");
066                    filterMap.put(
067                            "namespace",
068                            TextFormatter.format(pluginPackage.getName(), TextFormatter.D));
069                    filterMap.put(
070                            "package_path",
071                            "com.liferay." +
072                                    TextFormatter.format(pluginPackage.getName(), TextFormatter.B));
073    
074                    _deployer.copyDependencyXml(
075                            "liferay-display.xml", dir + "/WEB-INF", filterMap);
076    
077                    updateLiferayDisplayXML(dir);
078    
079                    _deployer.copyDependencyXml(
080                            "liferay-portlet.xml", dir + "/WEB-INF", filterMap);
081    
082                    _deployer.copyDependencyXml("portlet.xml", dir + "/WEB-INF", filterMap);
083    
084                    updatePortletXML(dir);
085    
086                    _deployer.copyDependencyXml("service.xml", dir + "/WEB-INF", filterMap);
087            }
088    
089            @Override
090            protected String getPluginType() {
091                    return _PLUGIN_TYPE;
092            }
093    
094            protected Namespace getPortletNamespace(Document document) {
095                    Element rootElement = document.getRootElement();
096    
097                    QName qName = rootElement.getQName();
098    
099                    return qName.getNamespace();
100            }
101    
102            protected void updateLiferayDisplayXML(File dir) throws Exception {
103                    File file = new File(dir + "/WEB-INF/liferay-display.xml");
104    
105                    String content = FileUtil.read(file);
106    
107                    Document document = SAXReaderUtil.read(content);
108    
109                    Element rootElement = document.getRootElement();
110    
111                    Element categoryElement = rootElement.addElement("category");
112    
113                    categoryElement.addAttribute("name", "category.sandbox");
114    
115                    Element portletElement = categoryElement.addElement("portlet");
116    
117                    portletElement.addAttribute("id", "1");
118    
119                    FileUtil.write(file, document.formattedString());
120            }
121    
122            protected void updatePortletXML(File dir) throws Exception {
123                    File file = new File(dir + "/WEB-INF/portlet.xml");
124    
125                    String content = FileUtil.read(file);
126    
127                    Document document = SAXReaderUtil.read(content);
128    
129                    Element rootElement = document.getRootElement();
130    
131                    List<Element> portletElements = rootElement.elements("portlet");
132    
133                    for (Element portletElement : portletElements) {
134                            List<Element> elements = new ArrayList<Element>();
135    
136                            Element resourceBundleElement = SAXReaderUtil.createElement(
137                                    SAXReaderUtil.createQName(
138                                            "resource-bundle", getPortletNamespace(document)));
139    
140                            resourceBundleElement.setText("content.Language");
141    
142                            for (Element element : portletElement.elements()) {
143                                    String elementName = element.getName();
144    
145                                    if (elementName.equals("init-param") ||
146                                            elementName.equals("portlet-info")) {
147                                    }
148                                    else {
149                                            elements.add(element);
150    
151                                            if (elementName.equals("supports")) {
152                                                    elements.add(resourceBundleElement);
153                                            }
154                                    }
155    
156                                    element.detach();
157                            }
158    
159                            for (Element element : elements) {
160                                    portletElement.add(element);
161                            }
162                    }
163    
164                    FileUtil.write(file, document.formattedString());
165            }
166    
167            private static final String _PLUGIN_TYPE = "portlet";
168    
169            private Deployer _deployer;
170    
171    }