/* * 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.library.client.screens; import java.util.List; import java.util.stream.Collectors; import javax.annotation.PostConstruct; import javax.enterprise.event.Event; import javax.enterprise.event.Observes; import javax.inject.Inject; import org.guvnor.common.services.project.client.security.ProjectController; import org.guvnor.common.services.project.model.Project; import org.guvnor.structure.repositories.Repository; import org.jboss.errai.common.client.api.Caller; import org.jboss.errai.common.client.api.RemoteCallback; import org.kie.workbench.common.screens.examples.model.ExampleProject; import org.kie.workbench.common.screens.library.api.LibraryInfo; import org.kie.workbench.common.screens.library.api.LibraryService; import org.kie.workbench.common.screens.library.api.ProjectInfo; import org.kie.workbench.common.screens.library.api.search.FilterUpdateEvent; import org.kie.workbench.common.screens.library.client.events.ProjectDetailEvent; import org.kie.workbench.common.screens.library.client.perspective.LibraryPerspective; import org.kie.workbench.common.screens.library.client.util.ExamplesUtils; import org.kie.workbench.common.screens.library.client.util.LibraryPlaces; import org.uberfire.client.annotations.WorkbenchPartTitle; import org.uberfire.client.annotations.WorkbenchPartView; import org.uberfire.client.annotations.WorkbenchScreen; import org.uberfire.client.mvp.PlaceManager; import org.uberfire.client.mvp.UberElement; import org.uberfire.mvp.Command; @WorkbenchScreen(identifier = LibraryPlaces.LIBRARY_SCREEN, owningPerspective = LibraryPerspective.class) public class LibraryScreen { public interface View extends UberElement<LibraryScreen> { void clearProjects(); void addProject(String project, Command details, Command select); void clearFilterText(); void setFilterName(String name); void addProjectToImport(ExampleProject exampleProject); void clearImportProjectsContainer(); } private View view; private PlaceManager placeManager; private LibraryPlaces libraryPlaces; private Event<ProjectDetailEvent> projectDetailEvent; private Caller<LibraryService> libraryService; private ExamplesUtils examplesUtils; private ProjectController projectController; List<Project> projects; @Inject public LibraryScreen(final View view, final PlaceManager placeManager, final LibraryPlaces libraryPlaces, final Event<ProjectDetailEvent> projectDetailEvent, final Caller<LibraryService> libraryService, final ExamplesUtils examplesUtils, final ProjectController projectController) { this.view = view; this.placeManager = placeManager; this.libraryPlaces = libraryPlaces; this.projectDetailEvent = projectDetailEvent; this.libraryService = libraryService; this.examplesUtils = examplesUtils; this.projectController = projectController; } @PostConstruct public void setup() { Repository selectedRepository = libraryPlaces.getSelectedRepository(); String selectedBranch = libraryPlaces.getSelectedBranch(); libraryService.call((RemoteCallback<LibraryInfo>) this::updateLibrary) .getLibraryInfo(selectedRepository, selectedBranch); placeManager.closePlace(LibraryPlaces.EMPTY_LIBRARY_SCREEN); } private void updateLibrary(final LibraryInfo libraryInfo) { projects = libraryInfo.getProjects(); view.clearFilterText(); setupProjects(); } private void setupProjects() { if (projectController.canReadProjects()) { projects = projects.stream() .filter(p -> projectController.canReadProject(p)) .collect(Collectors.toList()); projects.sort((p1, p2) -> p1.getProjectName().compareTo(p2.getProjectName())); updateView(projects); } } public List<Project> filterProjects(final String filter) { List<Project> filteredProjects = projects.stream() .filter(p -> p.getProjectName().toUpperCase().startsWith(filter.toUpperCase())) .collect(Collectors.toList()); updateView(filteredProjects); return filteredProjects; } private void updateView(final List<Project> projects) { view.clearProjects(); projects.stream().forEach(p -> view.addProject(p.getProjectName(), detailsCommand(p), selectCommand(p))); } public void importProject(final ExampleProject exampleProject) { if (userCanCreateProjects()) { examplesUtils.importProject(exampleProject); } } public void updateImportProjects() { examplesUtils.getExampleProjects(exampleProjects -> { view.clearImportProjectsContainer(); for (ExampleProject exampleProject : exampleProjects) { view.addProjectToImport(exampleProject); } }); } public void filterUpdate(@Observes final FilterUpdateEvent event) { view.setFilterName(event.getName()); filterProjects(event.getName()); } public boolean userCanCreateProjects() { return projectController.canCreateProjects(); } Command selectCommand(final Project project) { return () -> { final ProjectInfo projectInfo = getProjectInfo(project); libraryPlaces.goToProject(projectInfo); }; } Command detailsCommand(final Project project) { return () -> { final ProjectInfo projectInfo = getProjectInfo(project); projectDetailEvent.fire(new ProjectDetailEvent(projectInfo)); }; } private ProjectInfo getProjectInfo(final Project project) { return new ProjectInfo(libraryPlaces.getSelectedOrganizationalUnit(), libraryPlaces.getSelectedRepository(), libraryPlaces.getSelectedBranch(), project); } @WorkbenchPartTitle public String getTitle() { return "Library Screen"; } @WorkbenchPartView public UberElement<LibraryScreen> getView() { return view; } }