001 /*
002 * Sonar, open source software quality management tool.
003 * Copyright (C) 2008-2012 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * Sonar is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * Sonar is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public
017 * License along with Sonar; if not, write to the Free Software
018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
019 */
020 package org.sonar.server.startup;
021
022 import org.apache.commons.io.FileUtils;
023 import org.apache.commons.lang.StringUtils;
024 import org.slf4j.Logger;
025 import org.slf4j.LoggerFactory;
026 import org.sonar.api.config.Settings;
027 import org.sonar.api.utils.Logs;
028 import org.sonar.api.utils.SonarException;
029 import org.sonar.api.utils.TimeProfiler;
030 import org.sonar.api.utils.ZipUtils;
031 import org.sonar.api.web.GwtExtension;
032 import org.sonar.server.platform.ServerSettings;
033
034 import java.io.File;
035 import java.io.IOException;
036 import java.net.URI;
037 import java.net.URISyntaxException;
038 import java.net.URL;
039 import java.util.zip.ZipEntry;
040
041 public class GwtPublisher {
042 private static final Logger LOG = LoggerFactory.getLogger(GwtPublisher.class);
043
044 private Settings settings;
045 private GwtExtension[] extensions = null;
046 private File outputDir = null;
047
048 public GwtPublisher(GwtExtension[] extensions, Settings settings) {
049 this.extensions = extensions;
050 this.settings = settings;
051 }
052
053 GwtPublisher(GwtExtension[] extensions, File outputDir) {
054 this.extensions = extensions;
055 this.outputDir = outputDir;
056 }
057
058 GwtPublisher() {
059 }
060
061 public void start() {
062 TimeProfiler profiler = new TimeProfiler().start("Deploy GWT plugins");
063 try {
064 cleanDirectory();
065 this.outputDir = new File(settings.getString(ServerSettings.DEPLOY_DIR), "gwt");
066 Logs.INFO.debug("publish {} GWT extensions to {}", extensions.length, outputDir);
067 publish();
068
069 } catch (Exception e) {
070 throw new SonarException("can not publish GWT extensions", e);
071 }
072 profiler.stop();
073 }
074
075 protected void cleanDirectory() {
076 try {
077 if (outputDir != null && outputDir.exists()) {
078 File[] files = outputDir.listFiles();
079 if (files != null) {
080 for (File file : files) {
081 // avoid issues with SCM hidden dirs
082 if (!file.isHidden()) {
083 if (file.isDirectory()) {
084 FileUtils.deleteDirectory(file);
085 FileUtils.deleteDirectory(file);
086 } else {
087 file.delete();
088 }
089 }
090 }
091 }
092 }
093
094 } catch (IOException e) {
095 LOG.warn("can not clean the directory " + outputDir, e);
096 }
097 }
098
099 protected void publish() throws IOException, URISyntaxException {
100 for (final GwtExtension module : extensions) {
101 URL sourceDir = module.getClass().getResource("/" + module.getGwtId() + "/");
102 if (sourceDir == null) {
103 throw new SonarException("Can not find the directory " + module.getGwtId() + " defined by the GWT module " + module.getClass().getName());
104 }
105 Logs.INFO.info("publish {} to {}", module.getGwtId(), outputDir);
106 if (sourceDir.toString().startsWith("jar:file")) {
107 // unzip the JAR
108 String path = StringUtils.substringBetween(sourceDir.toString(), "jar:file:", "!");
109 File gwtJar = new File(getCleanPath(path));
110 ZipUtils.unzip(gwtJar, outputDir, new ZipUtils.ZipEntryFilter() {
111 public boolean accept(ZipEntry entry) {
112 return entry.getName().startsWith(module.getGwtId());
113 }
114 });
115 } else {
116 // just copy the files
117 File source = new File(sourceDir.toURI());
118 FileUtils.copyDirectory(source, new File(outputDir, module.getGwtId()));
119 }
120 }
121 }
122
123 protected String getCleanPath(String path) throws URISyntaxException {
124 return new URI(path).getPath();
125 }
126 }