/*
*
* * Copyright (c) 2016. David Sowerby
* *
* * 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 uk.q3c.krail.core.view.component;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Panel;
import com.vaadin.ui.themes.ChameleonTheme;
import net.engio.mbassy.bus.common.PubSubSupport;
import net.engio.mbassy.listener.Handler;
import net.engio.mbassy.listener.Listener;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.q3c.krail.core.eventbus.BusMessage;
import uk.q3c.krail.core.eventbus.SessionBusProvider;
import uk.q3c.krail.core.i18n.CurrentLocale;
import uk.q3c.krail.core.i18n.LabelKey;
import uk.q3c.krail.core.i18n.LocaleChangeBusMessage;
import uk.q3c.krail.core.i18n.Translate;
import uk.q3c.krail.core.navigate.Navigator;
import uk.q3c.krail.core.navigate.sitemap.StandardPageKey;
import uk.q3c.krail.core.shiro.SubjectIdentifier;
import uk.q3c.krail.core.shiro.SubjectProvider;
import uk.q3c.krail.core.user.status.UserStatusBusMessage;
import uk.q3c.krail.core.user.status.UserStatusChangeSource;
import uk.q3c.util.ID;
import java.util.Optional;
/**
* Represents the "logged in" status of the current {@link Subject}.
* <p>
*
* @author David Sowerby 16 Jan 2013
*/
// TODO I18N
@Listener
public class DefaultUserStatusPanel extends Panel implements UserStatusPanel, ClickListener, UserStatusChangeSource {
private static Logger log = LoggerFactory.getLogger(DefaultUserStatusPanel.class);
private final Label usernameLabel;
private final Button login_logout_Button;
private final Navigator navigator;
private final Provider<Subject> subjectProvider;
private final Translate translate;
private final SubjectIdentifier subjectIdentifier;
private final PubSubSupport<BusMessage> eventBus;
private final CurrentLocale currentLocale;
@Inject
protected DefaultUserStatusPanel(Navigator navigator, SubjectProvider subjectProvider, Translate translate, SubjectIdentifier subjectIdentifier,
SessionBusProvider eventBusProvider, CurrentLocale currentLocale) {
super();
this.navigator = navigator;
this.subjectProvider = subjectProvider;
this.translate = translate;
this.subjectIdentifier = subjectIdentifier;
this.eventBus = eventBusProvider.get();
this.currentLocale = currentLocale;
// eventBus.subscribe(this);
setSizeFull();
addStyleName(ChameleonTheme.PANEL_BORDERLESS);
usernameLabel = new Label();
login_logout_Button = new Button();
login_logout_Button.addClickListener(this);
login_logout_Button.setImmediate(true);
HorizontalLayout hl = new HorizontalLayout();
hl.setSpacing(true);
hl.addComponent(usernameLabel);
hl.addComponent(login_logout_Button);
this.setContent(hl);
setIds();
build();
}
protected final void build() {
log.debug("building with Locale={}", currentLocale.getLocale());
boolean authenticated = subjectProvider.get()
.isAuthenticated();
String caption = (authenticated) ? translate.from(LabelKey.Log_Out) : translate.from(LabelKey.Log_In);
log.debug("Caption is '{}'", caption);
login_logout_Button.setCaption(caption.toLowerCase());
usernameLabel.setValue(subjectIdentifier.subjectName());
}
private void setIds() {
setId(ID.getId(Optional.empty(), this));
login_logout_Button.setId(ID.getId(Optional.empty(), this, login_logout_Button));
usernameLabel.setId(ID.getId(Optional.empty(), this, usernameLabel));
}
/**
* Responds to the {@code busMessage} by rebuilding the panel to reflect a change in user status.
*
* @param busMessage
* the message received from the event bus
*/
@Handler
public void userStatusChange(UserStatusBusMessage busMessage) {
log.debug("user status has changed to authenticated = '{}', reset the user status panel", busMessage.isAuthenticated());
build();
}
@Override
public String getActionLabel() {
return login_logout_Button.getCaption();
}
@Override
public String getUserId() {
return usernameLabel.getValue();
}
public Button getLogin_logout_Button() {
return login_logout_Button;
}
@Override
public void buttonClick(ClickEvent event) {
boolean authenticated = subjectProvider.get()
.isAuthenticated();
if (authenticated) {
subjectProvider.get()
.logout();
log.debug("Publishing UserStatusBusMessage from: '{}'", this.getClass()
.getSimpleName());
eventBus.publish(new UserStatusBusMessage(this, false));
} else {
navigator.navigateTo(StandardPageKey.Log_In);
}
}
@Handler
public void localeChanged(LocaleChangeBusMessage busMessage) {
log.debug("locale change to {}", busMessage.getNewLocale());
build();
}
}