org.jboss.dashboard.workspace.export.WorkspaceBuilder.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.dashboard.workspace.export.WorkspaceBuilder.java

Source

/**
 * Copyright (C) 2012 JBoss Inc
 *
 * 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.
 */
package org.jboss.dashboard.workspace.export;

import org.jboss.dashboard.LocaleManager;
import org.jboss.dashboard.SecurityServices;
import org.jboss.dashboard.database.hibernate.HibernateTxFragment;
import org.jboss.dashboard.commons.xml.XMLNode;
import org.jboss.dashboard.ui.UIServices;
import org.jboss.dashboard.security.Policy;
import org.jboss.dashboard.security.principals.DefaultPrincipal;
import org.jboss.dashboard.workspace.*;
import org.jboss.dashboard.workspace.export.structure.CreateResult;
import org.jboss.dashboard.workspace.*;
import org.jboss.dashboard.security.*;
import org.jboss.dashboard.ui.resources.GraphicElement;
import org.hibernate.Session;

import javax.enterprise.context.ApplicationScoped;
import java.io.ByteArrayInputStream;
import java.lang.reflect.Constructor;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * Class that builds workspaces based on the XML Node received.
 */
@ApplicationScoped
public class WorkspaceBuilder {

    private static transient org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory
            .getLog(WorkspaceBuilder.class.getName());

    public CreateResult create(XMLNode node) {
        return create(node, false);
    }

    public CreateResult create(final XMLNode node, final boolean onStartup) {
        return create(node, Collections.EMPTY_MAP, onStartup);
    }

    public CreateResult create(final XMLNode node, final Map attributes, final boolean onStartup) {
        final CreateResult result = new CreateResult();

        HibernateTxFragment txFragment = new HibernateTxFragment() {
            protected void txFragment(Session session) throws Exception {
                if (ExportVisitor.WORKSPACE.equals(node.getObjectName())) {
                    createWorkspace(result, node, attributes, onStartup);
                } else if (ExportVisitor.RESOURCE.equals(node.getObjectName())) {
                    createResource(result, null, null, null, node, attributes, onStartup);
                } else {
                    throw new IllegalArgumentException("Invalid workspace node.");
                }
            }
        };
        try {
            txFragment.execute();
        } catch (Exception e) {
            log.error("Error:", e);
            return new CreateResult(e);
        }
        return result;
    }

    protected void createWorkspace(CreateResult result, Map attributes, XMLNode node) throws Exception {
        createWorkspace(result, node, attributes, false);
    }

    protected void createWorkspace(CreateResult result, XMLNode node, Map attributes, boolean onStartup)
            throws Exception {
        String workspaceId = node.getAttributes().getProperty(ExportVisitor.WORKSPACE_ATTR_ID);
        String skinId = node.getAttributes().getProperty(ExportVisitor.WORKSPACE_ATTR_SKIN_ID);
        String envelopeId = node.getAttributes().getProperty(ExportVisitor.WORKSPACE_ATTR_ENVELOPE_ID);
        String friendlyUrl = node.getAttributes().getProperty(ExportVisitor.WORKSPACE_ATTR_FR_URL);
        String homeMode = node.getAttributes().getProperty(ExportVisitor.WORKSPACE_ATTR_HOME_MODE);

        WorkspacesManager workspacesManager = UIServices.lookup().getWorkspacesManager();
        synchronized (workspacesManager) {
            if (workspacesManager.existsWorkspace(workspaceId)) {
                workspaceId = workspacesManager.generateWorkspaceId();
                result.getWarnings().add("workspaceIdChanged");
                result.getWarningArguments()
                        .add(new String[] { workspaceId, workspaceId = workspacesManager.generateWorkspaceId() });
            }
            if (friendlyUrl != null && workspacesManager.getWorkspaceByUrl(friendlyUrl) != null) {
                result.getWarnings().add("workspaceUrlChanged");
                result.getWarningArguments().add(new String[] { friendlyUrl });
                friendlyUrl = null;
            }
        }
        log.debug("Creando workspace " + workspaceId);
        final WorkspaceImpl workspace = new WorkspaceImpl();
        workspace.setId(workspaceId);
        workspace.setSkinId(skinId);
        workspace.setEnvelopeId(envelopeId);
        workspace.setFriendlyUrl(friendlyUrl);
        workspace.setHomeSearchMode(Integer.parseInt(homeMode));
        // TODO. Modify export format so it can be read from them
        Set allowedPanels = new HashSet();
        if (onStartup)
            allowedPanels.add("*");
        workspace.setPanelProvidersAllowed(allowedPanels);

        synchronized (workspacesManager) {
            if (onStartup)
                workspacesManager.addNewWorkspace(workspace);
            else
                workspacesManager.addNewWorkspace(workspace);
        }

        //Children
        for (int i = 0; i < node.getChildren().size(); i++) {
            XMLNode child = (XMLNode) node.getChildren().get(i);
            if (ExportVisitor.PARAMETER.equals(child.getObjectName())) {
                createWorkspaceParameter(child, workspace);
            } else if (ExportVisitor.PANEL_INSTANCE.equals(child.getObjectName())) {
                createPanelInstance(result, child, workspace, attributes, onStartup);
            } else if (ExportVisitor.RESOURCE.equals(child.getObjectName())) {
                createResource(result, workspace.getId(), null, null, child, attributes, onStartup);
            } else if (ExportVisitor.SECTION.equals(child.getObjectName())) {
                createSection(result, workspace, child, attributes, onStartup);
            } else if (ExportVisitor.PERMISSION.equals(child.getObjectName())) {
                createPermission(result, workspace, workspace, child, attributes);
            }
        }
        workspacesManager.store(workspace);
        //Save the policy, as probably everybody modified it...
        Policy securityPolicy = SecurityServices.lookup().getSecurityPolicy();
        securityPolicy.save();

        result.setObjectCreated(workspace);
    }

