/* * Copyright 2014 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.guvnor.messageconsole.client.console; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.event.Observes; import javax.inject.Inject; import com.google.gwt.view.client.HasData; import com.google.gwt.view.client.ListDataProvider; import org.guvnor.messageconsole.events.PublishBatchMessagesEvent; import org.guvnor.messageconsole.events.PublishMessagesEvent; import org.guvnor.messageconsole.events.SystemMessage; import org.guvnor.messageconsole.events.UnpublishMessagesEvent; import org.guvnor.messageconsole.whitelist.MessageConsoleWhiteList; import org.jboss.errai.ioc.client.container.SyncBeanDef; import org.jboss.errai.ioc.client.container.SyncBeanManager; import org.jboss.errai.security.shared.api.identity.User; import org.uberfire.client.mvp.PlaceManager; import org.uberfire.client.workbench.events.PerspectiveChange; import org.uberfire.rpc.SessionInfo; /** * Service for Message Console, the Console is a screen that shows compile time errors. * This listens to Messages and if the Console is not open it opens it. */ @ApplicationScoped public class MessageConsoleService { @Inject private SyncBeanManager iocManager; @Inject private PlaceManager placeManager; @Inject private SessionInfo sessionInfo; @Inject private User identity; private ListDataProvider<MessageConsoleServiceRow> dataProvider = new ListDataProvider<MessageConsoleServiceRow>(); //The identifier has been preserved from kie-wb-common so existing .niogit System repositories are not broken private static final String MESSAGE_CONSOLE = "org.kie.workbench.common.screens.messageconsole.MessageConsole"; private String currentPerspective; public void publishMessages( final @Observes PublishMessagesEvent publishEvent ) { publishMessages( publishEvent.getSessionId(), publishEvent.getUserId(), publishEvent.getPlace(), publishEvent.getMessagesToPublish() ); if ( publishEvent.isShowSystemConsole() && checkWhiteList()) { placeManager.goTo( MESSAGE_CONSOLE ); } } public void unpublishMessages( final @Observes UnpublishMessagesEvent unpublishEvent ) { unpublishMessages( unpublishEvent.getSessionId(), unpublishEvent.getUserId(), unpublishEvent.getMessageType(), unpublishEvent.getMessagesToUnpublish() ); if ( unpublishEvent.isShowSystemConsole() && checkWhiteList()) { placeManager.goTo( MESSAGE_CONSOLE ); } } public void publishBatchMessages( final @Observes PublishBatchMessagesEvent publishBatchEvent ) { if ( publishBatchEvent.isCleanExisting() ) { unpublishMessages( publishBatchEvent.getSessionId(), publishBatchEvent.getUserId(), publishBatchEvent.getMessageType(), publishBatchEvent.getMessagesToUnpublish() ); } else { //only remove provided messages removeRowsByMessage( publishBatchEvent.getMessagesToUnpublish() ); } publishMessages( publishBatchEvent.getSessionId(), publishBatchEvent.getUserId(), publishBatchEvent.getPlace(), publishBatchEvent.getMessagesToPublish() ); if ( publishBatchEvent.isShowSystemConsole() && checkWhiteList()) { placeManager.goTo( MESSAGE_CONSOLE ); } } public void addDataDisplay( final HasData<MessageConsoleServiceRow> display ) { dataProvider.addDataDisplay( display ); } public void onPerspectiveChange( final @Observes PerspectiveChange perspectiveChange ) { currentPerspective = perspectiveChange.getIdentifier(); } private void publishMessages( final String sessionId, final String userId, final PublishMessagesEvent.Place place, final List<SystemMessage> messages ) { List<MessageConsoleServiceRow> list = dataProvider.getList(); List<SystemMessage> newMessages = filterMessages( sessionId, userId, null, messages ); List<MessageConsoleServiceRow> newRows = new ArrayList<MessageConsoleServiceRow>(); int index = ( place != null && place == PublishMessagesEvent.Place.TOP ) ? 0 : ( list != null && list.size() > 0 ? list.size() : 0 ); for ( SystemMessage systemMessage : newMessages ) { newRows.add( new MessageConsoleServiceRow( sessionId, userId, systemMessage ) ); } list.addAll( index, newRows ); } private void unpublishMessages( final String sessionId, final String userId, final String messageType, final List<SystemMessage> messages ) { String currentSessionId = sessionInfo != null ? sessionInfo.getId() : null; String currentUserId = identity != null ? identity.getIdentifier() : null; List<MessageConsoleServiceRow> rowsToDelete = new ArrayList<MessageConsoleServiceRow>(); for ( MessageConsoleServiceRow row : dataProvider.getList() ) { if ( sessionId == null && userId == null ) { //delete messages for all users and sessions if ( messageType == null || messageType.equals( row.getMessageType() ) ) { rowsToDelete.add( row ); } } else if ( sessionId != null ) { //messages for a given session, no matter what the user have, sessions are unique. if ( sessionId.equals( currentSessionId ) && ( messageType == null || messageType.equals( row.getMessageType() ) ) ) { rowsToDelete.add( row ); } } else { //messages for a user. if ( userId.equals( currentUserId ) && ( messageType == null || messageType.equals( row.getMessageType() ) ) ) { rowsToDelete.add( row ); } } } dataProvider.getList().removeAll( rowsToDelete ); removeRowsByMessage( messages ); } private void removeRowsByMessage( final List<SystemMessage> messages ) { List<MessageConsoleServiceRow> rowsToDelete = new ArrayList<MessageConsoleServiceRow>(); if ( messages != null ) { for ( MessageConsoleServiceRow row : dataProvider.getList() ) { if ( messages.contains( row.getMessage() ) ) { rowsToDelete.add( row ); } } dataProvider.getList().removeAll( rowsToDelete ); } } private List<SystemMessage> filterMessages( final String sessionId, final String userId, final String messageType, final List<SystemMessage> messages ) { List<SystemMessage> result = new ArrayList<SystemMessage>(); String currentSessionId = sessionInfo != null ? sessionInfo.getId() : null; String currentUserId = identity != null ? identity.getIdentifier() : null; if ( messages != null ) { for ( SystemMessage message : messages ) { if ( sessionId == null && userId == null ) { //messages for all users, all sessions. if ( messageType == null || messageType.equals( message.getMessageType() ) ) { result.add( message ); } } else if ( sessionId != null ) { //messages for a given session, no matter what the user have, sessions are unique. if ( sessionId.equals( currentSessionId ) && ( messageType == null || messageType.equals( message.getMessageType() ) ) ) { result.add( message ); } } else { //messages for a user. if ( userId.equals( currentUserId ) && ( messageType == null || messageType.equals( message.getMessageType() ) ) ) { result.add( message ); } } } } return result; } private boolean checkWhiteList() { // I herd you like lists so I put a list into your list Collection<SyncBeanDef<MessageConsoleWhiteList>> whiteListList = getAvailableWhiteLists(); if (whiteListList.isEmpty()) { return true; } else { return reLookupBean(whiteListList.iterator().next()).getInstance().contains(currentPerspective); } } private SyncBeanDef<MessageConsoleWhiteList> reLookupBean( SyncBeanDef<MessageConsoleWhiteList> baseBean ) { return (SyncBeanDef<MessageConsoleWhiteList>) iocManager.lookupBean( baseBean.getBeanClass() ); } private Collection<SyncBeanDef<MessageConsoleWhiteList>> getAvailableWhiteLists() { return iocManager.lookupBeans(MessageConsoleWhiteList.class); } }