/* 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.activiti.explorer.ui.login;
import java.io.IOException;
import java.io.InputStream;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ProcessEngines;
import org.activiti.explorer.ExplorerApp;
import org.activiti.explorer.I18nManager;
import org.activiti.explorer.Messages;
import org.activiti.explorer.NotificationManager;
import org.activiti.explorer.ViewManager;
import org.activiti.explorer.identity.LoggedInUser;
import org.activiti.explorer.ui.mainlayout.ExplorerLayout;
import com.vaadin.ui.CustomLayout;
import com.vaadin.ui.LoginForm.LoginEvent;
import com.vaadin.ui.LoginForm.LoginListener;
/**
* @author Joram Barrez
*/
public class LoginPage extends CustomLayout {
private static final long serialVersionUID = 1L;
protected IdentityService identityService = ProcessEngines.getDefaultProcessEngine().getIdentityService();
protected I18nManager i18nManager;
protected ViewManager viewManager;
protected NotificationManager notificationManager;
protected LoginHandler loginHandler;
public LoginPage() {
super();
// Check if the login HTML is available on the classpath. If present, the activiti-theme files are
// inside a jar and should be loaded from here to be added as resource in UIDL, since the layout html
// is not present in a webapp-folder. If not found, just use the default way of defining the template, by name.
InputStream loginHtmlStream = getClass().getResourceAsStream("/VAADIN/themes/" + ExplorerLayout.THEME + "/layouts/"
+ ExplorerLayout.CUSTOM_LAYOUT_LOGIN + ".html");
if(loginHtmlStream != null) {
try {
initTemplateContentsFromInputStream(loginHtmlStream);
} catch (IOException e) {
throw new RuntimeException("Error while loading login page template from classpath resource", e);
}
} else {
setTemplateName(ExplorerLayout.CUSTOM_LAYOUT_LOGIN);
}
this.i18nManager = ExplorerApp.get().getI18nManager();
this.viewManager = ExplorerApp.get().getViewManager();
this.notificationManager = ExplorerApp.get().getNotificationManager();
this.loginHandler = ExplorerApp.get().getLoginHandler();
addStyleName(ExplorerLayout.STYLE_LOGIN_PAGE);
initUi();
}
protected void initUi() {
// Login form is an a-typical Vaadin component, since we want browsers to fill the password fields
// which is not the case for ajax-generated UI components
ExplorerLoginForm loginForm = new ExplorerLoginForm();
addComponent(loginForm, ExplorerLayout.LOCATION_LOGIN);
// Login listener
loginForm.addListener(new ActivitiLoginListener());
}
protected void refreshUi() {
// Quick and dirty 'refresh'
removeAllComponents();
initUi();
}
class ActivitiLoginListener implements LoginListener {
private static final long serialVersionUID = 1L;
public void onLogin(LoginEvent event) {
String userName = event.getLoginParameter("username"); // see the input field names in CustomLoginForm
String password = event.getLoginParameter("password"); // see the input field names in CustomLoginForm
// Delegate authentication to handler
LoggedInUser loggedInUser = loginHandler.authenticate(userName, password);
if (loggedInUser != null) {
ExplorerApp.get().setUser(loggedInUser);
viewManager.showDefaultPage();
} else {
refreshUi();
notificationManager.showErrorNotification(Messages.LOGIN_FAILED_HEADER, i18nManager.getMessage(Messages.LOGIN_FAILED_INVALID));
}
}
}
}