org.nuxeo.theme.webwidgets.Manager.java Source code

Java tutorial

Introduction

Here is the source code for org.nuxeo.theme.webwidgets.Manager.java

Source

/*
 * (C) Copyright 2006-2007 Nuxeo SAS <http://nuxeo.com> and others
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Jean-Marc Orliaguet, Chalmers
 *
 * $Id$
 */

package org.nuxeo.theme.webwidgets;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuxeo.ecm.core.api.ClientRuntimeException;
import org.nuxeo.runtime.api.Framework;
import org.nuxeo.theme.elements.Element;
import org.nuxeo.theme.themes.ThemeManager;

public class Manager {

    private static final Log log = LogFactory.getLog(Manager.class);

    // Utility class.
    private Manager() {
    }

    public static Service getService() {
        return (Service) Framework.getRuntime().getComponent(Service.ID);
    }

    public static List<String> getProviderNames() {
        return getService().getProviderNames();
    }

    public static Provider getProvider(String name) throws WidgetException {
        return getService().getProvider(name);
    }

    public static AreaFragment getAreaById(int area) throws WidgetException {
        org.nuxeo.theme.Manager.getThemeManager();
        Element element = ThemeManager.getElementById(area);
        if (!(element instanceof AreaFragment)) {
            throw new WidgetException("Could not find area fragment");
        }
        return (AreaFragment) element;
    }

    public static ProviderType getProviderType(String name) {
        return getService().getProviderType(name);
    }

    public static List<String> getDecorationNames() {
        return getService().getDecorationNames();
    }

    public static DecorationType getDecorationType(String name) {
        return getService().getDecorationType(name);
    }

    public static WidgetType getWidgetType(String widgetTypeName) {
        return getService().getWidgetType(widgetTypeName);
    }

    public static Map<String, String> getWidgetDecoration(String decorationName) {
        final Map<String, String> data = new HashMap<String, String>();
        final DecorationType decorationType = Manager.getDecorationType(decorationName);
        if (decorationType != null) {
            for (String mode : decorationType.getWindowDecorationModes()) {
                data.put(mode, decorationType.getWidgetDecoration(mode).getContent());
            }
        } else {
            log.error("Decoration not found: " + decorationName);
        }
        return data;
    }

    public static String addPanelDecoration(String decorationName, String mode, String regionName, String content) {
        String html = getService().getPanelDecoration(decorationName, mode);
        html = html.replaceAll("%REGION_NAME%", regionName);
        html = html.replaceAll("%REGION_BODY%", content);
        return html.trim();
    }

    public static void addWidget(int area, String widgetTypeName, int order)
            throws WidgetException, ProviderException {
        AreaFragment areaFragment = getAreaById(area);

        String providerName = areaFragment.getProviderName();
        Provider provider = getProvider(providerName);
        if (!provider.canWrite()) {
            throw new WidgetException("No permission to add widget into: " + providerName);
        }

        List<Widget> widgets = provider.getWidgets(areaFragment.getRegionName());

        Integer maxItems = areaFragment.getMaxItems();
        if (maxItems != null && maxItems > 0) {
            if (widgets.size() >= maxItems) {
                throw new WidgetException(String.format("At most %s widget(s) are allowed.", maxItems));
            }
        }

        Boolean disallowDuplicates = areaFragment.getDisallowDuplicates();
        if (Boolean.TRUE.equals(disallowDuplicates)) {
            for (Widget w : widgets) {
                if (widgetTypeName.equals(w.getName())) {
                    throw new WidgetException(String.format("Only one '%s' widget is allowed.", widgetTypeName));
                }
            }
        }

        Widget widget = provider.createWidget(widgetTypeName);
        provider.addWidget(widget, areaFragment.getRegionName(), order);
    }

