com.arcusys.liferay.vaadinplugin.util.WidgetsetUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.arcusys.liferay.vaadinplugin.util.WidgetsetUtil.java

Source

package com.arcusys.liferay.vaadinplugin.util;

/*
 * #%L
 * Liferay Vaadin Plugin
 * %%
 * Copyright (C) 2010 - 2013 Vaadin Ltd.
 * Copyright (C) 2013 Arcusys Ltd.
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */

import java.io.*;
import java.net.JarURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import java.util.jar.Manifest;

import org.apache.commons.io.FileUtils;

import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;

public abstract class WidgetsetUtil {
    private static final Log log = LogFactoryUtil.getLog(WidgetsetUtil.class);

    private static final String TMP_DIR_PREFIX = "vaadinws";
    private static final String BCKP_DIR_PREFIX = "vaadinbckp";

    private static final int MAX_NUMBER_OF_WIDGETSET_BACKUPS = 5;

    public static final FilenameFilter JAR_FILES_ONLY = new FilenameFilter() {
        public boolean accept(File dir, String name) {
            return name.endsWith(".jar");
        }
    };

    public static List<VaadinAddonInfo> getAvailableWidgetSets(File dir) {
        List<VaadinAddonInfo> addons = new ArrayList<VaadinAddonInfo>();
        File[] jars = dir.listFiles(JAR_FILES_ONLY);
        for (File jar : jars) {
            includeVaadinAddonJar(jar, addons);
        }
        //        StringBuilder sb = new StringBuilder();
        // sb.append("Widgetsets found:\n");
        // for (String ws : widgetsets.keySet()) {
        // sb.append("\t");
        // sb.append(ws);
        // sb.append(" in ");
        // sb.append(widgetsets.get(ws));
        // sb.append("\n");
        // }
        // System.out.println(sb.toString());
        return addons;
    }

    private static void includeVaadinAddonJar(File file, List<VaadinAddonInfo> addons) {
        try {
            URL url = new URL("file:" + file.getCanonicalPath());
            url = new URL("jar:" + url.toExternalForm() + "!/");
            JarURLConnection conn = (JarURLConnection) url.openConnection();
            JarFile jarFile = conn.getJarFile();
            if (jarFile != null) {
                Manifest manifest = jarFile.getManifest();
                if (manifest == null) {
                    // No manifest so this is not a Vaadin Add-on
                    return;
                }

                Attributes attrs = manifest.getMainAttributes();
                String value = attrs.getValue("Vaadin-Widgetsets");
                if (value != null) {
                    String name = attrs.getValue("Implementation-Title");
                    String version = attrs.getValue("Implementation-Version");
                    if (name == null || version == null) {
                        // A jar file with Vaadin-Widgetsets but name or version
                        // missing. Most probably vaadin.jar itself, skipping it
                        // here
                        return;
                    }

                    List<String> widgetsets = new ArrayList<String>();
                    String[] widgetsetNames = value.split(",");
                    for (String wName : widgetsetNames) {
                        String widgetsetname = wName.trim().intern();
                        if (!widgetsetname.equals("")) {
                            widgetsets.add(widgetsetname);
                        }
                    }

                    if (!widgetsets.isEmpty()) {
                        addons.add(new VaadinAddonInfo(name, version, file, widgetsets));
                    }
                }
            }
        } catch (Exception e) {
            log.warn("Exception trying to include Vaadin Add-ons.", e);
        }

    }

    /**
     * Creates a widgetset .gwt.xml file under a given directory.
     *
     * @param widgetset
     *            the name of Widgetset. For example: com.example.TestWidgetSet
     * @throws java.io.IOException
     */
    public static void createWidgetset(File tmpDir, String widgetset, Set<String> includeWidgetsets)
            throws IOException {

        String dir = widgetset.substring(0, widgetset.lastIndexOf(".")).replace(".",
                ControlPanelPortletUtil.FileSeparator);
        String file = widgetset.substring(widgetset.lastIndexOf(".") + 1, widgetset.length()) + ".gwt.xml";

        File widgetsetDir = new File(tmpDir, dir);
        if (!widgetsetDir.mkdirs()) {
            throw new IOException("Could not create dir: " + widgetsetDir.getAbsolutePath());
        }
        File widgetsetFile = new File(widgetsetDir, file);
        if (!widgetsetFile.createNewFile()) {
            throw new IOException("");
        }

        PrintStream printStream = new PrintStream(new FileOutputStream(widgetsetFile));
        printStream.print("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
                + "<!DOCTYPE module PUBLIC \"-//Google Inc.//DTD "
                + "Google Web Toolkit 1.7.0//EN\" \"http://google"
                + "-web-toolkit.googlecode.com/svn/tags/1.7.0/dis" + "tro-source/core/src/gwt-module.dtd\">\n");
        printStream.print("<module>\n");

        for (String ws : includeWidgetsets) {
            printStream.print("<inherits name=\"" + ws + "\" />\n");
        }

        printStream.print("\n</module>\n");
        printStream.close();
    }

    public static File createTempDir() throws IOException {
        return createTmpWorkDir(TMP_DIR_PREFIX);
    }

    public static File createBackupDir() throws IOException {
        return createTmpWorkDir(BCKP_DIR_PREFIX);
    }

    private static File createTmpWorkDir(String dirName) throws IOException {
        File temp = File.createTempFile(dirName, null);

        if (!temp.delete()) {
            throw new IOException("Could not delete temp file: " + temp.getAbsolutePath());
        }

        if (!temp.mkdir()) {
            throw new IOException("Could not create temp directory: " + temp.getAbsolutePath());
        }

        return temp;
    }

    public static String removeGwtUnitCachePath() throws IOException {

        String unitCachePath = FileUtils.getTempDirectoryPath() + File.separator + "gwt-unitCache";
        File unitCacheDirectory = new File(unitCachePath);
        if (unitCacheDirectory.exists()) {
            FileUtils.deleteDirectory(unitCacheDirectory);
        }
        return unitCachePath;
    }

    public static void backupOldWidgetset(String originalWidgetset) throws IOException {
        File srcDir = new File(originalWidgetset);
        File destDir = new File(originalWidgetset + ".0.bak");
        if (srcDir.exists() || srcDir.isDirectory()) {
            FileUtils.deleteDirectory(destDir);
            FileUtils.moveDirectory(srcDir, destDir);
        }
    }

    public static void rotateWidgetsetBackups(String originalWidgetset) throws IOException {
        for (int i = MAX_NUMBER_OF_WIDGETSET_BACKUPS - 1; i > 0; i--) {
            File srcDir = new File(originalWidgetset + "." + (i - 1) + ".bak");
            File destDir = new File(originalWidgetset + "." + i + ".bak");
            if (srcDir.exists() || srcDir.isDirectory()) {
                FileUtils.deleteDirectory(destDir);
                FileUtils.moveDirectory(srcDir, destDir);
            }
        }
    }
}