/*
* 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.widgets;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import org.guvnor.common.services.project.context.ProjectContextChangeEvent;
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.library.api.LibraryService;
import org.kie.workbench.common.screens.library.api.OrganizationalUnitRepositoryInfo;
import org.kie.workbench.common.screens.library.api.preferences.LibraryInternalPreferences;
import org.kie.workbench.common.screens.library.api.preferences.LibraryPreferences;
import org.kie.workbench.common.screens.library.client.util.LibraryPlaces;
import org.uberfire.client.mvp.PlaceManager;
import org.uberfire.client.mvp.UberElement;
import org.uberfire.mvp.Command;
@ApplicationScoped
public class LibraryToolbarPresenter {
public interface View extends UberElement<LibraryToolbarPresenter> {
void clearRepositories();
void addRepository(String alias);
String getSelectedRepository();
void setSelectedRepository(String alias);
void setRepositorySelectorVisibility(final boolean visible);
void clearBranches();
void addBranch(final String branchName);
String getSelectedBranch();
void setSelectedBranch(final String branchName);
void setBranchSelectorVisibility(boolean visible);
}
private View view;
private Caller<LibraryService> libraryService;
private LibraryPreferences libraryPreferences;
private LibraryInternalPreferences libraryInternalPreferences;
private PlaceManager placeManager;
private LibraryPlaces libraryPlaces;
private Event<ProjectContextChangeEvent> projectContextChangeEvent;
private OrganizationalUnitRepositoryInfo info;
private Repository selectedRepository;
private String selectedBranch;
@Inject
public LibraryToolbarPresenter(final View view,
final Caller<LibraryService> libraryService,
final LibraryPreferences libraryPreferences,
final LibraryInternalPreferences libraryInternalPreferences,
final PlaceManager placeManager,
final LibraryPlaces libraryPlaces,
final Event<ProjectContextChangeEvent> projectContextChangeEvent) {
this.view = view;
this.libraryService = libraryService;
this.libraryPreferences = libraryPreferences;
this.libraryInternalPreferences = libraryInternalPreferences;
this.placeManager = placeManager;
this.libraryPlaces = libraryPlaces;
this.projectContextChangeEvent = projectContextChangeEvent;
}
public void init(final Command callback) {
libraryService.call((OrganizationalUnitRepositoryInfo info) -> {
LibraryToolbarPresenter.this.info = info;
view.init(LibraryToolbarPresenter.this);
setupRepositories(info);
selectedRepository = info.getSelectedRepository();
selectedBranch = info.getSelectedRepository().getDefaultBranch();
setBranchSelectorVisibility();
setRepositorySelectorVisibility();
final ProjectContextChangeEvent event = new ProjectContextChangeEvent(info.getSelectedOrganizationalUnit());
projectContextChangeEvent.fire(event);
callback.execute();
}).getDefaultOrganizationalUnitRepositoryInfo();
}
public void setSelectedInfo(final OrganizationalUnit organizationalUnit,
final Repository repository,
final Command callback) {
libraryService.call((OrganizationalUnitRepositoryInfo newInfo) -> {
newInfo.setSelectedRepository(repository);
refreshLibrary(newInfo,
callback);
}).getOrganizationalUnitRepositoryInfo(organizationalUnit);
}
private void setupRepositories(final OrganizationalUnitRepositoryInfo info) {
view.clearRepositories();
info.getRepositories().forEach(repo -> view.addRepository(repo.getAlias()));
view.setSelectedRepository(info.getSelectedRepository().getAlias());
setUpBranches(info.getSelectedRepository().getDefaultBranch(),
info.getSelectedRepository());
}
private void setUpBranches(final String selectedBranch,
final Repository repository) {
view.clearBranches();
for (final String branchName : repository.getBranches()) {
view.addBranch(branchName);
}
view.setSelectedBranch(selectedBranch);
}
void onUpdateSelectedRepository() {
refreshLibrary(null);
setUpBranches(selectedBranch,
selectedRepository);
libraryInternalPreferences.load(loadedLibraryInternalPreferences -> {
loadedLibraryInternalPreferences.setLastOpenedRepository(selectedRepository.getAlias());
loadedLibraryInternalPreferences.save();
},
error -> {
});
}
void onUpdateSelectedBranch() {
refreshLibrary(null);
}
private void refreshLibrary(final OrganizationalUnitRepositoryInfo newInfo) {
refreshLibrary(newInfo,
null);
}
private void refreshLibrary(final OrganizationalUnitRepositoryInfo newInfo,
final Command callback) {
if (placeManager.closeAllPlacesOrNothing()) {
if (newInfo != null) {
this.info = newInfo;
setupRepositories(info);
}
selectedRepository = getViewSelectedRepository();
selectedBranch = getViewSelectedBranch();
setBranchSelectorVisibility();
setRepositorySelectorVisibility();
libraryPlaces.goToLibrary(callback);
} else {
view.setSelectedRepository(selectedRepository.getAlias());
setUpBranches(selectedBranch,
selectedRepository);
}
}
private void setRepositorySelectorVisibility() {
view.setRepositorySelectorVisibility(info.getRepositories().size() > 1);
}
private void setBranchSelectorVisibility() {
view.setBranchSelectorVisibility(selectedRepository.getBranches().size() > 1);
}
private String getViewSelectedBranch() {
if (!selectedRepository.getBranches().contains(view.getSelectedBranch())) {
return selectedRepository.getDefaultBranch();
} else {
return view.getSelectedBranch();
}
}
public Repository getSelectedRepository() {
return selectedRepository;
}
private Repository getViewSelectedRepository() {
return info.getRepositories().stream()
.filter(repo -> repo.getAlias().equals(view.getSelectedRepository()))
.findFirst().get();
}
public UberElement<LibraryToolbarPresenter> getView() {
return view;
}
public String getSelectedBranch() {
return selectedBranch;
}
}