    public static String moveWidget(int srcArea, String srcUid, int destArea, int destOrder)
            throws WidgetException, ProviderException {
        AreaFragment srcAreaFragment = getAreaById(srcArea);
        AreaFragment destAreaFragment = getAreaById(destArea);
        String srcProviderName = srcAreaFragment.getProviderName();
        String destProviderName = destAreaFragment.getProviderName();
        String srcRegionName = srcAreaFragment.getRegionName();
        String destRegionName = destAreaFragment.getRegionName();

        Provider srcProvider = getProvider(srcProviderName);
        Provider destProvider = getProvider(destProviderName);
        if (!srcProvider.canWrite() || !destProvider.canWrite()) {
            throw new WidgetException("No permission to move widget.");
        }
        if (srcRegionName == null || destRegionName == null) {
            throw new WidgetException("Source or destination region is undefined.");
        }

        Widget srcWidget = srcProvider.getWidgetByUid(srcUid);

        if (!destRegionName.equals(srcRegionName)) {
            List<Widget> widgets = destProvider.getWidgets(destAreaFragment.getRegionName());
            Integer maxItems = destAreaFragment.getMaxItems();
            if (maxItems != null) {
                if (widgets.size() >= maxItems) {
                    throw new WidgetException(String.format("Max %s item(s) are allowed.", maxItems));
                }
            }
            Boolean disallowDuplicates = destAreaFragment.getDisallowDuplicates();
            if (Boolean.TRUE.equals(disallowDuplicates)) {
                String widgetTypeName = srcWidget.getName();
                for (Widget w : widgets) {
                    if (widgetTypeName.equals(w.getName())) {
                        throw new WidgetException(
                                String.format("Only one '%s' widget is allowed.", widgetTypeName));
                    }
                }
            }
        }

        String newId = srcWidget.getUid();

        // The destination provider is the same as the source provider
        if (destProviderName.equals(srcProviderName)) {
            // The widget is moved inside the same region
            if (destRegionName.equals(srcRegionName)) {
                srcProvider.reorderWidget(srcWidget, destOrder);
            } else {
                srcProvider.moveWidget(srcWidget, destRegionName, destOrder);
            }
            // The destination provider is different from the source
            // provider, the widget must be duplicated.
        } else {
            Widget destWidget = destProvider.createWidget(srcWidget.getName());
            setWidgetPreferences(destProvider, destWidget, getWidgetPreferences(srcProvider, srcWidget));
            setWidgetState(destProvider, destWidget, getWidgetState(srcProvider, srcWidget));
            destProvider.addWidget(destWidget, destRegionName, destOrder);
            srcProvider.removeWidget(srcWidget);
            newId = destWidget.getUid();
        }
        return newId;
    }

    public static void removeWidget(String providerName, String uid) throws WidgetException, ProviderException {
        Provider provider = getProvider(providerName);
        if (!provider.canWrite()) {
            return;
        }
        Widget widget = provider.getWidgetByUid(uid);
        provider.deleteWidgetData(widget);
        provider.removeWidget(widget);
    }

    /*
     * Widget preferences
     */
    public static Map<String, String> getWidgetPreferences(Provider provider, Widget widget)
            throws ProviderException {
        Map<String, String> widgetPreferences = new HashMap<String, String>();
        if (provider.canRead()) {
            Map<String, String> preferences = provider.getWidgetPreferences(widget);
            if (preferences != null) {
                widgetPreferences.putAll(preferences);
            }

            final String widgetTypeName = widget.getName();
            WidgetType widgetType = getWidgetType(widgetTypeName);

            for (WidgetFieldType fieldType : widgetType.getSchema()) {
                final String name = fieldType.getName();
                if (widgetPreferences.get(name) == null) {
                    widgetPreferences.put(name, fieldType.getDefaultValue());
                }
            }
        }
        return widgetPreferences;
    }

    public static void setWidgetPreferences(Provider provider, Widget widget, Map<String, String> preferences)
            throws ProviderException {
        if (!provider.canWrite()) {
            return;
        }
        if (preferences == null) {
            preferences = new HashMap<String, String>();
        }
        provider.setWidgetPreferences(widget, preferences);
    }