    protected void createPermission(CreateResult result, Workspace workspace, Object resource, XMLNode node,
            Map attributes) throws Exception {
        String actions = node.getAttributes().getProperty(ExportVisitor.PERMISSION_ATTR_ACTIONS);
        String permClass = node.getAttributes().getProperty(ExportVisitor.PERMISSION_ATTR_PERMISSION_CLASS);
        String principalName = node.getAttributes().getProperty(ExportVisitor.PERMISSION_ATTR_PRINCIPAL);
        String principalClass = node.getAttributes().getProperty(ExportVisitor.PERMISSION_ATTR_PRINCIPAL_CLASS);
        String readonly = node.getAttributes().getProperty(ExportVisitor.PERMISSION_ATTR_READONLY);

        UIPermission permission = null;
        if (WorkspacePermission.class.getName().equals(permClass)) {
            permission = WorkspacePermission.newInstance(resource, actions);
        } else if (SectionPermission.class.getName().equals(permClass)) {
            permission = SectionPermission.newInstance(resource, actions);
        } else if (PanelPermission.class.getName().equals(permClass)) {
            permission = PanelPermission.newInstance(resource, actions);
        }

        if (principalClass.equals("org.jboss.dashboard.security.UserPrincipal")) {
            principalClass = "org.jboss.dashboard.security.principals.UserPrincipal";
        } else if (principalClass.equals("org.jboss.dashboard.security.UserGroupPrincipal")) {
            principalClass = "org.jboss.dashboard.security.principals.UserGroupPrincipal";
        } else if (principalClass.equals("org.jboss.dashboard.security.BehaviourPrincipal")) {
            principalClass = "org.jboss.dashboard.security.principals.UserGroupPrincipal";
        }

        principalName = transformPrincipalName(principalName, principalClass, attributes);
        permission.setReadOnly(readonly != null && readonly.equals("true"));

        Constructor principalConstructor = Class.forName(principalClass)
                .getConstructor(new Class[] { String.class });
        DefaultPrincipal principal = (DefaultPrincipal) principalConstructor
                .newInstance(new Object[] { principalName });
        Policy securityPolicy = SecurityServices.lookup().getSecurityPolicy();
        securityPolicy.addPermission(principal, permission);
        securityPolicy.save();
    }

    /**
     * Transforms the principal name, as it might be modified (group, role, ...)
     *
     * @param principalName
     * @param principalClass
     * @param attributes
     * @return
     */
    protected String transformPrincipalName(String principalName, String principalClass, Map attributes) {
        return principalName; //Default implementation leaves it unchanged.
    }

