Package org.jboss.errai.workspaces.client.framework

Source Code of org.jboss.errai.workspaces.client.framework.WorkspaceBuilder

/*
* Copyright 2009 JBoss, a divison Red Hat, 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.errai.workspaces.client.framework;

import com.google.gwt.core.client.GWT;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Widget;
import org.jboss.errai.bus.client.security.AuthenticationContext;
import org.jboss.errai.bus.client.security.Role;
import org.jboss.errai.bus.client.security.SecurityService;
import org.jboss.errai.workspaces.client.Workspace;
import org.jboss.errai.workspaces.client.api.ResourceFactory;
import org.jboss.errai.workspaces.client.api.Tool;
import org.jboss.errai.workspaces.client.api.ToolSet;
import org.jboss.errai.workspaces.client.api.WidgetProvider;
import org.jboss.errai.workspaces.client.icons.ErraiImageBundle;

import java.util.*;

/**
* Acts as an intermediary between the deferred binding
* and actual assembly of a workspace. Responsible for things
* like ordering of tools.
*/
public class WorkspaceBuilder implements ToolContainer
{

  private static ErraiImageBundle erraiImageBundle = GWT.create(ErraiImageBundle.class);

  protected static List<ToolSet> toBeLoaded = new ArrayList<ToolSet>();
  protected static Map<String, List<ToolProvider>> toBeLoadedGroups = new HashMap<String, List<ToolProvider>>();
  protected static List<String> preferredGroupOrdering = new ArrayList<String>();
  protected static int toolCounter = 0;

  public void setLoginComponent(WidgetProvider loginComponent) {
    //this.loginComponent = loginComponent;
    throw new RuntimeException("Not implemented");
  }

  public void setPreferredGroupOrdering(String[] groups) {
    preferredGroupOrdering.addAll(Arrays.asList(groups));
  }

  public void addToolSet(ToolSet toolSet) {
    toBeLoaded.add(toolSet);
  }

  public void addTool(String group, String name, String icon,
                      boolean multipleAllowed, int priority, WidgetProvider component) {
    if (!toBeLoadedGroups.containsKey(group)) toBeLoadedGroups.put(group, new ArrayList<ToolProvider>());

    final String toolId = createToolId(name);
    Image img = createIcon(name,icon);

    final Tool toolImpl = new ToolImpl(name, toolId, multipleAllowed, img, component);
    ToolProvider provider = new ToolProvider() {
      public Tool getTool() {
        return toolImpl;
      }
    };

    toBeLoadedGroups.get(group).add(provider);
  }

  private String createToolId(String name)
  {
    final String toolId = name.replaceAll(" ", "_") + "." + toolCounter++;
    return toolId;
  }

  private Image createIcon(String toolName, String icon)
  {
    ResourceFactory resourceFactory = GWT.create(ResourceFactory.class);

    Image img;
    ImageResource imgres = resourceFactory.createImage(toolName);

    if(imgres!=null)
      img = new Image(imgres);
    else
      img = new Image(erraiImageBundle.application());

    return img;
  }

  public void addTool(String group, String name, String icon,
                      boolean multipleAllowed, int priority, WidgetProvider component, final String[] renderIfRoles) {
    if (!toBeLoadedGroups.containsKey(group)) toBeLoadedGroups.put(group, new ArrayList<ToolProvider>());

    final String toolId = createToolId(name);
    Image img = createIcon(name, icon);

    final Set<String> requiredRoles = new HashSet<String>();

    for (String role : renderIfRoles) {
      requiredRoles.add(role.trim());
    }


    final Tool toolImpl = new ToolImpl(name, toolId, multipleAllowed, img, component);
    ToolProvider provider = new ToolProvider() {
      public Tool getTool() {

        AuthenticationContext authContext =
            Registry.get(SecurityService.class).getAuthenticationContext();

        boolean isAuthorized = false;

        if(authContext!=null)
        {
          Set<Role> roleSet = authContext.getRoles();
          for(Role assignedRole : roleSet)
          {
            for(String s : requiredRoles)
            {
              if(s.equals(assignedRole.getRoleName()))
                isAuthorized = true;
            }
          }
        }

        if (isAuthorized) {
          return toolImpl;
        } else {
          return null;
        }
      }
    };

    toBeLoadedGroups.get(group).add(provider);
  }

  /**
   * Actual assembly of a workspace instance
   * @param workspace
   */
  public void build(Workspace workspace)
  {
    Set<String> loaded = new HashSet<String>();
    if (!preferredGroupOrdering.isEmpty()) {
      for (final String group : preferredGroupOrdering) {
        if (loaded.contains(group)) continue;

        for (ToolSet ts : toBeLoaded) {
          if (ts.getToolSetName().equals(group)) {
            loaded.add(group);
            workspace.addToolSet(ts);
          }
        }

        if (loaded.contains(group)) continue;

        if (toBeLoadedGroups.containsKey(group)) {
          loaded.add(group);

          final List<Tool> toBeRendered = new ArrayList<Tool>();
          for (ToolProvider provider : toBeLoadedGroups.get(group)) {
            Tool t = provider.getTool();
            if (t != null) {
              toBeRendered.add(t);
            }
          }

          if (!toBeRendered.isEmpty()) {
            ToolSet ts = new ToolSet() {
              public Tool[] getAllProvidedTools() {
                Tool[] toolArray = new Tool[toBeRendered.size()];
                toBeRendered.toArray(toolArray);
                return toolArray;
              }

              public String getToolSetName() {
                return group;
              }

              public Widget getWidget() {
                return null;
              }
            };

            workspace.addToolSet(ts);
          }
        }
      }
    }

    for (ToolSet ts : toBeLoaded) {
      if (loaded.contains(ts.getToolSetName())) continue;
      workspace.addToolSet(ts);
    }

    for (final String group : toBeLoadedGroups.keySet()) {
      if (loaded.contains(group)) continue;

      final List<Tool> toBeRendered = new ArrayList<Tool>();
      for (ToolProvider provider : toBeLoadedGroups.get(group)) {
        Tool t = provider.getTool();
        if (t != null) {
          toBeRendered.add(t);
        }
      }

      if (!toBeRendered.isEmpty()) {

        ToolSet ts = new ToolSet() {
          public Tool[] getAllProvidedTools() {
            Tool[] toolArray = new Tool[toBeRendered.size()];
            toBeRendered.toArray(toolArray);
            return toolArray;
          }

          public String getToolSetName() {
            return group;
          }

          public Widget getWidget() {
            return null;
          }
        };

        workspace.addToolSet(ts);
      }
    }

  }
}
TOP

Related Classes of org.jboss.errai.workspaces.client.framework.WorkspaceBuilder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.