    public static void updateWidgetPreferences(String providerName, String uid, Map<String, String> preferences)
            throws WidgetException, ProviderException {
        Provider provider = getProvider(providerName);
        if (!provider.canWrite()) {
            return;
        }
        Widget widget = provider.getWidgetByUid(uid);
        Map<String, String> newPreferences = new HashMap<String, String>();
        Map<String, String> oldPreferences = provider.getWidgetPreferences(widget);
        if (oldPreferences != null) {
            newPreferences.putAll(oldPreferences);
        }
        newPreferences.putAll(preferences);
        provider.setWidgetPreferences(widget, newPreferences);
    }

    public static void setWidgetPreference(String providerName, String uid, String name, String value)
            throws WidgetException, ProviderException {
        Provider provider = getProvider(providerName);
        if (!provider.canWrite()) {
            return;
        }
        Widget widget = provider.getWidgetByUid(uid);
        Map<String, String> newPreferences = new HashMap<String, String>();
        Map<String, String> oldPreferences = provider.getWidgetPreferences(widget);
        if (oldPreferences != null) {
            newPreferences.putAll(oldPreferences);
        }
        newPreferences.put(name, value);
        provider.setWidgetPreferences(widget, newPreferences);
    }

    /*
     * Widget state
     */
    public static void setWidgetState(Provider provider, Widget widget, WidgetState state)
            throws ProviderException {
        if (!provider.canWrite()) {
            return;
        }
        if (state == null) {
            state = WidgetState.DEFAULT;
        }
        provider.setWidgetState(widget, state);
    }

    public static void setWidgetState(String providerName, String uid, String stateName)
            throws WidgetException, ProviderException {
        Provider provider = getProvider(providerName);
        if (!provider.canWrite()) {
            return;
        }
        Widget widget = provider.getWidgetByUid(uid);
        for (WidgetState state : WidgetState.values()) {
            if (state.getName().equals(stateName)) {
                provider.setWidgetState(widget, state);
                return;
            }
        }
        provider.setWidgetState(widget, WidgetState.DEFAULT);
    }

    public static WidgetState getWidgetState(Provider provider, Widget widget) throws ProviderException {
        if (provider.canRead()) {
            WidgetState state = provider.getWidgetState(widget);
            if (state != null) {
                return state;
            }
        }
        return WidgetState.DEFAULT;
    }

    /*
     * Widget data
     */

    public static void setWidgetData(String providerName, String uid, String dataName, WidgetData data)
            throws WidgetException, ProviderException {
        final Provider provider = getProvider(providerName);
        final Widget widget = provider.getWidgetByUid(uid);
        provider.setWidgetData(widget, dataName, data);
    }

    public static void setWidgetData(Provider provider, Widget widget, String dataName, WidgetData data)
            throws ProviderException {
        if (provider.canWrite()) {
            provider.setWidgetData(widget, dataName, data);
        }
    }

    public static WidgetData getWidgetData(String providerName, String uid, String dataName)
            throws WidgetException, ProviderException {
        final Provider provider = getProvider(providerName);
        if (!provider.canRead()) {
            throw new WidgetException("Cannot read content of widget provider: " + providerName);
        }
        final Widget widget = provider.getWidgetByUid(uid);
        return getWidgetData(provider, widget, dataName);
    }

    public static WidgetData getWidgetData(Provider provider, Widget widget, String dataName)
            throws ProviderException {
        if (provider.canRead()) {
            final WidgetData data = provider.getWidgetData(widget, dataName);
            if (data != null) {
                return data;
            }
        }
        return null;
    }

    public static String uploadFile(HttpServletRequest request, String providerName, String uid, String dataName)
            throws WidgetException, ProviderException {
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        List<?> fileItems = null;
        try {
            fileItems = upload.parseRequest(request);
        } catch (FileUploadException e) {
            log.error("Could not upload file", e);
        }
        if (fileItems == null) {
            log.error("No file upload found.");
            return "";
        }
        WidgetData data = null;
        Iterator<?> it = fileItems.iterator();
        if (it.hasNext()) {
            FileItem fileItem = (FileItem) it.next();
            if (!fileItem.isFormField()) {
                /* The file item contains an uploaded file */
                final String contentType = fileItem.getContentType();
                final byte[] fileData = fileItem.get();
                final String filename = fileItem.getName();
                data = new WidgetData(contentType, filename, fileData);
            }
        }
        Manager.setWidgetData(providerName, uid, dataName, data);
        return String.format(
                "<script type=\"text/javascript\">window.parent.NXThemesWebWidgets.getUploader('%s', '%s', '%s').complete();</script>",
                providerName, uid, dataName);
    }

