001    /**
002     *  Licensed to the Apache Software Foundation (ASF) under one or more
003     *  contributor license agreements.  See the NOTICE file distributed with
004     *  this work for additional information regarding copyright ownership.
005     *  The ASF licenses this file to You under the Apache License, Version 2.0
006     *  (the "License"); you may not use this file except in compliance with
007     *  the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     *  Unless required by applicable law or agreed to in writing, software
012     *  distributed under the License is distributed on an "AS IS" BASIS,
013     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     *  See the License for the specific language governing permissions and
015     *  limitations under the License.
016     */
017    package org.apache.geronimo.console.car;
018    
019    import java.io.IOException;
020    import java.io.BufferedReader;
021    import java.io.StringReader;
022    import java.util.List;
023    import java.util.ArrayList;
024    import java.net.URL;
025    import java.net.MalformedURLException;
026    import javax.portlet.ActionRequest;
027    import javax.portlet.ActionResponse;
028    import javax.portlet.PortletException;
029    import javax.portlet.RenderRequest;
030    import javax.portlet.RenderResponse;
031    import org.apache.commons.logging.Log;
032    import org.apache.commons.logging.LogFactory;
033    import org.apache.geronimo.console.MultiPageModel;
034    import org.apache.geronimo.console.util.PortletManager;
035    import org.apache.geronimo.kernel.repository.Artifact;
036    import org.apache.geronimo.system.plugin.PluginMetadata;
037    
038    /**
039     * Handler for the screen where you configure plugin data before exporting
040     *
041     * @version $Rev: 555767 $ $Date: 2007-07-12 17:07:21 -0400 (Thu, 12 Jul 2007) $
042     */
043    public class ExportConfigHandler extends BaseImportExportHandler {
044        private final static Log log = LogFactory.getLog(ExportConfigHandler.class);
045    
046        public ExportConfigHandler() {
047            super(CONFIGURE_EXPORT_MODE, "/WEB-INF/view/car/pluginParams.jsp");
048        }
049    
050        public String actionBeforeView(ActionRequest request, ActionResponse response, MultiPageModel model) throws PortletException, IOException {
051            String configId = request.getParameter("configId");
052            if(configId != null) {
053                response.setRenderParameter("configId", configId);
054            }
055            return getMode();
056        }
057    
058        public void renderView(RenderRequest request, RenderResponse response, MultiPageModel model) throws PortletException, IOException {
059            String configId = request.getParameter("configId");
060            PluginMetadata data = PortletManager.getCurrentServer(request).getPluginInstaller().getPluginMetadata(Artifact.create(configId));
061            request.setAttribute("configId", data.getModuleId());
062            request.setAttribute("name", data.getName());
063            request.setAttribute("repository", combine(data.getRepositories()));
064            request.setAttribute("category", data.getCategory());
065            request.setAttribute("url", data.getPluginURL());
066            request.setAttribute("author", data.getAuthor());
067            request.setAttribute("description", data.getDescription());
068            PluginMetadata.License[] licenses = data.getLicenses();
069            if(licenses != null && licenses.length > 0) {
070                request.setAttribute("license", licenses[0].getName());
071                if(licenses[0].isOsiApproved()) {
072                    request.setAttribute("licenseOSI", "true");
073                }
074                if(licenses.length > 1) {
075                    log.warn("Unable to edit plugin metadata containing more than one license!  Additional license data will not be editable.");
076                }
077            }
078            //Choose the first geronimo-versions element and set the config version element to that version number.
079            PluginMetadata.geronimoVersions[] gerVers = data.getGeronimoVersions();
080            if(gerVers != null && gerVers.length > 0) {
081                request.setAttribute("geronimoVersion",gerVers[0].getVersion());
082            }
083            request.setAttribute("jvmVersions", combine(data.getJvmVersions()));
084            request.setAttribute("dependencies", combine(data.getDependencies()));
085            request.setAttribute("obsoletes", combine(data.getObsoletes()));
086            PluginMetadata.Prerequisite[] reqs = data.getPrerequisites();
087            if(reqs != null && reqs.length > 0) {
088                for (int i = 0; i < reqs.length; i++) {
089                    PluginMetadata.Prerequisite req = reqs[i];
090                    String prefix = "prereq" + (i+1);
091                    request.setAttribute(prefix, req.getModuleId().toString());
092                    request.setAttribute(prefix +"type", req.getResourceType());
093                    request.setAttribute(prefix +"desc", req.getDescription());
094                }
095                if(reqs.length > 3) {
096                    log.warn("Unable to edit plugin metadata containing more than three prerequisites!  Additional prereqs will not be editable.");
097                }
098            }
099        }
100    
101        public String actionAfterView(ActionRequest request, ActionResponse response, MultiPageModel model) throws PortletException, IOException {
102            String configId = request.getParameter("configId");
103            String name = request.getParameter("name");
104            String repo = request.getParameter("repository");
105            String category = request.getParameter("category");
106            String url = request.getParameter("url");
107            String author = request.getParameter("author");
108            String description = request.getParameter("description");
109            String license = request.getParameter("license");
110            String osi = request.getParameter("licenseOSI");
111            String jvms = request.getParameter("jvmVersions");
112            String deps = request.getParameter("dependencies");
113            String obsoletes = request.getParameter("obsoletes");
114            PluginMetadata data = PortletManager.getCurrentServer(request).getPluginInstaller().getPluginMetadata(Artifact.create(configId));
115            PluginMetadata metadata = new PluginMetadata(name, data.getModuleId(),
116                    category, description, url, author, null, true, false);
117            metadata.setDependencies(split(deps));
118            metadata.setJvmVersions(split(jvms));
119            metadata.setObsoletes(split(obsoletes));
120            List licenses = new ArrayList();
121            if(license != null && !license.trim().equals("")) {
122                licenses.add(new PluginMetadata.License(license.trim(), osi != null && !osi.equals("")));
123            }
124            for (int i = 1; i < data.getLicenses().length; i++) {
125                licenses.add(data.getLicenses()[i]);
126            }
127            metadata.setLicenses((PluginMetadata.License[]) licenses.toArray(new PluginMetadata.License[licenses.size()]));
128            //Take the geronimo version and throw it into a geronimo-versions element and then add it to the metadata object.
129            PluginMetadata.geronimoVersions geronimoVersion = null;
130            String version = request.getParameter("geronimoVersion");
131            List gerVersions = new ArrayList();
132            gerVersions.add(new PluginMetadata.geronimoVersions(version,null,null,null));
133            metadata.setGeronimoVersions((PluginMetadata.geronimoVersions[])gerVersions.toArray(new PluginMetadata.geronimoVersions[gerVersions.size()]));
134            List prereqs = new ArrayList();
135            int counter = 1;
136            while(true) {
137                String prefix = "prereq" + counter;
138                ++counter;
139                String id = request.getParameter(prefix);
140                if(id == null || id.trim().equals("")) {
141                    break;
142                }
143                String type = request.getParameter(prefix+"type");
144                String desc = request.getParameter(prefix+"desc");
145                if(type != null && type.trim().equals("")) {
146                    type = null;
147                }
148                if(desc != null && desc.trim().equals("")) {
149                    desc = null;
150                }
151                prereqs.add(new PluginMetadata.Prerequisite(Artifact.create(id), false, type, desc));
152            }
153            for (int i = 3; i < data.getPrerequisites().length; i++) {
154                PluginMetadata.Prerequisite req = data.getPrerequisites()[i];
155                prereqs.add(req);
156            }
157            metadata.setPrerequisites((PluginMetadata.Prerequisite[]) prereqs.toArray(new PluginMetadata.Prerequisite[prereqs.size()]));
158            URL[] backupURLs = splitURLs(repo);
159            metadata.setRepositories(backupURLs);
160    
161            // TODO: Fields not yet handled by the UI
162            metadata.setForceStart(data.getForceStart());
163            metadata.setFilesToCopy(data.getFilesToCopy());
164            metadata.setConfigXmls(data.getConfigXmls());
165            // Save updated metadata
166            PortletManager.getCurrentServer(request).getPluginInstaller().updatePluginMetadata(metadata);
167    
168            response.setRenderParameter("configId", configId);
169            response.setRenderParameter("name", name);
170    
171            return CONFIRM_EXPORT_MODE+BEFORE_ACTION;
172        }
173    
174        private URL[] splitURLs(String backups) throws MalformedURLException {
175            String[] strings = split(backups);
176            URL[] result = new URL[strings.length];
177            for (int i = 0; i < result.length; i++) {
178                result[i] = new URL(strings[i]);
179            }
180            return result;
181        }
182    
183    
184        private String[] split(String deps) {
185            if(deps == null || deps.equals("")) {
186                return new String[0];
187            }
188            List list = new ArrayList();
189            BufferedReader in = new BufferedReader(new StringReader(deps));
190            String line;
191            try {
192                while((line = in.readLine()) != null) {
193                    line = line.trim();
194                    if(!line.equals("")) {
195                        list.add(line);
196                    }
197                }
198                in.close();
199            } catch (IOException e) {
200                log.error("Unable to parse request arguments", e);
201            }
202            return (String[]) list.toArray(new String[list.size()]);
203        }
204    
205        private String combine(String[] strings) {
206            if(strings == null || strings.length == 0) {
207                return null;
208            }
209            StringBuffer buf = new StringBuffer();
210            for (int i = 0; i < strings.length; i++) {
211                String string = strings[i];
212                if(i > 0) {
213                    buf.append("\n");
214                }
215                buf.append(string);
216            }
217            return buf.toString();
218        }
219    
220        private String combine(URL[] urls) {
221            if(urls == null || urls.length == 0) {
222                return null;
223            }
224            StringBuffer buf = new StringBuffer();
225            for (int i = 0; i < urls.length; i++) {
226                URL url = urls[i];
227                if(i > 0) {
228                    buf.append("\n");
229                }
230                buf.append(url.toString());
231            }
232            return buf.toString();
233        }
234    }