Add initialization manager.

This commit is contained in:
robin shine 2013-09-08 14:58:03 +08:00
parent 389e502a53
commit 65473b2720
26 changed files with 482 additions and 77 deletions

View File

@ -52,7 +52,7 @@ public class DefaultGeneralDao implements GeneralDao {
getSession().delete(entity);
}
protected Session getSession() {
private Session getSession() {
return sessionProvider.get();
}
@ -92,6 +92,8 @@ public class DefaultGeneralDao implements GeneralDao {
@Override
public Object find(DetachedCriteria detachedCriteria) {
Criteria criteria = detachedCriteria.getExecutableCriteria(getSession());
criteria.setFirstResult(0);
criteria.setMaxResults(1);
return criteria.uniqueResult();
}

View File

@ -2,9 +2,6 @@ package com.pmease.commons.persistence.dao;
import java.util.List;
import javax.inject.Provider;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
@ -17,15 +14,12 @@ public class DefaultGenericDao<T extends AbstractEntity> implements GenericDao<T
private GeneralDao generalDao;
private Provider<Session> sessionProvider;
protected final Class<T> entityClass;
@SuppressWarnings("unchecked")
@Inject
public DefaultGenericDao(GeneralDao generalDao, Provider<Session> sessionProvider) {
public DefaultGenericDao(GeneralDao generalDao) {
this.generalDao = generalDao;
this.sessionProvider = sessionProvider;
List<Class<?>> typeArguments = ClassUtils.getTypeArguments(DefaultGenericDao.class, getClass());
entityClass = ((Class<T>) typeArguments.get(0));
}
@ -88,9 +82,14 @@ public class DefaultGenericDao<T extends AbstractEntity> implements GenericDao<T
return query(criterions, null, 0, 0);
}
@SuppressWarnings("unchecked")
@Override
public T find(Criterion[] criterions) {
return find(criterions, null);
}
@SuppressWarnings("unchecked")
@Override
public T find(Criterion[] criterions, Order[] orders) {
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(entityClass);
if (criterions != null) {
@ -98,10 +97,12 @@ public class DefaultGenericDao<T extends AbstractEntity> implements GenericDao<T
detachedCriteria.add(criterion);
}
if (orders != null) {
for (Order order: orders)
detachedCriteria.addOrder(order);
}
return (T) generalDao.find(detachedCriteria);
}
protected Session getSession() {
return sessionProvider.get();
}
}

View File

@ -87,9 +87,7 @@ public interface GeneralDao {
* @param detachedCriteria
* Hibernate {@link DetachedCriteria}
* @return
* the single entity. null if not found
* @throws
* HibernateException if there is more than one matching result
* the first matching entity, or null if not found
*/
Object find(DetachedCriteria detachedCriteria);

View File

@ -4,14 +4,13 @@ import java.util.List;
import javax.annotation.Nullable;
import org.hibernate.HibernateException;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import com.pmease.commons.persistence.AbstractEntity;
public interface GenericDao<T extends AbstractEntity> {
/**
* Get the entity with the specified type and id from the datastore.
* If none is found, return null.
@ -88,16 +87,28 @@ public interface GenericDao<T extends AbstractEntity> {
List<T> query(@Nullable Criterion[] criterions);
/**
* This method expects to lookup a single entity with specified criteria
* This method expects to lookup a single entity with specified criteria.
*
* @param criterions
* Hibernate criterions used to find the object
* Hibernate criterions used to find the object, use <i>null</i> if
* criterions are not interested
* @return
* the single entity. null if not found
* @throws
* HibernateException if there is more than one matching result
* any matching entity. null if not found
*/
Object find(@Nullable Criterion[] criterions);
T find(@Nullable Criterion[] criterions);
/**
* This method expects to find the first matching entity.
*
* @param criterions
* Hibernate criterions used to find the object, use <i>null</i> if
* criterions are not interested
* @param orders
* orders to search by, use <i>null</i> if order is not interested
* @return
* the first matching entity. null if not found
*/
T find(@Nullable Criterion[] criterions, @Nullable Order[] orders);
/**
* Count entity matching specified hibernate criterions.
@ -111,4 +122,5 @@ public interface GenericDao<T extends AbstractEntity> {
* number of entities matching specified criterions
*/
int count(@Nullable Criterion[] criterions);
}

View File

@ -8,6 +8,7 @@ import com.pmease.commons.loader.AppName;
import com.pmease.commons.persistence.PrefixedNamingStrategy;
import com.pmease.commons.security.AbstractRealm;
import com.pmease.commons.web.AbstractWicketConfig;
import com.pmease.gitop.core.permission.UserRealm;
/**
* NOTE: Do not forget to rename moduleClass property defined in the pom if you've renamed this class.

View File

@ -0,0 +1,21 @@
package com.pmease.gitop.core;
import java.io.Serializable;
public abstract class ManualConfig {
private final Serializable setting;
public ManualConfig(Serializable setting) {
this.setting = setting;
}
public Serializable getSetting() {
return setting;
}
public abstract Skippable getSkippable();
public abstract void complete();
}

View File

@ -0,0 +1,5 @@
package com.pmease.gitop.core;
public interface Skippable {
void skip();
}

View File

@ -0,0 +1,65 @@
package com.pmease.gitop.core.manager;
import javax.annotation.Nullable;
import com.google.inject.ImplementedBy;
import com.pmease.commons.persistence.dao.GenericDao;
import com.pmease.gitop.core.manager.impl.DefaultConfigManager;
import com.pmease.gitop.core.model.Config;
import com.pmease.gitop.core.setting.MailSetting;
import com.pmease.gitop.core.setting.StorageSetting;
@ImplementedBy(DefaultConfigManager.class)
public interface ConfigManager extends GenericDao<Config> {
/**
* Retrieve config by key.
* <p>
* @param key
* key of the config
* @return
* config associated with specified key, or <i>null</i> if
* no config record found for the key
*/
Config getConfig(Config.Key key);
/**
* Get storage setting.
* <p>
* @return
* storage setting, never <i>null</i>
* @throws
* RuntimeException if storage setting record is not found
* @throws
* NullPointerException if storage setting record exists but value is null
*/
StorageSetting getStorageSetting();
/**
* Save specified storage setting.
* <p>
* @param storageSetting
* storage setting to be saved
*/
void saveStorageSetting(StorageSetting storageSetting);
/**
* Get mail setting.
* <p>
* @return
* mail setting, or <i>null</i> if mail setting record exists but value is
* null.
* @throws
* RuntimeException if mail setting record is not found
*/
MailSetting getMailSetting();
/**
* Save specified mail setting.
* <p>
* @param mailSetting
* mail setting to be saved. Use <i>null</i> to clear the setting (but
* setting record will still be remained in database)
*/
void saveMailSetting(@Nullable MailSetting mailSetting);
}

View File

@ -0,0 +1,14 @@
package com.pmease.gitop.core.manager;
import java.util.List;
import com.google.inject.ImplementedBy;
import com.pmease.gitop.core.ManualConfig;
import com.pmease.gitop.core.manager.impl.DefaultInitManager;
@ImplementedBy(DefaultInitManager.class)
public interface InitManager {
List<ManualConfig> init();
}

View File

@ -12,7 +12,7 @@ public interface UserManager extends GenericDao<User> {
* Find root account in the system.
*
* @return
* root account of the system, or null if root account has not been populated
* root account of the system. Never be <i>null</i>
*/
User getRootUser();

View File

@ -1,11 +1,8 @@
package com.pmease.gitop.core.manager.impl;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.hibernate.Session;
import com.pmease.commons.persistence.dao.DefaultGenericDao;
import com.pmease.commons.persistence.dao.GeneralDao;
import com.pmease.gitop.core.manager.AuthorizationManager;
@ -15,8 +12,8 @@ import com.pmease.gitop.core.model.Authorization;
public class DefaultAuthorizationManager extends DefaultGenericDao<Authorization> implements AuthorizationManager {
@Inject
public DefaultAuthorizationManager(GeneralDao generalDao, Provider<Session> sessionProvider) {
super(generalDao, sessionProvider);
public DefaultAuthorizationManager(GeneralDao generalDao) {
super(generalDao);
}
}

View File

@ -1,10 +1,8 @@
package com.pmease.gitop.core.manager.impl;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
@ -21,8 +19,8 @@ import com.pmease.gitop.core.model.Repository;
public class DefaultBranchManager extends DefaultGenericDao<Branch> implements BranchManager {
@Inject
public DefaultBranchManager(GeneralDao generalDao, Provider<Session> sessionProvider) {
super(generalDao, sessionProvider);
public DefaultBranchManager(GeneralDao generalDao) {
super(generalDao);
}

View File

@ -0,0 +1,84 @@
package com.pmease.gitop.core.manager.impl;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import com.google.common.base.Preconditions;
import com.pmease.commons.persistence.Transactional;
import com.pmease.commons.persistence.dao.DefaultGenericDao;
import com.pmease.commons.persistence.dao.GeneralDao;
import com.pmease.gitop.core.manager.ConfigManager;
import com.pmease.gitop.core.model.Config;
import com.pmease.gitop.core.model.Config.Key;
import com.pmease.gitop.core.setting.MailSetting;
import com.pmease.gitop.core.setting.StorageSetting;
@Singleton
public class DefaultConfigManager extends DefaultGenericDao<Config> implements ConfigManager {
@Inject
public DefaultConfigManager(GeneralDao generalDao) {
super(generalDao);
}
@Transactional
@Override
public StorageSetting getStorageSetting() {
Config config = getConfig(Key.STORAGE);
if (config != null) {
StorageSetting storageSetting = (StorageSetting) config.getSetting();
Preconditions.checkNotNull(storageSetting);
return storageSetting;
} else {
throw new RuntimeException("Unable to find storage setting record.");
}
}
@Transactional
@Override
public void saveStorageSetting(StorageSetting storageSetting) {
Preconditions.checkNotNull(storageSetting);
Config config = getConfig(Key.STORAGE);
if (config == null) {
config = new Config();
config.setKey(Key.STORAGE);
}
config.setSetting(storageSetting);
save(config);
}
@Transactional
@Override
public Config getConfig(Key key) {
return find(new Criterion[]{Restrictions.eq("key", key)});
}
@Transactional
@Override
public MailSetting getMailSetting() {
Config config = getConfig(Key.STORAGE);
if (config != null) {
MailSetting mailSetting = (MailSetting) config.getSetting();
return mailSetting;
} else {
throw new RuntimeException("Unable to find mail setting record.");
}
}
@Transactional
@Override
public void saveMailSetting(MailSetting mailSetting) {
Config config = getConfig(Key.STORAGE);
if (config == null) {
config = new Config();
config.setKey(Key.STORAGE);
}
config.setSetting(mailSetting);
save(config);
}
}

View File

@ -0,0 +1,101 @@
package com.pmease.gitop.core.manager.impl;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.hibernate.criterion.Order;
import com.pmease.commons.persistence.Transactional;
import com.pmease.gitop.core.ManualConfig;
import com.pmease.gitop.core.Skippable;
import com.pmease.gitop.core.manager.ConfigManager;
import com.pmease.gitop.core.manager.InitManager;
import com.pmease.gitop.core.manager.UserManager;
import com.pmease.gitop.core.model.Config;
import com.pmease.gitop.core.model.Config.Key;
import com.pmease.gitop.core.model.User;
import com.pmease.gitop.core.setting.MailSetting;
import com.pmease.gitop.core.setting.StorageSetting;
@Singleton
public class DefaultInitManager implements InitManager {
private final UserManager userManager;
private final ConfigManager configManager;
@Inject
public DefaultInitManager(UserManager userManager, ConfigManager configManager) {
this.userManager = userManager;
this.configManager = configManager;
}
@Transactional
@Override
public List<ManualConfig> init() {
List<ManualConfig> manualConfigs = new ArrayList<ManualConfig>();
User rootUser = userManager.find(null, new Order[]{Order.asc("id")});
if (rootUser == null) {
manualConfigs.add(new ManualConfig(new User()) {
@Override
public Skippable getSkippable() {
return null;
}
@Override
public void complete() {
userManager.save((User) getSetting());
}
});
}
Config storageConfig = configManager.getConfig(Key.STORAGE);
if (storageConfig == null || storageConfig.getSetting() == null) {
manualConfigs.add(new ManualConfig(new StorageSetting()) {
@Override
public Skippable getSkippable() {
return null;
}
@Override
public void complete() {
configManager.saveStorageSetting((StorageSetting) getSetting());
}
});
}
Config mailConfig = configManager.getConfig(Key.MAIL);
if (mailConfig == null) {
manualConfigs.add(new ManualConfig(new MailSetting()) {
@Override
public Skippable getSkippable() {
return new Skippable() {
@Override
public void skip() {
configManager.saveMailSetting(null);
}
};
}
@Override
public void complete() {
configManager.saveMailSetting((MailSetting) getSetting());
}
});
}
return manualConfigs;
}
}

View File

@ -1,11 +1,8 @@
package com.pmease.gitop.core.manager.impl;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.hibernate.Session;
import com.pmease.commons.persistence.dao.DefaultGenericDao;
import com.pmease.commons.persistence.dao.GeneralDao;
import com.pmease.gitop.core.manager.MergeRequestManager;
@ -15,8 +12,8 @@ import com.pmease.gitop.core.model.MergeRequest;
public class DefaultMergeRequestManager extends DefaultGenericDao<MergeRequest> implements MergeRequestManager {
@Inject
public DefaultMergeRequestManager(GeneralDao generalDao, Provider<Session> sessionProvider) {
super(generalDao, sessionProvider);
public DefaultMergeRequestManager(GeneralDao generalDao) {
super(generalDao);
}
}

View File

@ -1,11 +1,8 @@
package com.pmease.gitop.core.manager.impl;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.hibernate.Session;
import com.pmease.commons.persistence.dao.DefaultGenericDao;
import com.pmease.commons.persistence.dao.GeneralDao;
import com.pmease.gitop.core.manager.MergeRequestUpdateManager;
@ -16,8 +13,8 @@ public class DefaultMergeRequestUpdateManager extends DefaultGenericDao<MergeReq
implements MergeRequestUpdateManager {
@Inject
public DefaultMergeRequestUpdateManager(GeneralDao generalDao, Provider<Session> sessionProvider) {
super(generalDao, sessionProvider);
public DefaultMergeRequestUpdateManager(GeneralDao generalDao) {
super(generalDao);
}
}

View File

@ -3,11 +3,8 @@ package com.pmease.gitop.core.manager.impl;
import java.io.File;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.hibernate.Session;
import com.pmease.commons.persistence.dao.DefaultGenericDao;
import com.pmease.commons.persistence.dao.GeneralDao;
import com.pmease.gitop.core.manager.RepositoryManager;
@ -17,8 +14,8 @@ import com.pmease.gitop.core.model.Repository;
public class DefaultRepositoryManager extends DefaultGenericDao<Repository> implements RepositoryManager {
@Inject
public DefaultRepositoryManager(GeneralDao generalDao, Provider<Session> sessionProvider) {
super(generalDao, sessionProvider);
public DefaultRepositoryManager(GeneralDao generalDao) {
super(generalDao);
}
@Override

View File

@ -21,7 +21,7 @@ public class DefaultRoleManager extends DefaultGenericDao<Role> implements RoleM
@Inject
public DefaultRoleManager(GeneralDao generalDao, Provider<Session> sessionProvider) {
super(generalDao, sessionProvider);
super(generalDao);
}
@Transactional

View File

@ -3,10 +3,8 @@ package com.pmease.gitop.core.manager.impl;
import java.util.Collection;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
@ -23,8 +21,8 @@ import com.pmease.gitop.core.model.User;
public class DefaultTeamManager extends DefaultGenericDao<Team> implements TeamManager {
@Inject
public DefaultTeamManager(GeneralDao generalDao, Provider<Session> sessionProvider) {
super(generalDao, sessionProvider);
public DefaultTeamManager(GeneralDao generalDao) {
super(generalDao);
}
@Transactional

View File

@ -1,11 +1,8 @@
package com.pmease.gitop.core.manager.impl;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
@ -22,24 +19,24 @@ import com.pmease.gitop.core.model.User;
@Singleton
public class DefaultUserManager extends DefaultGenericDao<User> implements UserManager {
private volatile User rootUser;
private volatile Long rootUserId;
@Inject
public DefaultUserManager(GeneralDao generalDao, Provider<Session> sessionProvider) {
super(generalDao, sessionProvider);
public DefaultUserManager(GeneralDao generalDao) {
super(generalDao);
}
@Transactional
@Override
public User getRootUser() {
if (rootUser == null) {
Criteria criteria = getSession().createCriteria(User.class).addOrder(Order.asc("id"));
/* the first created user should be root user */
criteria.setFirstResult(0);
criteria.setMaxResults(1);
rootUser = (User) criteria.uniqueResult();
User rootUser;
if (rootUserId == null) {
// The first created user should be root user
rootUser = find(null, new Order[]{Order.asc("id")});
Preconditions.checkNotNull(rootUser);
rootUserId = rootUser.getId();
} else {
rootUser = load(rootUserId);
}
return rootUser;
}

View File

@ -1,9 +1,7 @@
package com.pmease.gitop.core.manager.impl;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
@ -12,14 +10,14 @@ import com.pmease.commons.persistence.dao.DefaultGenericDao;
import com.pmease.commons.persistence.dao.GeneralDao;
import com.pmease.gitop.core.manager.VoteInvitationManager;
import com.pmease.gitop.core.model.MergeRequest;
import com.pmease.gitop.core.model.VoteInvitation;
import com.pmease.gitop.core.model.User;
import com.pmease.gitop.core.model.VoteInvitation;
@Singleton
public class DefaultVoteInvitationManager extends DefaultGenericDao<VoteInvitation> implements VoteInvitationManager {
public DefaultVoteInvitationManager(GeneralDao generalDao, Provider<Session> sessionProvider) {
super(generalDao, sessionProvider);
public DefaultVoteInvitationManager(GeneralDao generalDao) {
super(generalDao);
}
@Transactional

View File

@ -1,9 +1,7 @@
package com.pmease.gitop.core.manager.impl;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
@ -18,8 +16,8 @@ import com.pmease.gitop.core.model.Vote;
@Singleton
public class DefaultVoteManager extends DefaultGenericDao<Vote> implements VoteManager {
public DefaultVoteManager(GeneralDao generalDao, Provider<Session> sessionProvider) {
super(generalDao, sessionProvider);
public DefaultVoteManager(GeneralDao generalDao) {
super(generalDao);
}
@Transactional

View File

@ -0,0 +1,49 @@
package com.pmease.gitop.core.model;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import com.pmease.commons.persistence.AbstractEntity;
/**
* This entity stores object in serialized form, with one entity
* representing one object.
*
*/
@SuppressWarnings("serial")
@Entity
public class Config extends AbstractEntity {
public enum Key {STORAGE, MAIL};
@Column(nullable=false, unique=true)
private Key key;
/*
* This field is allowed to be null to indicate particular setting is not
* available (the record will always be available after interactive setup
* to indicate that the setting has been prompted (although the user may
* skipped the setting), so we can not use existence of record to indicate
* a null setting.
*/
private Serializable setting;
public Key getKey() {
return key;
}
public void setKey(Key key) {
this.key = key;
}
public Serializable getSetting() {
return setting;
}
public void setSetting(Serializable setting) {
this.setting = setting;
}
}

View File

@ -1,4 +1,4 @@
package com.pmease.gitop.core;
package com.pmease.gitop.core.permission;
import java.util.ArrayList;
import java.util.Collection;
@ -17,7 +17,6 @@ import com.pmease.gitop.core.manager.UserManager;
import com.pmease.gitop.core.model.RoleMembership;
import com.pmease.gitop.core.model.TeamMembership;
import com.pmease.gitop.core.model.User;
import com.pmease.gitop.core.permission.ObjectPermission;
@Singleton
public class UserRealm extends AbstractRealm<User> {

View File

@ -0,0 +1,58 @@
package com.pmease.gitop.core.setting;
import java.io.Serializable;
@SuppressWarnings("serial")
public class MailSetting implements Serializable {
private String smtpHost;
private int smtpPort = 25;
private String smtpUser;
private String smtpPassword;
private String senderAddress;
public String getSmtpHost() {
return smtpHost;
}
public void setSmtpHost(String smtpHost) {
this.smtpHost = smtpHost;
}
public int getSmtpPort() {
return smtpPort;
}
public void setSmtpPort(int smtpPort) {
this.smtpPort = smtpPort;
}
public String getSmtpUser() {
return smtpUser;
}
public void setSmtpUser(String smtpUser) {
this.smtpUser = smtpUser;
}
public String getSmtpPassword() {
return smtpPassword;
}
public void setSmtpPassword(String smtpPassword) {
this.smtpPassword = smtpPassword;
}
public String getSenderAddress() {
return senderAddress;
}
public void setSenderAddress(String senderAddress) {
this.senderAddress = senderAddress;
}
}

View File

@ -0,0 +1,18 @@
package com.pmease.gitop.core.setting;
import java.io.Serializable;
@SuppressWarnings("serial")
public class StorageSetting implements Serializable {
private String repoStorageDir;
public String getRepoStorageDir() {
return repoStorageDir;
}
public void setRepoStorageDir(String repoStorageDir) {
this.repoStorageDir = repoStorageDir;
}
}