/* * 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.widgets.client.widget; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.SelectionChangeEvent; import org.jboss.errai.common.client.api.Caller; import org.jboss.errai.common.client.api.RemoteCallback; import org.jboss.errai.common.client.ui.ElementWrapperWidget; import org.kie.workbench.common.services.shared.kmodule.KBaseModel; import org.kie.workbench.common.services.shared.kmodule.KModuleModel; import org.kie.workbench.common.services.shared.kmodule.KModuleService; import org.kie.workbench.common.services.shared.kmodule.KSessionModel; import org.kie.workbench.common.services.shared.project.KieProject; import org.kie.workbench.common.services.shared.project.KieProjectService; import org.uberfire.backend.vfs.Path; import org.uberfire.commons.validation.PortablePreconditions; import org.uberfire.mvp.Command; public class KSessionSelector implements IsWidget { private static String DEFAULT_KIE_BASE = "defaultKieBase"; private static String DEFAULT_KIE_SESSION = "defaultKieSession"; private static String NON_EXISTING_KBASE = "---"; private KSessionSelectorView view; private Caller<KieProjectService> projectService; private Caller<KModuleService> kModuleService; private KModuleModel kmodule; private Command selectionHandler; @Inject public KSessionSelector(final KSessionSelectorView view, final Caller<KieProjectService> projectService, final Caller<KModuleService> kModuleService) { this.view = view; this.projectService = projectService; this.kModuleService = kModuleService; view.setPresenter(this); } public void init(final Path path, final String ksession) { projectService.call(getSuccessfulResolveProjectCallback(ksession)).resolveProject(path); } private RemoteCallback<KieProject> getSuccessfulResolveProjectCallback(final String currentKSession) { return new RemoteCallback<KieProject>() { @Override public void callback(KieProject project) { kModuleService.call(getSuccessfulLoadKModuleCallback(currentKSession)).load(project.getKModuleXMLPath()); } }; } private RemoteCallback<KModuleModel> getSuccessfulLoadKModuleCallback(final String currentKSession) { return new RemoteCallback<KModuleModel>() { @Override public void callback(KModuleModel kmodule) { KSessionSelector.this.kmodule = kmodule; initKBases(currentKSession); selectCurrentKBaseAndKSession(currentKSession); } }; } private void selectCurrentKBaseAndKSession(final String currentKSession) { if (isNotNullOrEmpty(currentKSession) && kmoduleContainsCurrentKSession(currentKSession)) { selectFromModel(currentKSession); } else { selectFirstKBaseAndKSession(); } } private void initKBases(final String currentKSession) { view.clear(); if (kmodule.getKBases().isEmpty()) { addMockKBaseModel(DEFAULT_KIE_BASE, DEFAULT_KIE_SESSION); view.addKBase(DEFAULT_KIE_BASE); } else { for (KBaseModel kBase : kmodule.getKBases().values()) { view.addKBase(kBase.getName()); } } if (isNotNullOrEmpty(currentKSession) && !kmoduleContainsCurrentKSession(currentKSession)) { addMockKBaseModel(NON_EXISTING_KBASE, currentKSession); view.addKBase(NON_EXISTING_KBASE); view.showWarningSelectedKSessionDoesNotExist(); } } private void addMockKBaseModel(final String kbaseName, final String ksessionsName) { KBaseModel kbaseModel = new KBaseModel(); kbaseModel.setName(kbaseName); KSessionModel ksessionModel = new KSessionModel(); ksessionModel.setName(ksessionsName); kbaseModel.getKSessions().add(ksessionModel); kmodule.getKBases().put(kbaseName, kbaseModel); } private boolean isNotNullOrEmpty(final String ksession) { return ksession != null && !ksession.trim().isEmpty(); } private boolean kmoduleContainsCurrentKSession(final String currentKSession) { if (isNotNullOrEmpty(currentKSession)) { for (KBaseModel kbase : kmodule.getKBases().values()) { for (KSessionModel ksession : kbase.getKSessions()) { if (ksession.getName().equals(currentKSession)) { return true; } } } } return false; } public void onKBaseSelected(final String kbaseName) { final List<KSessionModel> ksessions = kmodule.getKBases().get(kbaseName).getKSessions(); listKSessions(ksessions); view.setSelected(kbaseName, ksessions.iterator().next().getName()); } public String getSelectedKSessionName() { return view.getSelectedKSessionName(); } private void selectFromModel(final String currentKSession) { for (KBaseModel kbase : kmodule.getKBases().values()) { for (KSessionModel ksession : kbase.getKSessions()) { if (ksession.getName().equals(currentKSession)) { listKSessions(kmodule.getKBases().get(kbase.getName()).getKSessions()); view.setSelected(kbase.getName(), currentKSession); break; } } } } private void selectFirstKBaseAndKSession() { KBaseModel firstKBase = kmodule.getKBases().values().iterator().next(); List<KSessionModel> ksessions = firstKBase.getKSessions(); listKSessions(ksessions); view.setSelected(firstKBase.getName(), ksessions.iterator().next().getName()); } private void listKSessions(List<KSessionModel> ksessions) { List<String> ksessionNames = new ArrayList<String>(); for (KSessionModel ksession : ksessions) { ksessionNames.add(ksession.getName()); } view.setKSessions(ksessionNames); } @Override public Widget asWidget() { return ElementWrapperWidget.getWidget(view.getElement()); } public void onSelectionChange() { if ( selectionHandler != null ) { selectionHandler.execute(); } } public void setSelectionChangeHandler(final Command handler) { this.selectionHandler = PortablePreconditions.checkNotNull("handler", handler); } }