/* * 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.screens.datasource.management.client.explorer.project; import java.util.ArrayList; import java.util.Collection; import javax.annotation.PostConstruct; import javax.enterprise.context.Dependent; import javax.inject.Inject; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Widget; import org.guvnor.common.services.project.model.Project; import org.guvnor.structure.organizationalunit.OrganizationalUnit; import org.guvnor.structure.repositories.Repository; import org.jboss.errai.common.client.api.Caller; import org.kie.workbench.common.screens.datasource.management.client.explorer.common.DefExplorerBase; import org.kie.workbench.common.screens.datasource.management.client.explorer.common.DefExplorerContent; import org.kie.workbench.common.screens.datasource.management.client.wizard.datasource.NewDataSourceDefWizard; import org.kie.workbench.common.screens.datasource.management.client.wizard.driver.NewDriverDefWizard; import org.kie.workbench.common.screens.datasource.management.events.BaseDataSourceEvent; import org.kie.workbench.common.screens.datasource.management.events.BaseDriverEvent; import org.kie.workbench.common.screens.datasource.management.service.DefExplorerQuery; import org.kie.workbench.common.screens.datasource.management.service.DefExplorerQueryResult; import org.kie.workbench.common.screens.datasource.management.service.DefExplorerQueryService; @Dependent public class ProjectDataSourceExplorer extends DefExplorerBase implements ProjectDataSourceExplorerView.Presenter, IsWidget { private ProjectDataSourceExplorerView view; private OrganizationalUnit activeOrganizationalUnit; private Repository activeRepository; private Project activeProject; private String activeBranch = "master"; @Inject public ProjectDataSourceExplorer( final ProjectDataSourceExplorerView view, final DefExplorerContent defExplorerContent, final NewDataSourceDefWizard newDataSourceDefWizard, final NewDriverDefWizard newDriverDefWizard, final Caller<DefExplorerQueryService> explorerService ) { super( defExplorerContent, newDataSourceDefWizard, newDriverDefWizard, explorerService ); this.view = view; } @PostConstruct protected void init() { super.init(); view.setDataSourceDefExplorer( defExplorerContent ); view.addProjectSelectorHandler( new ProjectSelectorHandler() { @Override public void onOrganizationalUnitSelected( OrganizationalUnit ou ) { ProjectDataSourceExplorer.this.onOrganizationalUnitSelected( ou ); } @Override public void onRepositorySelected( Repository repository ) { ProjectDataSourceExplorer.this.onRepositorySelected( repository ); } @Override public void onProjectSelected( Project project ) { ProjectDataSourceExplorer.this.onProjectSelected( project ); } } ); } @Override public void onAddDriver() { final Project activeProject = getActiveProject(); if ( activeProject == null ) { Window.alert( "No project has been selected" ); } else { newDriverDefWizard.setProject( activeProject ); newDriverDefWizard.start(); } } @Override public void onAddDataSource() { final Project activeProject = getActiveProject(); if ( activeProject == null ) { Window.alert( "No project has been selected" ); } else { newDataSourceDefWizard.setProject( getActiveProject() ); newDataSourceDefWizard.start(); } } @Override public Widget asWidget() { return view.asWidget(); } @Override protected DefExplorerQuery createRefreshQuery() { return new DefExplorerQuery( activeOrganizationalUnit, activeRepository, activeProject, activeBranch ); } private void refresh( final DefExplorerQuery query ) { explorerService.call( getRefreshCallback() ).executeQuery( query ); } @Override protected void loadContent( final DefExplorerQueryResult content ) { defExplorerContent.clear(); if ( activeOrganizationalUnit == null || !contains( content.getOrganizationalUnits(), activeOrganizationalUnit ) ) { //no organizational unit was selected or the previously selected one has been deleted at server side. if ( content.getOrganizationalUnits() != null && content.getOrganizationalUnits().size() > 0 ) { //let's select the first one activeOrganizationalUnit = content.getOrganizationalUnits().iterator().next(); activeRepository = null; activeProject = null; //try a refresh. refresh( ); } else { //there are no organizational units, nothing to do. activeOrganizationalUnit = null; activeRepository = null; activeProject = null; view.clear(); } } else if ( activeRepository == null || !contains( content.getRepositories(), activeRepository ) ) { //an organizational unit was selected and is in the result but no repository was selected or the previously //selected one has been deleted at server side. if ( content.getRepositories() != null && content.getRepositories().size() > 0 ) { //let's select the first one. activeRepository = content.getRepositories().iterator().next(); activeProject = null; //try a refresh. refresh(); } else { //there are no repositories for the activeOrganizationalUnit activeRepository = null; activeProject = null; view.loadContent( content.getOrganizationalUnits(), activeOrganizationalUnit, new ArrayList<>( ), activeRepository, new ArrayList<>( ), activeProject ); } } else if ( activeProject == null || !contains( content.getProjects(), activeProject ) ) { //an organization unit and a repository were selected and both are in the result, but no project is //selected or the selected one has been deleted at server side. if ( content.getProjects() != null && content.getProjects().size() > 0 ) { activeProject = content.getProjects().iterator().next(); //try a refresh. refresh(); } else { activeProject = null; view.loadContent( content.getOrganizationalUnits(), activeOrganizationalUnit, content.getRepositories(), activeRepository, new ArrayList<>( ), activeProject ); } } else { //an organizational unit, repository and project are selected and are in the result. //just load the view with the results. view.loadContent( content.getOrganizationalUnits(), activeOrganizationalUnit, content.getRepositories(), activeRepository, content.getProjects(), activeProject ); defExplorerContent.loadDataSources( content.getDataSourceDefs() ); defExplorerContent.loadDrivers( content.getDriverDefs() ); } } private boolean contains( Collection<Repository> repositories, Repository activeRepository ) { if ( repositories != null ) { for ( Repository repository : repositories ) { if ( repository.getAlias().equals( activeRepository.getAlias() ) ) { return true; } } } return false; } private boolean contains( Collection<OrganizationalUnit> organizationalUnits, OrganizationalUnit activeOrganizationalUnit ) { if ( organizationalUnits != null ) { for ( OrganizationalUnit ou : organizationalUnits ) { if ( ou.getName().equals( activeOrganizationalUnit.getName() ) ) { return true; } } } return false; } private boolean contains( Collection<Project> projects, Project activeProject ) { if ( projects != null ) { for ( Project project : projects ) { if ( project.getRootPath().equals( activeProject.getRootPath() ) ) { return true; } } } return false; } public void onOrganizationalUnitSelected( final OrganizationalUnit ou ) { if ( hasChanged( ou ) ) { activeOrganizationalUnit = ou; activeRepository = null; activeProject = null; DefExplorerQuery query = new DefExplorerQuery(); query.setOrganizationalUnit( ou ); refresh( query ); } } public void onRepositorySelected( final Repository repository ) { if ( hasChanged( repository ) ) { DefExplorerQuery query = new DefExplorerQuery(); if ( activeOrganizationalUnit != null ) { activeRepository = repository; activeProject = null; query.setOrganizationalUnit( activeOrganizationalUnit ); query.setRepository( repository ); query.setBranch( activeBranch ); } else { activeRepository = null; activeProject = null; } refresh( query ); } } public void onProjectSelected( final Project project ) { if ( hasChanged( project ) ) { DefExplorerQuery query = new DefExplorerQuery(); if ( activeOrganizationalUnit != null && activeRepository != null ) { activeProject = project; query.setOrganizationalUnit( activeOrganizationalUnit ); query.setRepository( activeRepository ); query.setBranch( activeBranch ); query.setProject( project ); } else { activeProject = null; } refresh( query ); } } public OrganizationalUnit getActiveOrganizationalUnit() { return activeOrganizationalUnit; } public void setActiveOrganizationalUnit( OrganizationalUnit activeOrganizationalUnit ) { this.activeOrganizationalUnit = activeOrganizationalUnit; } public Repository getActiveRepository() { return activeRepository; } public void setActiveRepository( Repository activeRepository ) { this.activeRepository = activeRepository; } public Project getActiveProject() { return activeProject; } public void setActiveProject( Project activeProject ) { this.activeProject = activeProject; } public String getActiveBranch() { return activeBranch; } @Override protected boolean refreshOnDataSourceEvent( BaseDataSourceEvent event ) { return !event.isGlobal() && activeProject != null && activeProject.equals( event.getProject() ); } @Override protected boolean refreshOnDriverEvent( BaseDriverEvent event ) { return !event.isGlobal() && activeProject != null && activeProject.equals( event.getProject() ); } private boolean hasChanged( final OrganizationalUnit ou ) { return activeOrganizationalUnit != null ? !activeOrganizationalUnit.equals( ou ) : ou != null; } private boolean hasChanged( final Repository repository ) { return activeRepository != null ? !activeRepository.equals( repository ) : repository != null; } private boolean hasChanged( final Project project ) { return activeProject != null ? !activeProject.equals( project ) : project != null; } }