    protected void createSection(CreateResult result, WorkspaceImpl workspace, XMLNode node, Map attributes,
            boolean onStartup) throws Exception {
        String id = node.getAttributes().getProperty(ExportVisitor.SECTION_ATTR_ID);
        String idTemplate = node.getAttributes().getProperty(ExportVisitor.SECTION_ATTR_ID_TEMPLATE);
        String position = node.getAttributes().getProperty(ExportVisitor.SECTION_ATTR_POSITION);
        String visible = node.getAttributes().getProperty(ExportVisitor.SECTION_ATTR_VISIBLE);
        String regionSpacing = node.getAttributes().getProperty(ExportVisitor.SECTION_ATTR_REGIONSPACING);
        String panelSpacing = node.getAttributes().getProperty(ExportVisitor.SECTION_ATTR_PANELSPACING);
        String parentId = node.getAttributes().getProperty(ExportVisitor.SECTION_ATTR_PARENT_ID);
        String friendlyUrl = node.getAttributes().getProperty(ExportVisitor.SECTION_ATTR_FR_URL);
        String idSkin = node.getAttributes().getProperty(ExportVisitor.SECTION_ATTR_SKIN_ID);
        String idEnvelope = node.getAttributes().getProperty(ExportVisitor.SECTION_ATTR_ENVELOPE_ID);

        Section section = new Section();
        section.setId(Long.decode(id));
        section.setLayoutId(idTemplate);
        section.setPosition(Integer.decode(position).intValue());
        section.setVisible(Boolean.valueOf(visible));
        section.setRegionsCellSpacing(Integer.decode(regionSpacing));
        section.setPanelsCellSpacing(Integer.decode(panelSpacing));
        if (parentId != null)
            section.setParentSectionId(Long.decode(parentId));
        section.setFriendlyUrl(friendlyUrl);
        section.setSkinId(idSkin);
        section.setEnvelopeId(idEnvelope);
        section.setWorkspace(workspace);
        UIServices.lookup().getSectionsManager().store(section);
        workspace.addSection(section);
        UIServices.lookup().getWorkspacesManager().store(workspace);

        //Children
        for (int i = 0; i < node.getChildren().size(); i++) {
            XMLNode child = (XMLNode) node.getChildren().get(i);
            if (ExportVisitor.PARAMETER.equals(child.getObjectName())) {
                String name = child.getAttributes().getProperty(ExportVisitor.PARAMETER_ATTR_NAME);
                if (ExportVisitor.SECTION_CHILD_TITLE.equals(name)) {
                    String value = child.getAttributes().getProperty(ExportVisitor.PARAMETER_ATTR_VALUE);
                    String lang = child.getAttributes().getProperty(ExportVisitor.PARAMETER_ATTR_LANG);
                    section.setTitle(value, lang);
                }
            } else if (ExportVisitor.RESOURCE.equals(child.getObjectName())) {
                createResource(result, workspace.getId(), section.getId(), null, child, attributes, onStartup);
            } else if (ExportVisitor.PANEL.equals(child.getObjectName())) {
                createPanel(result, section, child, attributes, onStartup);
            } else if (ExportVisitor.PERMISSION.equals(child.getObjectName())) {
                createPermission(result, section.getWorkspace(), section, child, attributes);
            }
        }
    }

    protected void createPanel(CreateResult result, Section section, XMLNode node, Map attributes,
            boolean onStartup) throws Exception {
        String id = node.getAttributes().getProperty(ExportVisitor.PANEL_ATTR_ID);
        String instanceId = node.getAttributes().getProperty(ExportVisitor.PANEL_ATTR_INSTANCE_ID);
        String regionId = node.getAttributes().getProperty(ExportVisitor.PANEL_ATTR_REGION_ID);
        String position = node.getAttributes().getProperty(ExportVisitor.PANEL_ATTR_POSITION);
        Panel panel = new Panel();
        panel.setSection(section);
        panel.setPosition(Integer.decode(position).intValue());
        panel.setPanelId(Long.decode(id));
        panel.setInstanceId(Long.decode(instanceId));
        if (regionId != null) {
            panel.getProvider().getDriver().fireBeforePanelPlacedInRegion(panel,
                    section.getLayout().getRegion(regionId));
            panel.setLayoutRegionId(regionId);
        }
        UIServices.lookup().getPanelsManager().store(panel);
        // Add panel to section
        section.assignPanel(panel, regionId);
        UIServices.lookup().getSectionsManager().store(section);
        panel.getProvider().getDriver().fireAfterPanelPlacedInRegion(panel, null);
        for (int i = 0; i < node.getChildren().size(); i++) {
            XMLNode child = (XMLNode) node.getChildren().get(i);
            if (ExportVisitor.PERMISSION.equals(child.getObjectName())) {
                createPermission(result, panel.getWorkspace(), panel, child, attributes);
            }
        }
    }

    protected void createWorkspaceParameter(XMLNode node, WorkspaceImpl workspace) {
        String paramName = node.getAttributes().getProperty(ExportVisitor.PARAMETER_ATTR_NAME);
        String paramValue = node.getAttributes().getProperty(ExportVisitor.PARAMETER_ATTR_VALUE);
        String paramLang = node.getAttributes().getProperty(ExportVisitor.PARAMETER_ATTR_LANG);
        if (paramLang != null && paramLang.trim().equals(""))
            paramLang = null;
        log.info("Insertando parmetro de workspace: " + paramName + "=" + paramValue + " (" + paramLang + ")");
        if (paramValue != null && paramValue.trim().length() > 0) {
            workspace.getWorkspaceParams().add(new WorkspaceParameter(paramName, workspace, paramLang, paramValue));
        }
    }

