/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* 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.kie.workbench.common.workbench.client.menu;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.LocaleInfo;
import org.dashbuilder.navigation.NavDivider;
import org.dashbuilder.navigation.NavGroup;
import org.dashbuilder.navigation.NavItem;
import org.dashbuilder.navigation.NavTree;
import org.dashbuilder.navigation.workbench.NavWorkbenchCtx;
import org.jboss.errai.common.client.api.Caller;
import org.jboss.errai.ioc.client.container.SyncBeanDef;
import org.jboss.errai.ioc.client.container.SyncBeanManager;
import org.jboss.errai.security.shared.api.Group;
import org.jboss.errai.security.shared.api.Role;
import org.jboss.errai.security.shared.api.identity.User;
import org.jboss.errai.security.shared.service.AuthenticationService;
import org.kie.workbench.common.widgets.client.menu.AboutMenuBuilder;
import org.kie.workbench.common.widgets.client.menu.AppLauncherMenuBuilder;
import org.kie.workbench.common.widgets.client.menu.ResetPerspectivesMenuBuilder;
import org.kie.workbench.common.workbench.client.library.LibraryMonitor;
import org.kie.workbench.common.workbench.client.resources.i18n.DefaultWorkbenchConstants;
import org.uberfire.client.menu.CustomSplashHelp;
import org.uberfire.client.menu.WorkbenchViewModeSwitcherMenuBuilder;
import org.uberfire.client.mvp.AbstractWorkbenchPerspectiveActivity;
import org.uberfire.client.mvp.ActivityManager;
import org.uberfire.client.mvp.PerspectiveActivity;
import org.uberfire.client.mvp.PerspectiveManager;
import org.uberfire.client.views.pfly.menu.UserMenu;
import org.uberfire.client.workbench.widgets.menu.UtilityMenuBar;
import org.uberfire.mvp.Command;
import org.uberfire.mvp.PlaceRequest;
import org.uberfire.mvp.impl.ConditionalPlaceRequest;
import org.uberfire.mvp.impl.DefaultPlaceRequest;
import org.uberfire.workbench.model.ActivityResourceType;
import org.uberfire.workbench.model.menu.MenuFactory;
import org.uberfire.workbench.model.menu.MenuItem;
import org.uberfire.workbench.model.menu.Menus;
import static org.kie.workbench.common.workbench.client.PerspectiveIds.*;
import static org.uberfire.workbench.model.menu.MenuFactory.*;
@ApplicationScoped
public class DefaultWorkbenchFeaturesMenusHelper {
DefaultWorkbenchConstants constants = DefaultWorkbenchConstants.INSTANCE;
protected SyncBeanManager iocManager;
private ActivityManager activityManager;
private PerspectiveManager perspectiveManager;
protected Caller<AuthenticationService> authService;
protected User identity;
protected UserMenu userMenu;
protected UtilityMenuBar utilityMenuBar;
protected LibraryMonitor libraryMonitor;
public DefaultWorkbenchFeaturesMenusHelper() {
}
@Inject
public DefaultWorkbenchFeaturesMenusHelper(SyncBeanManager iocManager,
ActivityManager activityManager,
PerspectiveManager perspectiveManager,
Caller<AuthenticationService> authService,
User identity,
UserMenu userMenu,
UtilityMenuBar utilityMenuBar,
LibraryMonitor libraryMonitor) {
this.iocManager = iocManager;
this.activityManager = activityManager;
this.perspectiveManager = perspectiveManager;
this.authService = authService;
this.identity = identity;
this.userMenu = userMenu;
this.utilityMenuBar = utilityMenuBar;
this.libraryMonitor = libraryMonitor;
}
public List<? extends MenuItem> getHomeViews(final boolean socialEnabled ) {
final AbstractWorkbenchPerspectiveActivity defaultPerspective = getDefaultPerspectiveActivity();
final List<MenuItem> result = new ArrayList<>( 1 );
result.add( MenuFactory.newSimpleItem( constants.HomePage() )
.perspective( defaultPerspective.getIdentifier() )
.endMenu()
.build().getItems().get( 0 ) );
result.add( MenuFactory.newSimpleItem( constants.Admin() )
.perspective( ADMIN )
.endMenu()
.build().getItems().get( 0 ) );
result.addAll( getSocialViews( socialEnabled ) );
return result;
}
protected List<MenuItem> getSocialViews( final boolean socialEnabled ) {
if ( !socialEnabled ) {
return Collections.emptyList();
}
final List<MenuItem> result = new ArrayList<>( 2 );
result.add( MenuFactory.newSimpleItem( constants.Timeline() ).perspective( SOCIAL_HOME ).endMenu().build().getItems().get( 0 ) );
result.add( MenuFactory.newSimpleItem( constants.People() ).perspective( SOCIAL_USER_HOME ).endMenu().build().getItems().get( 0 ) );
return result;
}
public List<MenuItem> getAuthoringViews() {
final List<MenuItem> result = new ArrayList<>( 4 );
result.add( MenuFactory.newSimpleItem( constants.ProjectAuthoring() ).perspective( LIBRARY ).endMenu().build().getItems().get( 0 ) );
result.add( MenuFactory.newSimpleItem( constants.Contributors() ).perspective( CONTRIBUTORS ).endMenu().build().getItems().get( 0 ) );
result.add( MenuFactory.newSimpleItem( constants.ArtifactRepository() ).perspective( GUVNOR_M2REPO ).endMenu().build().getItems().get( 0 ) );
result.add( MenuFactory.newSimpleItem( constants.Administration() ).perspective( ADMINISTRATION ).endMenu().build().getItems().get( 0 ) );
return result;
}
public List<? extends MenuItem> getProcessManagementViews() {
final List<MenuItem> result = new ArrayList<>( 2 );
result.add( MenuFactory.newSimpleItem( constants.ProcessDefinitions() ).perspective( PROCESS_DEFINITIONS ).endMenu().build().getItems().get( 0 ) );
result.add( MenuFactory.newSimpleItem( constants.ProcessInstances() ).perspective(PROCESS_INSTANCES).endMenu().build().getItems().get( 0 ) );
return result;
}
public List<? extends MenuItem> getExtensionsViews() {
final List<MenuItem> result = new ArrayList<>( 3 );
result.add( MenuFactory.newSimpleItem( constants.Plugins() ).perspective( PLUGIN_AUTHORING ).endMenu().build().getItems().get( 0 ) );
result.add( MenuFactory.newSimpleItem( constants.Apps() ).perspective( APPS ).endMenu().build().getItems().get( 0 ) );
result.add( MenuFactory.newSimpleItem( constants.DataSets() ).perspective( DATASET_AUTHORING ).endMenu().build().getItems().get( 0 ) );
result.add( MenuFactory.newSimpleItem( constants.DataSources() ).perspective( DATASOURCE_MANAGEMENT ).endMenu().build().getItems().get( 0 ) );
return result;
}
public void addRolesMenuItems() {
for ( Menus roleMenus : getRoles() ) {
userMenu.addMenus( roleMenus );
}
}
public void addGroupsMenuItems() {
for ( Menus groups : getGroups() ) {
userMenu.addMenus( groups );
}
}
public void addWorkbenchViewModeSwitcherMenuItem() {
userMenu.addMenus( MenuFactory.newTopLevelCustomMenu( iocManager.lookupBean( WorkbenchViewModeSwitcherMenuBuilder.class ).getInstance() ).endMenu().build() );
}
public void addWorkbenchConfigurationMenuItem() {
utilityMenuBar.addMenus( MenuFactory.newTopLevelCustomMenu( iocManager.lookupBean( WorkbenchConfigurationMenuBuilder.class ).getInstance() ).endMenu().build() );
}
public void addUtilitiesMenuItems() {
final Menus utilityMenus =
MenuFactory
.newTopLevelCustomMenu( iocManager.lookupBean( AppLauncherMenuBuilder.class ).getInstance() )
.endMenu()
.newTopLevelCustomMenu( iocManager.lookupBean( CustomSplashHelp.class ).getInstance() )
.endMenu()
.newTopLevelCustomMenu( iocManager.lookupBean( AboutMenuBuilder.class ).getInstance() )
.endMenu()
.newTopLevelCustomMenu( iocManager.lookupBean( ResetPerspectivesMenuBuilder.class ).getInstance() )
.endMenu()
.newTopLevelCustomMenu( userMenu )
.endMenu()
.build();
utilityMenuBar.addMenus( utilityMenus );
}
public void addLogoutMenuItem() {
final Menus userMenus = MenuFactory.newTopLevelMenu( constants.LogOut() )
.respondsWith( new LogoutCommand() )
.endMenu()
.build();
userMenu.addMenus( userMenus );
}
public AbstractWorkbenchPerspectiveActivity getDefaultPerspectiveActivity() {
AbstractWorkbenchPerspectiveActivity defaultPerspective = null;
final Collection<SyncBeanDef<AbstractWorkbenchPerspectiveActivity>> perspectives = iocManager.lookupBeans( AbstractWorkbenchPerspectiveActivity.class );
final Iterator<SyncBeanDef<AbstractWorkbenchPerspectiveActivity>> perspectivesIterator = perspectives.iterator();
while ( perspectivesIterator.hasNext() ) {
final SyncBeanDef<AbstractWorkbenchPerspectiveActivity> perspective = perspectivesIterator.next();
final AbstractWorkbenchPerspectiveActivity instance = perspective.getInstance();
if ( instance.isDefault() ) {
defaultPerspective = instance;
break;
} else {
iocManager.destroyBean( instance );
}
}
return defaultPerspective;
}
public List<PerspectiveActivity> getPerspectiveActivities() {
final Set<PerspectiveActivity> activities = activityManager.getActivities( PerspectiveActivity.class );
List<PerspectiveActivity> sortedActivitiesForDisplay = new ArrayList<>( activities );
Collections.sort( sortedActivitiesForDisplay,
( o1, o2 ) -> o1.getDefaultPerspectiveLayout().getName().compareTo( o2.getDefaultPerspectiveLayout().getName() ) );
return sortedActivitiesForDisplay;
}
public List<MenuItem> getPerspectivesMenuItems() {
final List<MenuItem> perspectives = new ArrayList<>();
for ( final PerspectiveActivity perspective : getPerspectiveActivities() ) {
final String name = perspective.getDefaultPerspectiveLayout().getName();
final MenuItem item = newSimpleItem( name ).perspective( perspective.getIdentifier() ).endMenu().build().getItems().get( 0 );
perspectives.add( item );
}
return perspectives;
}
public List<Menus> getRoles() {
final Set<Role> roles = identity.getRoles();
final List<Menus> result = new ArrayList<>( roles.size() );
result.add( MenuFactory.newSimpleItem( constants.LogOut() ).respondsWith( new LogoutCommand() ).endMenu().build() );
for ( final Role role : roles ) {
if ( !role.getName().equals( "IS_REMEMBER_ME" ) ) {
result.add( MenuFactory.newSimpleItem( constants.Role() + ": " + role.getName() ).endMenu().build() );
}
}
return result;
}
public List<Menus> getGroups() {
final Set<Group> groups = identity.getGroups();
final List<Menus> result = new ArrayList<Menus>( groups.size() );
for ( final Group group : groups ) {
result.add( MenuFactory.newSimpleItem( constants.Group() + ": " + group.getName() ).endMenu().build() );
}
return result;
}
public TopLevelMenusBuilder<MenuBuilder> buildMenusFromNavTree(NavTree navTree) {
MenuBuilder<TopLevelMenusBuilder<MenuBuilder>> builder = null;
for (NavItem navItem : navTree.getRootItems()) {
// Skip dividers
if (navItem instanceof NavDivider) {
continue;
}
// Build a top level menu entry
if (builder == null) {
builder = MenuFactory.newTopLevelMenu(navItem.getName());
} else {
builder = builder.endMenu().newTopLevelMenu(navItem.getName());
}
// Append its children
if (navItem instanceof NavGroup) {
List<MenuItem> childItems = buildMenuItemsFromNavGroup((NavGroup) navItem);
builder.withItems(childItems);
}
// Append the place request
NavWorkbenchCtx navCtx = NavWorkbenchCtx.get(navItem);
if (navCtx.getResourceId() != null && ActivityResourceType.PERSPECTIVE.equals(navCtx.getResourceType())) {
PlaceRequest placeRequest = resolvePlaceRequest(navCtx.getResourceId());
builder = builder.place(placeRequest);
}
}
return builder != null ? builder.endMenu() : null;
}
public List<MenuItem> buildMenuItemsFromNavGroup(NavGroup navGroup) {
List<MenuItem> result = new ArrayList<>();
for (NavItem navItem : navGroup.getChildren()) {
// Skip dividers
if (navItem instanceof NavDivider) {
continue;
}
// Append its children
MenuBuilder<Builder> builder = MenuFactory.newSimpleItem(navItem.getName());
if (navItem instanceof NavGroup) {
List<MenuItem> childItems = buildMenuItemsFromNavGroup((NavGroup) navItem);
builder.withItems(childItems);
}
// Append the place request
NavWorkbenchCtx navCtx = NavWorkbenchCtx.get(navItem);
if (navCtx.getResourceId() != null && ActivityResourceType.PERSPECTIVE.equals(navCtx.getResourceType())) {
PlaceRequest placeRequest = resolvePlaceRequest(navCtx.getResourceId());
builder.place(placeRequest);
}
// Build the menu item & continue with the next one
MenuItem menuItem = builder.endMenu().build().getItems().get(0);
result.add(menuItem);
}
return result;
}
public PlaceRequest resolvePlaceRequest(String perspectiveId) {
switch (perspectiveId) {
case AUTHORING:
return new ConditionalPlaceRequest(AUTHORING)
.when(p -> libraryMonitor.thereIsAtLeastOneProjectAccessible())
.orElse(new DefaultPlaceRequest(LIBRARY));
default:
return new DefaultPlaceRequest(perspectiveId);
}
}
protected class LogoutCommand implements Command {
@Override
public void execute() {
perspectiveManager.savePerspectiveState( () -> authService.call( ( o ) -> doRedirect( getRedirectURL() ) ).logout() );
}
void doRedirect( final String url ) {
redirect( url );
}
String getRedirectURL() {
final String gwtModuleBaseURL = getGWTModuleBaseURL();
final String gwtModuleName = getGWTModuleName();
final String locale = getLocale();
final String url = gwtModuleBaseURL.replaceFirst( "/" + gwtModuleName + "/", "/logout.jsp?locale=" + locale );
return url;
}
String getGWTModuleBaseURL() {
return GWT.getModuleBaseURL();
}
String getGWTModuleName() {
return GWT.getModuleName();
}
String getLocale() {
return LocaleInfo.getCurrentLocale().getLocaleName();
}
}
public static native void redirect( String url )/*-{
$wnd.location = url;
}-*/;
}