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.BufferedReader;
020    import java.io.IOException;
021    import java.io.StringReader;
022    import java.util.ArrayList;
023    import java.util.List;
024    
025    import javax.portlet.ActionRequest;
026    import javax.portlet.ActionResponse;
027    import javax.portlet.PortletException;
028    import javax.portlet.RenderRequest;
029    import javax.portlet.RenderResponse;
030    import javax.portlet.WindowState;
031    
032    import org.apache.commons.logging.Log;
033    import org.apache.commons.logging.LogFactory;
034    import org.apache.geronimo.console.MultiPageModel;
035    import org.apache.geronimo.console.util.PortletManager;
036    import org.apache.geronimo.kernel.repository.Artifact;
037    import org.apache.geronimo.kernel.repository.Dependency;
038    import org.apache.geronimo.kernel.repository.ImportType;
039    import org.apache.geronimo.system.plugin.PluginInstallerGBean;
040    import org.apache.geronimo.system.plugin.PluginInstaller;
041    import org.apache.geronimo.system.plugin.model.ArtifactType;
042    import org.apache.geronimo.system.plugin.model.DependencyType;
043    import org.apache.geronimo.system.plugin.model.LicenseType;
044    import org.apache.geronimo.system.plugin.model.PluginArtifactType;
045    import org.apache.geronimo.system.plugin.model.PluginType;
046    import org.apache.geronimo.system.plugin.model.PrerequisiteType;
047    
048    /**
049     * Handler for the screen where you configure plugin data before exporting
050     *
051     * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
052     */
053    public class ExportConfigHandler extends BaseImportExportHandler {
054        private final static Log log = LogFactory.getLog(ExportConfigHandler.class);
055    
056        public ExportConfigHandler() {
057            super(CONFIGURE_EXPORT_MODE, "/WEB-INF/view/car/pluginParams.jsp");
058        }
059    
060        public String actionBeforeView(ActionRequest request, ActionResponse response, MultiPageModel model) throws PortletException, IOException {
061            String configId = request.getParameter("configId");
062            if (configId != null) {
063                response.setRenderParameter("configId", configId);
064            }
065            
066            response.setWindowState(WindowState.MAXIMIZED);
067            
068            return getMode();
069        }
070    
071        public void renderView(RenderRequest request, RenderResponse response, MultiPageModel model) throws PortletException, IOException {
072            String configId = request.getParameter("configId");
073            PluginInstaller pluginInstaller = ManagementHelper.getManagementHelper(request).getPluginInstaller();
074            Artifact newArtifact = Artifact.create(configId);  
075            PluginType metadata = pluginInstaller.getPluginMetadata(newArtifact);  
076            PluginArtifactType instance = metadata.getPluginArtifact().get(0);
077            request.setAttribute("configId", PluginInstallerGBean.toArtifact(instance.getModuleId()).toString());
078            request.setAttribute("name", metadata.getName());
079            request.setAttribute("repository", combine(instance.getSourceRepository()));
080            request.setAttribute("category", metadata.getCategory());
081            request.setAttribute("url", metadata.getUrl());
082            request.setAttribute("author", metadata.getAuthor());
083            request.setAttribute("description", metadata.getDescription());
084            List<LicenseType> licenses = metadata.getLicense();
085            if (licenses != null && licenses.size() > 0) {
086                request.setAttribute("license", licenses.get(0).getValue());
087                if (licenses.get(0).isOsiApproved()) {
088                    request.setAttribute("licenseOSI", "true");
089                }
090                if (licenses.size() > 1) {
091                    log.warn(
092                            "Unable to edit plugin metadata containing more than one license!  Additional license data will not be editable.");
093                }
094            }
095            //Choose the first geronimo-versions element and set the config version element to that version number.
096            List<String> gerVers = instance.getGeronimoVersion();
097            if (gerVers != null && gerVers.size() > 0) {
098                request.setAttribute("geronimoVersion", gerVers.get(0));
099            }
100            request.setAttribute("jvmVersions", combine(instance.getJvmVersion()));
101            request.setAttribute("dependencies", toString(instance.getDependency()));
102            request.setAttribute("obsoletes", toString(instance.getObsoletes()));
103            List<PrerequisiteType> reqs = instance.getPrerequisite();
104            if (reqs != null && reqs.size() > 0) {
105                int i = 1;
106                for (PrerequisiteType prereq: reqs) {
107                    String prefix = "prereq" + i;
108                    request.setAttribute(prefix, PluginInstallerGBean.toArtifact(prereq.getId()).toString());
109                    request.setAttribute(prefix + "type", prereq.getResourceType());
110                    request.setAttribute(prefix + "desc", prereq.getDescription());
111                }
112                if (reqs.size() > 3) {
113                    log.warn("Unable to edit plugin metadata containing more than three prerequisites!  Additional prereqs will not be editable.");
114                }
115            }
116        }
117    
118        public String actionAfterView(ActionRequest request, ActionResponse response, MultiPageModel model) throws PortletException, IOException {
119            String configId = request.getParameter("configId");
120            PluginInstaller pluginInstaller = ManagementHelper.getManagementHelper(request).getPluginInstaller();
121            PluginType metadata = pluginInstaller.getPluginMetadata(Artifact.create(configId));
122            PluginArtifactType instance = metadata.getPluginArtifact().get(0);
123    
124            String name = request.getParameter("name");
125            metadata.setName(name);
126            metadata.setCategory(request.getParameter("category"));
127            metadata.setUrl(request.getParameter("url"));
128            metadata.setAuthor(request.getParameter("author"));
129            metadata.setDescription(request.getParameter("description"));
130            String licenseString = request.getParameter("license");
131            String osi = request.getParameter("licenseOSI");
132            List<LicenseType> licenses = metadata.getLicense();
133            if (!licenses.isEmpty()) {
134                licenses.remove(0);
135            }
136            if (licenseString != null && !licenseString.trim().equals("")) {
137                LicenseType license = new LicenseType();
138                license.setValue(licenseString.trim());
139                license.setOsiApproved(osi != null && !osi.equals(""));
140                licenses.add(0, license);
141            }
142    
143            String jvmsString = request.getParameter("jvmVersions");
144            split(jvmsString, instance.getJvmVersion());
145    
146            String deps = request.getParameter("dependencies");
147            toDependencies(split(deps), instance.getDependency());
148    
149            String obsoletes = request.getParameter("obsoletes");
150            toArtifacts(split(obsoletes), instance.getObsoletes());
151    
152            String repo = request.getParameter("repository");
153            split(repo, instance.getSourceRepository());
154    
155            //TODO this is wrong, we are only supplying one version to the UI
156            String version = request.getParameter("geronimoVersion");
157            split(version, instance.getGeronimoVersion());
158    
159            List<PrerequisiteType> prereqs = instance.getPrerequisite();
160            //TODO this is probably wrong if # of prereqs is changed.
161            for (int i = 0; i < 3 && !prereqs.isEmpty(); i++) {
162                prereqs.remove(0);
163            }
164            int counter = 1;
165            while (true) {
166                String prefix = "prereq" + counter;
167                ++counter;
168                String id = request.getParameter(prefix);
169                if (id == null || id.trim().equals("")) {
170                    break;
171                }
172                String type = request.getParameter(prefix + "type");
173                String desc = request.getParameter(prefix + "desc");
174                if (type != null && type.trim().equals("")) {
175                    type = null;
176                }
177                if (desc != null && desc.trim().equals("")) {
178                    desc = null;
179                }
180                PrerequisiteType prereq = new PrerequisiteType();
181                prereq.setResourceType(type);
182                prereq.setDescription(desc);
183                prereq.setId(PluginInstallerGBean.toArtifactType(Artifact.create(id)));
184                prereqs.add(counter - 1, prereq);
185            }
186    
187            // Save updated metadata
188            pluginInstaller.updatePluginMetadata(metadata);
189    
190            response.setRenderParameter("configId", configId);
191            response.setRenderParameter("name", name);
192    
193            return CONFIRM_EXPORT_MODE + BEFORE_ACTION;
194        }
195    
196        private List<String> split(String deps) {
197            List<String> split = new ArrayList<String>();
198            if (deps != null && !deps.equals("")) {
199                split(deps, split);
200            }
201            return split;
202        }
203    
204        private void split(String deps, List<String> split) {
205            split.clear();
206            BufferedReader in = new BufferedReader(new StringReader(deps));
207            String line;
208            try {
209                while ((line = in.readLine()) != null) {
210                    line = line.trim();
211                    if (!line.equals("")) {
212                        split.add(line);
213                    }
214                }
215                in.close();
216            } catch (IOException e) {
217                log.error("Unable to parse request arguments", e);
218            }
219        }
220    
221        private String combine(List<String> strings) {
222            if (strings == null || strings.size() == 0) {
223                return null;
224            }
225            StringBuffer buf = new StringBuffer();
226            boolean first = true;
227            for (String string : strings) {
228                if (!first) {
229                    buf.append("\n");
230                }
231                first = false;
232                buf.append(string);
233            }
234            return buf.toString();
235        }
236    
237        private void toArtifacts(List<String> artifacts, List<ArtifactType> result) {
238            result.clear();
239            for (String artifact : artifacts) {
240                result.add(PluginInstallerGBean.toArtifactType(Artifact.create(artifact)));
241            }
242        }
243        private void toDependencies(List<String> artifacts, List<DependencyType> result) {
244            result.clear();
245            for (String artifact : artifacts) {
246                //TODO this is wrong.... need to encode import type as well
247                result.add(PluginInstallerGBean.toDependencyType(new Dependency(Artifact.create(artifact), ImportType.ALL), true));
248            }
249        }
250    
251        private String toString(List<? extends ArtifactType> artifacts) {
252            if (artifacts == null || artifacts.size() == 0) {
253                return null;
254            }
255            StringBuffer buf = new StringBuffer();
256            boolean first = true;
257            for (ArtifactType artifactType : artifacts) {
258                if (!first) {
259                    buf.append("\n");
260                }
261                first = false;
262                buf.append(PluginInstallerGBean.toArtifact(artifactType).toString());
263            }
264            return buf.toString();
265         }
266    
267    
268    }