    public static String getWidgetDataContent(String providerName, String uid, String dataName)
            throws WidgetException, ProviderException {
        WidgetData data = getWidgetData(providerName, uid, dataName);
        if (data == null) {
            return "";
        }
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        try {
            os.write(data.getContent());
        } catch (IOException e) {
            log.error(e);
        }
        return os.toString();
    }

    public static String getWidgetDataInfo(String providerName, String uid, String dataName)
            throws WidgetException, ProviderException {
        final WidgetData data = getWidgetData(providerName, uid, dataName);
        if (data != null) {
            final Map<String, String> fileInfo = new HashMap<String, String>();
            fileInfo.put("content-type", data.getContentType());
            fileInfo.put("filename", data.getFilename());
            return org.nuxeo.theme.html.Utils.toJson(fileInfo);
        }
        return null;
    }

    /*
     * UI
     */
    public static String getPanelData(int area, String mode) throws WidgetException, ProviderException {
        final AreaFragment areaFragment = getAreaById(area);
        final String providerName = areaFragment.getProviderName();
        final String regionName = areaFragment.getRegionName();
        final Provider provider = getProvider(providerName);
        final String decoration = areaFragment.getDecoration();
        final Map<String, Object> data = new HashMap<String, Object>();
        final List<Map<String, Object>> items = new ArrayList<Map<String, Object>>();
        final Map<String, Map<String, Object>> types = new HashMap<String, Map<String, Object>>();

        if (provider == null) {
            throw new WidgetException("Provider not found: " + providerName);
        }

        final List<Widget> widgets = provider.getWidgets(regionName);
        final Set<String> widgetTypeNames = new HashSet<String>();
        if (widgets != null) {
            for (Widget widget : widgets) {
                widgetTypeNames.add(widget.getName());
            }

            for (String widgetTypeName : widgetTypeNames) {
                WidgetType widgetType = getWidgetType(widgetTypeName);
                types.put(widgetTypeName, widgetType.getInfo());
            }

            if (provider.canRead()) {
                for (Widget widget : widgets) {
                    final Map<String, Object> item = new HashMap<String, Object>();
                    item.put("uid", widget.getUid());
                    item.put("name", widget.getName());
                    item.put("preferences", getWidgetPreferences(provider, widget));
                    item.put("state", getWidgetState(provider, widget).getName());
                    items.add(item);
                }
            }
        }

        // Switch to default read mode if the user does not have write access.
        if (!provider.canWrite()) {
            mode = "*";
        }
        data.put("mode", mode);
        data.put("provider", providerName);
        data.put("region", regionName);
        data.put("decoration", decoration);
        data.put("widget_decoration", Manager.getWidgetDecoration(decoration));
        data.put("widget_types", types);
        data.put("widget_items", items);
        return org.nuxeo.theme.html.Utils.toJson(data);
    }

    public static String getWidgetIconPath(final String widgetTypeName) {
        WidgetType widgetType = getWidgetType(widgetTypeName);
        String iconResourcePath = null;
        if (widgetType != null) {
            iconResourcePath = widgetType.getIconPath();
        }
        if (iconResourcePath == null) {
            iconResourcePath = "nxthemes/html/icons/no-icon.png";
        }
        return iconResourcePath;
    }

    public static byte[] getWidgetIconContent(final String widgetTypeName) {
        String iconResourcePath = getWidgetIconPath(widgetTypeName);
        try {
            return org.nuxeo.theme.Utils.readResourceAsBytes(iconResourcePath);
        } catch (IOException e) {
            throw new ClientRuntimeException(e);
        }
    }
}