/* * Copyright 2015 JBoss, by 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.uberfire.ext.plugin.client; import java.util.Collection; import javax.annotation.PostConstruct; import javax.inject.Inject; import com.google.gwt.core.client.ScriptInjector; import com.google.gwt.dom.client.StyleInjector; import org.jboss.errai.bus.client.api.ClientMessageBus; import org.jboss.errai.common.client.api.Caller; import org.jboss.errai.common.client.api.RemoteCallback; import org.jboss.errai.ioc.client.api.AfterInitialization; import org.jboss.errai.ioc.client.api.EnabledByProperty; import org.jboss.errai.ioc.client.api.EntryPoint; import org.jboss.errai.ui.shared.api.annotations.Bundle; import org.uberfire.client.mvp.Activity; import org.uberfire.client.mvp.ActivityManager; import org.uberfire.client.mvp.PerspectiveActivity; import org.uberfire.client.mvp.PlaceManager; import org.uberfire.client.mvp.PopupActivity; import org.uberfire.client.mvp.SplashScreenActivity; import org.uberfire.client.mvp.WorkbenchEditorActivity; import org.uberfire.client.mvp.WorkbenchScreenActivity; import org.uberfire.client.workbench.Workbench; import org.uberfire.client.workbench.widgets.menu.WorkbenchMenuBar; import org.uberfire.ext.plugin.client.resources.WebAppResource; import org.uberfire.ext.plugin.model.DynamicMenu; import org.uberfire.ext.plugin.model.DynamicMenuItem; import org.uberfire.ext.plugin.model.RuntimePlugin; import org.uberfire.ext.plugin.service.PluginServices; import org.uberfire.mvp.impl.DefaultPlaceRequest; import org.uberfire.security.ResourceType; import org.uberfire.workbench.model.menu.MenuFactory; import static com.google.gwt.core.client.ScriptInjector.TOP_WINDOW; import static org.uberfire.workbench.model.ActivityResourceType.EDITOR; import static org.uberfire.workbench.model.ActivityResourceType.PERSPECTIVE; import static org.uberfire.workbench.model.ActivityResourceType.POPUP; import static org.uberfire.workbench.model.ActivityResourceType.SCREEN; @EntryPoint @Bundle("resources/i18n/Constants.properties") @EnabledByProperty(value = "uberfire.plugin.mode.active", negated = true) public class RuntimePluginsEntryPoint { @Inject private Workbench workbench; @Inject private Caller<PluginServices> pluginServices; @Inject private ClientMessageBus bus; @Inject private WorkbenchMenuBar menubar; @Inject private PlaceManager placeManager; @Inject private ActivityManager activityManager; @PostConstruct public void init() { WebAppResource.INSTANCE.CSS().ensureInjected(); workbench.addStartupBlocker(RuntimePluginsEntryPoint.class); } @AfterInitialization public void setup() { pluginServices.call(new RemoteCallback<Collection<RuntimePlugin>>() { @Override public void callback(Collection<RuntimePlugin> response) { for (final RuntimePlugin plugin : response) { ScriptInjector.fromString(plugin.getScript()).setWindow(TOP_WINDOW).inject(); StyleInjector.inject(plugin.getStyle(), true); } pluginServices.call(new RemoteCallback<Collection<DynamicMenu>>() { @Override public void callback(Collection<DynamicMenu> response) { for (final DynamicMenu menu : response) { if (!menu.getMenuItems().isEmpty()) { MenuFactory.SubMenusBuilder<MenuFactory.SubMenuBuilder<MenuFactory.TopLevelMenusBuilder<MenuFactory.MenuBuilder>>> dynamicMenu = MenuFactory.newTopLevelMenu(menu.getName()).orderAll(100).menus(); for (final DynamicMenuItem dynamicMenuItem : menu.getMenuItems()) { String activityId = dynamicMenuItem.getActivityId(); ResourceType resourceType = getResourceType(activityId); dynamicMenu.menu(dynamicMenuItem.getMenuLabel()) .withPermission(activityId, resourceType) .respondsWith(() -> placeManager.goTo(activityId)) .endMenu(); } menubar.addMenus(dynamicMenu.endMenus().endMenu().build()); } } workbench.removeStartupBlocker(RuntimePluginsEntryPoint.class); } }).listDynamicMenus(); } }).listRuntimePlugins(); } public ResourceType getResourceType(String activityId) { Activity activity = activityManager.getActivity(new DefaultPlaceRequest(activityId), false); if (activity != null) { if (activity instanceof PerspectiveActivity) { return PERSPECTIVE; } if (activity instanceof WorkbenchScreenActivity) { return SCREEN; } if (activity instanceof WorkbenchEditorActivity) { return EDITOR; } if (activity instanceof SplashScreenActivity) { return EDITOR; } if (activity instanceof PopupActivity) { return POPUP; } } return ResourceType.UNKNOWN; } }