    protected void createPanelInstanceParameter(XMLNode node, PanelInstance pi) {
        String paramName = node.getAttributes().getProperty(ExportVisitor.PARAMETER_ATTR_NAME);
        String paramValue = node.getAttributes().getProperty(ExportVisitor.PARAMETER_ATTR_VALUE);
        String paramLang = node.getAttributes().getProperty(ExportVisitor.PARAMETER_ATTR_LANG);
        if (paramLang == null || (paramLang.trim().equals("")))
            paramLang = " ";
        log.info(
                "Insertando parmetro de panelInstance: " + paramName + "=" + paramValue + " (" + paramLang + ")");
        if (paramValue != null && paramValue.trim().length() > 0) {
            pi.setParameterValue(paramName, paramValue, paramLang);
        }
    }

    protected void createResource(CreateResult result, String workspaceId, Long sectionId, Long panelId,
            XMLNode node, Map attributes, boolean onStartup) throws Exception {
        String className = node.getAttributes().getProperty(ExportVisitor.RESOURCE_ATTR_CATEGORY);
        String id = node.getAttributes().getProperty(ExportVisitor.RESOURCE_ATTR_ID);
        byte[] rawContent = ((XMLNode) node.getChildren().get(0)).getContent();

        GraphicElement element = (GraphicElement) Class.forName(className).newInstance();

        if (element.getInstanceManager().getElement(id, workspaceId, sectionId, panelId) != null) {
            log.warn("Refusing to overwrite existing resource with id " + id);
            result.getWarnings().add("refusingOverwriteResource");
            result.getWarningArguments()
                    .add(new Object[] { element.getCategoryName(), id, workspaceId, sectionId, panelId });
        } else {
            element.setId(id);
            element.setWorkspaceId(workspaceId);
            element.setSectionId(sectionId);
            element.setPanelId(panelId);
            element.setZipFile(rawContent);
            element.getInstanceManager().createOrUpdate(element);
            if (workspaceId == null)
                result.setObjectCreated(element);
        }
    }

    protected void createPanelInstance(CreateResult result, XMLNode node, WorkspaceImpl workspace, Map attributes,
            boolean onStartup) throws Exception {
        String id = node.getAttributes().getProperty(ExportVisitor.PANELINSTANCE_ATTR_ID);
        String serialization = node.getAttributes().getProperty(ExportVisitor.PANELINSTANCE_ATTR_SERIALIZATION);
        String provider = node.getAttributes().getProperty(ExportVisitor.PANELINSTANCE_ATTR_PROVIDER);
        log.debug("Adding panelInstance workspaceId=" + workspace.getId() + ", id=" + id + ", type=" + provider);
        PanelInstance pi = new PanelInstance();
        pi.setProviderName(provider);
        if ("?".equals(pi.getProvider().getGroup())) {
            result.getWarnings().add("providerNotFound");
            result.getWarningArguments().add(new Object[] { provider });
        }
        pi.setId(id);
        pi.setPersistence(serialization);
        pi.setWorkspace(workspace);
        UIServices.lookup().getPanelsManager().store(pi);
        pi.init();
        //Children
        for (int i = 0; i < node.getChildren().size(); i++) {
            XMLNode child = (XMLNode) node.getChildren().get(i);
            if (ExportVisitor.PARAMETER.equals(child.getObjectName())) {
                createPanelInstanceParameter(child, pi);
            } else if (ExportVisitor.RESOURCE.equals(child.getObjectName())) {
                createResource(result, workspace.getId(), null, pi.getInstanceId(), child, attributes, onStartup);
            } else if (ExportVisitor.RAWCONTENT.equals(child.getObjectName())) {
                if (pi.getProvider().getDriver() instanceof Exportable) {
                    try {
                        ((Exportable) pi.getProvider().getDriver()).importContent(pi,
                                new ByteArrayInputStream(child.getContent()));
                    } catch (Exception e) {
                        result.getWarnings().add("panelFailedToImport");
                        result.getWarningArguments().add(
                                new Object[] { LocaleManager.lookup().localize(pi.getTitle()), e, e.getMessage() });
                    }
                }
            }
        }
        workspace.addPanelInstance(pi);
        UIServices.lookup().getWorkspacesManager().store(workspace);
    }

}