package com.jinhe.tss;
import java.io.File;
import java.util.List;
import org.apache.log4j.Logger;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.SQLExec;
import org.dom4j.Document;
import org.dom4j.Element;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit38.AbstractTransactionalJUnit38SpringContextTests;
import org.springframework.test.context.transaction.TransactionConfiguration;
import com.jinhe.tss.cms.CMSConstants;
import com.jinhe.tss.cms.entity.ArticleType;
import com.jinhe.tss.cms.service.IArticleTypeService;
import com.jinhe.tss.component.dynproperty.support.IRemotePropertyService;
import com.jinhe.tss.core.Config;
import com.jinhe.tss.core.Global;
import com.jinhe.tss.core.cachepool.extend.connection.DBHelper;
import com.jinhe.tss.core.sso.IdentityCard;
import com.jinhe.tss.core.sso.TokenUtil;
import com.jinhe.tss.core.sso.context.Context;
import com.jinhe.tss.core.util.FileHelper;
import com.jinhe.tss.core.util.URLUtil;
import com.jinhe.tss.core.util.XMLDocUtil;
import com.jinhe.tss.portal.PortalConstants;
import com.jinhe.tss.portal.entity.Decorator;
import com.jinhe.tss.portal.entity.ElementGroup;
import com.jinhe.tss.portal.entity.Layout;
import com.jinhe.tss.portal.service.IElementService;
import com.jinhe.tss.um.UMConstants;
import com.jinhe.tss.um.entity.Group;
import com.jinhe.tss.um.helper.dto.OperatorDTO;
import com.jinhe.tss.um.permission.PermissionService;
import com.jinhe.tss.um.permission.ResourcePermission;
import com.jinhe.tss.um.service.IGroupService;
import com.jinhe.tss.um.service.ILoginService;
import com.jinhe.tss.um.service.IResourceRegisterService;
/**
* 初始化数据库。
*
* 需使用 src/main/resources目录下的配置文件,比如persistence.xml, application.properties等。
* 另外,初始化时需要把applicationContext.xml的<property name="generateDdl" value="true" /> 设置为true
*/
@ContextConfiguration(
locations={
"classpath:spring/core-applicationContext.xml",
"classpath:spring/component-applicationContext.xml",
"classpath:spring/um-applicationContext.xml",
"classpath:spring/cms-applicationContext.xml",
"classpath:spring/portal-applicationContext.xml",
"classpath:spring/applicationContext.xml"
}
)
@TransactionConfiguration(defaultRollback = false) // 不自动回滚,否则后续的test中没有初始化的数据
public class InitDatabase extends AbstractTransactionalJUnit38SpringContextTests {
Logger log = Logger.getLogger(this.getClass());
@Autowired private IResourceRegisterService resourceRegisterService;
@Autowired private ResourcePermission resourcePermission;
@Autowired private IRemotePropertyService propertyService;
@Autowired private IGroupService groupService;
@Autowired private ILoginService loginSerivce;
@Autowired private PermissionService permissionService;
@Autowired private IArticleTypeService articleTypeService;
@Autowired private IElementService elementService;
protected void setUp() throws Exception {
super.setUp();
Global.setContext(super.applicationContext);
}
public void testInitDatabase() {
log.info("create tss databse schema success.");
//------------------------------- 利用ANT執行sql目錄下的腳本 --------------------
// 设置数据库参数
SQLExec sqlExec = new SQLExec();
sqlExec.setDriver(Config.getAttribute(DBHelper.DB_CONNECTION_DRIVER_CLASS));
sqlExec.setUrl(Config.getAttribute(DBHelper.DB_CONNECTION_URL));
sqlExec.setUserid(Config.getAttribute(DBHelper.DB_CONNECTION_USERNAME));
sqlExec.setPassword(Config.getAttribute(DBHelper.DB_CONNECTION_PASSWORD));
//有出错的语句该如何处理
SQLExec.OnError onError = new SQLExec.OnError();
onError.setValue("abort"); //abort/conitue/stop
sqlExec.setOnerror(onError);
// 设置是否输出
sqlExec.setPrint(true);
sqlExec.setProject(new Project());
//输出到文件 sql.out 中;不设置该属性,默认输出到控制台
//sqlExec.setOutput(new File("src/sql.out"));
String path = URLUtil.getResourceFileUrl("com/jinhe/tss").getPath();
String sqlpath = path.substring(1, path.indexOf("jinhe-tss") + 9) + "/tss-webapp/sql";
List<File> sqlFiles = FileHelper.listFilesByTypeDeeply(".sql", new File(sqlpath));
for(File sqlFile : sqlFiles) {
if("roleusermapping-init.sql".equals(sqlFile.getName())) {
continue;
}
log.info("開始执行SQL脚本:" + sqlFile);
sqlExec.setSrc(sqlFile); // 要执行的脚本
sqlExec.execute();
}
//-------------------------------初始化系統的必要数据 --------------------
// 初始化虚拟登录用户信息
OperatorDTO loginUser = new OperatorDTO(UMConstants.ADMIN_USER_ID, UMConstants.ADMIN_USER_NAME);
String token = TokenUtil.createToken("1234567890", UMConstants.ADMIN_USER_ID);
IdentityCard card = new IdentityCard(token, loginUser);
Context.initIdentityInfo(card);
// 获取登陆用户的权限(拥有的角色)并保存到用户权限(拥有的角色)对应表
List<Object[]> userRoles = loginSerivce.getUserRolesAfterLogin(UMConstants.ADMIN_USER_ID);
permissionService.saveUserRolesAfterLogin(userRoles, UMConstants.ADMIN_USER_ID);
initUM();
initCMS();
initPortal();
log.info("init tss databse base data over.");
}
/**
* 初始化UM、CMS、Portal相关应用、资源类型、权限选型信息
*/
private void initUM() {
/* 初始化应用系统、资源、权限项 */
String path = URLUtil.getResourceFileUrl("com/jinhe/tss").getPath();
String rootpath = path.substring(1, path.indexOf("jinhe-tss") + 9);
String sqlpath = rootpath + "/tss-webapp/sql";
Document doc = XMLDocUtil.createDocByAbsolutePath(sqlpath + "/tss-application-config.xml");
resourceRegisterService.setInitial(true);
resourceRegisterService.applicationRegisterByXML(doc, UMConstants.PLATFORM_SYSTEM_APP);
resourceRegisterService.setInitial(false);
// 补全SQL初始化出来的系统级用户组
Long[] groupIds = new Long[] {-2L, -3L, -4L, -7L, -8L, -9L};
for(Long groupId : groupIds) {
Group group = groupService.getGroupById(groupId);
if ( Group.MAIN_GROUP_TYPE.equals( group.getGroupType() ) ) {
resourcePermission.addResource(group.getId(), UMConstants.MAINGROUP_RESOURCE_TYPE_ID);
}
if ( Group.ASSISTANT_GROUP_TYPE.equals( group.getGroupType() )) {
resourcePermission.addResource(group.getId(), UMConstants.ASSISTANTGROUP_RESOURCE_TYPE_ID);
}
if ( Group.OTHER_GROUP_TYPE.equals( group.getGroupType() ) ) {
resourcePermission.addResource(group.getId(), UMConstants.OTHERAPPGROUP_RESOURCE_TYPE_ID);
}
}
/** 注册动态属性实体(包括用户、各种用户组、站点栏目、文章等) */
String umDynpath = rootpath + "/tss-um/src/main/resources/template/dyninit/";
List<String> files = FileHelper.listFilesByType(".xml", new File(umDynpath));
for( String fileName : files ){
Document dynDoc = XMLDocUtil.createDocByAbsolutePath(umDynpath + "/" + fileName);
propertyService.importDynableEntity(dynDoc.asXML());
}
String cmsDynpath = rootpath + "/tss-cms/src/main/resources/template/dyninit/";
files = FileHelper.listFilesByType(".xml", new File(cmsDynpath));
for( String fileName : files ){
if (!"ArticleProperties.xml".equals(fileName)) {
Document dynDoc = XMLDocUtil.createDocByAbsolutePath(cmsDynpath + "/" + fileName);
propertyService.importDynableEntity(dynDoc.asXML());
}
}
}
/** 初始化一个普通文章类型 */
protected void initCMS() {
ArticleType articleTypeGroup = new ArticleType();
articleTypeGroup.setName("基本类型组");
articleTypeGroup.setParentId(CMSConstants.HEAD_NODE_ID);
articleTypeGroup.setIsGroup(CMSConstants.TRUE);
articleTypeGroup = articleTypeService.createArticleType(articleTypeGroup);
ArticleType defaultArticleType = new ArticleType();
defaultArticleType.setName("默认文章类型");
defaultArticleType.setParentId(articleTypeGroup.getId());
defaultArticleType.setIsGroup(CMSConstants.FALSE);
defaultArticleType = articleTypeService.createArticleType(defaultArticleType);
// 将文章的模板导入到动态属性实体中
Document doc = XMLDocUtil.createDoc(CMSConstants.TEMPLATE_ARTICLE_PROPERTY);
Element root = doc.getRootElement();
root.addAttribute("name", defaultArticleType.getName());
root.addAttribute("code", defaultArticleType.getEntityCode());
propertyService.importDynableEntity(doc.asXML());
}
/** 初始化默认的修饰器,布局器 */
private void initPortal() {
ElementGroup defaultLayoutGroup = new ElementGroup();
defaultLayoutGroup.setName("默认布局器组");
defaultLayoutGroup.setType(ElementGroup.LAYOUT_TYPE);
defaultLayoutGroup.setParentId(PortalConstants.ROOT_ID);
defaultLayoutGroup = elementService.saveGroup(defaultLayoutGroup);
Layout defaultLayout = new Layout();
defaultLayout.setIsDefault(PortalConstants.TRUE);
defaultLayout.setGroupId(defaultLayoutGroup.getId());
Document document = XMLDocUtil.createDoc("template/initialize/defaultLayout.xml");
Element propertyElement = document.getRootElement().element("property");
String layoutName = propertyElement.elementText("name");
defaultLayout.setName(layoutName);
defaultLayout.setPortNumber(new Integer(propertyElement.elementText("portNumber")));
defaultLayout.setDefinition(document.asXML());
elementService.saveElement(defaultLayout);
ElementGroup defaultDecoratorGroup = new ElementGroup();
defaultDecoratorGroup.setName("默认修饰器组");
defaultDecoratorGroup.setType(ElementGroup.DECORATOR_TYPE);
defaultDecoratorGroup.setParentId(PortalConstants.ROOT_ID);
defaultDecoratorGroup = elementService.saveGroup(defaultDecoratorGroup);
Decorator defaultDecorator = new Decorator();
defaultDecorator.setIsDefault(PortalConstants.TRUE);
defaultDecorator.setGroupId(defaultDecoratorGroup.getId());
document = XMLDocUtil.createDoc("template/initialize/defaultDecorator.xml");
propertyElement = document.getRootElement().element("property");
String decoratorName = propertyElement.elementText("name");
defaultDecorator.setName(decoratorName);
defaultDecorator.setDefinition(document.asXML());
elementService.saveElement(defaultDecorator);
}
}