Java tutorial
/* * Copyright 2011-2016 CAST, Inc. * * This file is part of the CAST Wicket Modules: * see <http://code.google.com/p/cast-wicket-modules>. * * The CAST Wicket Modules are free software: you can redistribute and/or * modify them under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * The CAST Wicket Modules are distributed in the hope that they will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this software. If not, see <http://www.gnu.org/licenses/>. */ package org.cast.cwm.service; import com.google.inject.Inject; import net.databinder.models.hib.HibernateListModel; import net.databinder.models.hib.HibernateObjectModel; import net.databinder.models.hib.QueryBuilder; import net.databinder.models.hib.SortableHibernateProvider; import org.apache.wicket.Component; import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider; import org.apache.wicket.extensions.markup.html.repeater.util.SingleSortState; import org.apache.wicket.extensions.markup.html.repeater.util.SortParam; import org.apache.wicket.model.IModel; import org.cast.cwm.data.LoginSession; import org.cast.cwm.data.Period; import org.cast.cwm.data.Role; import org.cast.cwm.data.User; import org.cast.cwm.data.builders.LoginSessionCriteriaBuilder; import org.cast.cwm.data.builders.UserCriteriaBuilder; import org.cast.cwm.data.models.UserListModel; import org.hibernate.Query; import org.hibernate.Session; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.Serializable; import java.util.Date; import java.util.List; /** * Database operations on Users and related classes. * This is a singleton Service class. Actions may be overridden with a subclass; * use setInstance() to register your alternative version. * * Default implementation uses Hibernate. * * @author bgoldowsky * */ public class UserService implements IUserService { @Inject private ICwmService cwmService; /** * Return the class to be used for Users. * Override if your application has it own User subclass. * @return the application's User class */ public Class<? extends User> getUserClass() { return User.class; } /** * Instantiate an instance of the application's User class. * * @return an object of type User or the appropriate subtype. */ @Override public User newUser() { try { return getUserClass().newInstance(); } catch (Exception e) { throw new RuntimeException(e); } } /* (non-Javadoc) * @see org.cast.cwm.service.IUserService#confirmUser(org.cast.cwm.data.User) */ @Override public void confirmUser(User user) { user.setValid(true); user.setSecurityToken(null); cwmService.flushChanges(); } /* (non-Javadoc) * @see org.cast.cwm.service.IUserService#generateSecurityToken(org.apache.wicket.model.IModel) */ @Override public void generateSecurityToken(IModel<User> mUser) { mUser.getObject().generateSecurityToken(); cwmService.flushChanges(); } /* (non-Javadoc) * @see org.cast.cwm.service.IUserService#onUserCreated(IModel, Component) */ @Override public void onUserCreated(IModel<User> mUser, Component trigger) { // Does nothing by default } /* (non-Javadoc) * @see org.cast.cwm.service.IUserService#onUserUpdated(IModel, Component) */ @Override public void onUserUpdated(IModel<User> mUser, Component trigger) { // Does nothing by default. } /* (non-Javadoc) * @see org.cast.cwm.service.IUserService#getAllUsers() */ @Override public IModel<List<User>> getAllUsers() { return new UserListModel(); } /* (non-Javadoc) * @see org.cast.cwm.service.IUserService#getById(long) */ @Override public IModel<User> getById(long userId) { return new HibernateObjectModel<User>(User.class, userId); } /* (non-Javadoc) * @see org.cast.cwm.service.IUserService#getByUsername(java.lang.String) */ @Override public IModel<User> getByUsername(String username) { UserCriteriaBuilder c = new UserCriteriaBuilder(); c.setUsername(username); return new HibernateObjectModel<User>(User.class, c); } /* (non-Javadoc) * @see org.cast.cwm.service.IUserService#getBySubjectId(java.lang.String) */ @Override public IModel<User> getBySubjectId(String subjectId) { UserCriteriaBuilder c = new UserCriteriaBuilder(); c.setSubjectId(subjectId); return new HibernateObjectModel<User>(User.class, c); } /* (non-Javadoc) * @see org.cast.cwm.service.IUserService#getByEmail(java.lang.String) */ @Override public IModel<User> getByEmail(String email) { UserCriteriaBuilder c = new UserCriteriaBuilder(); c.setEmail(email); return new HibernateObjectModel<User>(User.class, c); } // gets both valid and invalid users /* (non-Javadoc) * @see org.cast.cwm.service.IUserService#getAllByEmail(java.lang.String) */ @Override public IModel<User> getAllByEmail(String email) { // Sort valid users to the top SingleSortState<String> sort = new SingleSortState<String>(); SortParam<String> sortParam = new SortParam<String>("valid", false); sort.setSort(sortParam); // it is possible to return both valid and invalid UserCriteriaBuilder c = new UserCriteriaBuilder(); c.setEmail(email); c.setGetAllUsers(true); c.setSortState(sort); UserListModel userListModel = new UserListModel(c); return new HibernateObjectModel<User>(userListModel.getObject().get(0)); } /* (non-Javadoc) * @see org.cast.cwm.service.IUserService#getByFullnameFromPeriod(java.lang.String, java.lang.String, org.apache.wicket.model.IModel) */ @Override public IModel<User> getByFullnameFromPeriod(String firstName, String lastName, IModel<? extends Period> period) { UserCriteriaBuilder c = new UserCriteriaBuilder(); c.setFirstName(firstName); c.setLastName(lastName); c.setPeriod(period); return new HibernateObjectModel<User>(User.class, c); } /* (non-Javadoc) * @see org.cast.cwm.service.IUserService#getByRole(org.cast.cwm.data.Role) */ @Override public UserListModel getByRole(Role role) { UserCriteriaBuilder c = new UserCriteriaBuilder(); c.setRole(role); return new UserListModel(c); } /* (non-Javadoc) * @see org.cast.cwm.service.IUserService#getUserListProvider() */ @Override public ISortableDataProvider<User, String> getUserListProvider() { return getUserListProvider(null); } /* (non-Javadoc) * @see org.cast.cwm.service.IUserService#getUserListProvider(org.apache.wicket.model.IModel) */ @Override public ISortableDataProvider<User, String> getUserListProvider(IModel<? extends Period> mPeriod) { return getUserListProvider(mPeriod, null); } @Override public ISortableDataProvider<User, String> getUserListProvider(IModel<? extends Period> mPeriod, Role role) { UserCriteriaBuilder c = new UserCriteriaBuilder(); c.setPeriod(mPeriod); c.setRole(role); return new SortableHibernateProvider<User>(User.class, c); } /* (non-Javadoc) * @see org.cast.cwm.service.IUserService#getUncachedStudentListProvider(org.apache.wicket.model.IModel) */ @Override public ISortableDataProvider<User, String> getUncachedStudentListProvider(IModel<? extends Period> mPeriod) { UserCriteriaBuilder c = new UserCriteriaBuilder(); c.setPeriod(mPeriod); c.setCacheResults(false); c.setRole(Role.STUDENT); return new SortableHibernateProvider<User>(User.class, c); } /* (non-Javadoc) * @see org.cast.cwm.service.IUserService#getOpenLoginSessions(org.apache.wicket.model.IModel) */ @Override public IModel<List<LoginSession>> getOpenLoginSessions(IModel<User> mUser) { LoginSessionCriteriaBuilder cb = new LoginSessionCriteriaBuilder(); cb.setOpenOnly(true); cb.setUserId(mUser.getObject().getId()); return new HibernateListModel<LoginSession>(LoginSession.class, cb); } /* (non-Javadoc) * @see org.cast.cwm.service.IUserService#getAllLoginSessions(org.apache.wicket.model.IModel) */ @Override public IModel<List<LoginSession>> getAllLoginSessions(IModel<User> mUser) { LoginSessionCriteriaBuilder cb = new LoginSessionCriteriaBuilder(); cb.setOpenOnly(false); cb.setUserId(mUser.getObject().getId()); return new HibernateListModel<LoginSession>(LoginSession.class, cb); } /* (non-Javadoc) * @see org.cast.cwm.service.IUserService#getLoginSessions(org.apache.wicket.model.IModel) */ @Override public LoginData getLoginSessions(IModel<User> user) { return new LoginData(user); } public static class LoginData implements Serializable { private static final long serialVersionUID = 1L; private IModel<User> userModel; private HibernateObjectModel<Object[]> queryModel; public LoginData(IModel<User> user) { userModel = user; queryModel = new HibernateObjectModel<Object[]>(new QueryBuilder() { private static final long serialVersionUID = 1L; @Override public Query build(Session hibernateSession) { Query q = hibernateSession.createQuery( "select count(S), max(S.startTime) from LoginSession S where S.user = :user"); q.setParameter("user", userModel.getObject()); q.setCacheable(true); return q; } }); } public Long getLoginCount() { return queryModel.getObject() == null ? 0 : (Long) queryModel.getObject()[0]; } public Date getLastLogin() { return queryModel.getObject() == null ? null : (Date) queryModel.getObject()[1]; } } }