/* * Copyright 2015 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. * * 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.social.hp.client.homepage; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.event.Event; import javax.inject.Inject; import com.google.gwt.core.shared.GWT; import org.guvnor.structure.organizationalunit.OrganizationalUnitService; import org.guvnor.structure.repositories.Repository; import org.guvnor.structure.repositories.RepositoryService; 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.security.shared.api.identity.User; import org.ext.uberfire.social.activities.client.widgets.item.model.LinkCommandParams; import org.ext.uberfire.social.activities.client.widgets.timeline.regular.SocialTimelineWidget; import org.ext.uberfire.social.activities.client.widgets.timeline.regular.model.SocialTimelineWidgetModel; import org.ext.uberfire.social.activities.model.SocialUser; import org.ext.uberfire.social.activities.service.SocialEventTypeRepositoryAPI; import org.ext.uberfire.social.activities.service.SocialUserRepositoryAPI; import org.ext.uberfire.social.activities.service.SocialUserServiceAPI; import org.kie.workbench.common.screens.social.hp.client.homepage.events.LoadUserPageEvent; import org.kie.workbench.common.screens.social.hp.client.homepage.events.UserHomepageSelectedEvent; import org.kie.workbench.common.screens.social.hp.client.homepage.header.HeaderPresenter; import org.kie.workbench.common.screens.social.hp.client.homepage.main.MainPresenter; import org.kie.workbench.common.screens.social.hp.client.resources.i18n.Constants; import org.kie.workbench.common.screens.social.hp.client.util.IconLocator; import org.kie.workbench.common.screens.social.hp.service.RepositoryListService; 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.UberView; import org.uberfire.client.workbench.type.ClientResourceType; import org.uberfire.lifecycle.OnOpen; import org.uberfire.mvp.ParameterizedCommand; @ApplicationScoped @WorkbenchScreen(identifier = "SocialHomePageMainPresenter") public class SocialHomePageMainPresenter { public interface View extends UberView<SocialHomePageMainPresenter> { void setHeader( final HeaderPresenter header ); void setMain( MainPresenter main ); } @Inject private View view; @Inject private Event<UserHomepageSelectedEvent> selectedEvent; @Inject private Event<LoadUserPageEvent> loadUserPageEvent; @Inject private HeaderPresenter header; @Inject private MainPresenter main; @Inject private Caller<RepositoryListService> repositoryService; @Inject private Caller<OrganizationalUnitService> organizationalUnitService; @Inject Caller<SocialEventTypeRepositoryAPI> eventTypeRepositoryAPI; @Inject Caller<SocialUserRepositoryAPI> socialUserRepositoryAPI; @Inject private User loggedUser; @Inject private IconLocator iconLocator; @Inject private PlaceManager placeManager; @Inject private Caller<SocialUserServiceAPI> socialUserService; @Inject private DefaultSocialLinkCommandGenerator linkCommandGenerator; @AfterInitialization public void init() { view.setHeader( header ); view.setMain( main ); } @OnOpen public void onOpen() { setupPage(); } private void setupPage() { initHeader(); initMain(); } private void initMain() { socialUserRepositoryAPI.call( new RemoteCallback<SocialUser>() { public void callback( SocialUser socialUser ) { updateMainTimeline( "", socialUser ); } } ).findSocialUser( loggedUser.getIdentifier() ); } private void initHeader() { header.setOnSelectCommand( new ParameterizedCommand<String>() { @Override public void execute( final String param ) { socialUserRepositoryAPI.call( new RemoteCallback<SocialUser>() { public void callback( SocialUser socialUser ) { updateMainTimeline( param, socialUser ); } } ).findSocialUser( loggedUser.getIdentifier() ); } } ); createHeaderMenuList(); } private void updateMainTimeline( String param, final SocialUser socialUser ) { if ( param.contains( Constants.INSTANCE.AllRepositories() ) ) { param = ""; } SocialTimelineWidget socialTimelineWidget = GWT.create( SocialTimelineWidget.class ); List<ClientResourceType> resourceTypes = iconLocator.getResourceTypes(); SocialTimelineWidgetModel model = new SocialTimelineWidgetModel( socialUser, placeManager, resourceTypes ) .withUserClickCommand( generateUserClickCommand() ) .withFollowUnfollowCommand( generateFollowUnfollowCommand() ) .withLinkCommand( generateLinkCommand() ); Map<String, String> globals = new HashMap(); globals.put( "filter", param ); model.droolsQuery( globals, "filterTimelineRecentAssets", "10" ); socialTimelineWidget.init( model ); main.setSocialWidget( socialTimelineWidget ); } private ParameterizedCommand<LinkCommandParams> generateLinkCommand() { return linkCommandGenerator.generateLinkCommand(); } private boolean loggedUserFollowSelectedUser( SocialUser socialUser ) { return socialUser.getFollowersName().contains( loggedUser.getIdentifier() ); } private ParameterizedCommand<String> generateFollowUnfollowCommand() { return new ParameterizedCommand<String>() { @Override public void execute( final String parameter ) { socialUserRepositoryAPI.call( new RemoteCallback<SocialUser>() { public void callback( SocialUser socialUser ) { if ( loggedUserFollowSelectedUser( socialUser ) ) { socialUserService.call().userUnfollowAnotherUser( loggedUser.getIdentifier(), socialUser.getUserName() ); } else { socialUserService.call().userFollowAnotherUser( loggedUser.getIdentifier(), socialUser.getUserName() ); } setupPage(); } } ).findSocialUser( parameter ); } }; } private ParameterizedCommand<String> generateUserClickCommand() { return new ParameterizedCommand<String>() { @Override public void execute( final String parameter ) { placeManager.goTo( "UserHomePagePerspective" ); loadUserPageEvent.fire( new LoadUserPageEvent( parameter ) ); } }; } private void createHeaderMenuList() { final List<String> reposNames = new ArrayList<String>(); reposNames.add( Constants.INSTANCE.AllRepositories() ); repositoryService.call( new RemoteCallback<Collection<String>>() { public void callback( Collection<String> repositories ) { for ( String repository : repositories ) { reposNames.add( repository ); } header.setUpdatesMenuList( reposNames ); } } ).getRepositories(); } @AfterInitialization public void loadContent() { } @WorkbenchPartTitle public String getTitle() { return Constants.INSTANCE.LatestChanges(); } @WorkbenchPartView public UberView<SocialHomePageMainPresenter> getView() { return view; } }