package com.jinhe.tss.portal;
import java.io.File;
import java.util.List;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.Element;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit38.AbstractTransactionalJUnit38SpringContextTests;
import org.springframework.test.context.transaction.TransactionConfiguration;
import com.jinhe.tss.component.dynproperty.support.IRemotePropertyService;
import com.jinhe.tss.component.log.maintain.LogService;
import com.jinhe.tss.component.support.test.IH2DBServer;
import com.jinhe.tss.component.support.test.TestUtil;
import com.jinhe.tss.core.Global;
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.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.helper.dto.OperatorDTO;
import com.jinhe.tss.um.permission.PermissionHelper;
import com.jinhe.tss.um.permission.PermissionService;
import com.jinhe.tss.um.service.ILoginService;
import com.jinhe.tss.um.service.IResourceRegisterService;
/**
* Junit Test 类里执行构造函数的时候无事务,即构造函数不在单元测试方法的事物边界内。
*/
@ContextConfiguration(
locations={
"classpath:spring/testPortalApplicationContext.xml",
"classpath:spring/component-applicationContext.xml",
"classpath:spring/core-applicationContext.xml",
"classpath:spring/um-applicationContext.xml",
"classpath:spring/cms-applicationContext.xml",
"classpath:spring/cms-upload-applicationContext.xml",
"classpath:spring/portal-applicationContext.xml"
}
, inheritLocations = false // 是否要继承父测试用例类中的 Spring 配置文件,默认为 true
)
@TransactionConfiguration(defaultRollback = false) // 不自动回滚,否则后续的test中没有初始化的数据
public abstract class TxSupportTest4Portal extends AbstractTransactionalJUnit38SpringContextTests {
protected Logger log = Logger.getLogger(this.getClass());
@Autowired protected IResourceRegisterService resourceRegisterService;
@Autowired protected IRemotePropertyService propertyService;
@Autowired protected ILoginService loginSerivce;
@Autowired protected PermissionService permissionService;
@Autowired protected PermissionHelper permissionHelper;
@Autowired protected LogService logService;
@Autowired protected IH2DBServer dbserver;
@Autowired protected IElementService elementService;
protected void setUp() throws Exception {
super.setUp();
Global.setContext(super.applicationContext);
Context.setResponse(new MockHttpServletResponse());
// DB数据在一轮跑多个单元测试中初始化一次就够了。
if( dbserver.isPrepareed() ) {
return;
}
init();
dbserver.setPrepareed(true);
}
/**
* 初始化CMS的动态属性相关模板
*/
protected void init() {
// 初始化数据库脚本
String sqlpath = TestUtil.getInitSQLDir();
log.info( " sql path : " + sqlpath);
TestUtil.excuteSQL(sqlpath + "/component");
TestUtil.excuteSQL(sqlpath + "/um");
TestUtil.excuteSQL(sqlpath + "/cms");
TestUtil.excuteSQL(sqlpath + "/portal");
// 初始化虚拟登录用户信息
login(UMConstants.ADMIN_USER_ID, UMConstants.ADMIN_USER_NAME);
/* 初始化应用系统、资源、权限项 */
Document doc = XMLDocUtil.createDocByAbsolutePath(sqlpath + "/tss-application-config.xml");
resourceRegisterService.setInitial(true);
resourceRegisterService.applicationRegisterByXML(doc, UMConstants.PLATFORM_SYSTEM_APP);
resourceRegisterService.setInitial(false);
// 门户浏览时,freemarker解析时需要用到request里的参数
Context.initRequestContext(new MockHttpServletRequest());
/* 初始化默认的修饰器,布局器 */
initializeDefaultElement();
}
protected static String MODEL_PORTAL_DIR;
protected static String MODEL_LAYOUT_DIR;
protected static String MODEL_DECORATOR_DIR;
protected static String MODEL_PORTLET_DIR;
protected static ElementGroup defaultLayoutGroup;
protected static Layout defaultLayout;
protected static Long defaultLayoutId;
protected static ElementGroup defaultDecoratorGroup;
protected static Decorator defaultDecorator;
protected static Long defaultDecoratorId;
/**
* 初始化默认的修饰器,布局器
*/
public void initializeDefaultElement() {
// 初始化Portal测试的组件模型存放目录(model目录)及freemarker文件的目录
String path = URLUtil.getResourceFileUrl("com/jinhe/tss").getPath();
String rootpath = path.substring(1, path.indexOf("jinhe-tss") + 9);
String portalTargetPath = rootpath + "/tss-portal/target";
MODEL_PORTAL_DIR = FileHelper.createDir(portalTargetPath + "/portal/model/portal").getPath();
MODEL_PORTLET_DIR = FileHelper.createDir(portalTargetPath + "/portal/model/portlet").getPath();
MODEL_LAYOUT_DIR = FileHelper.createDir(portalTargetPath + "/portal/model/layout").getPath();
MODEL_DECORATOR_DIR = FileHelper.createDir(portalTargetPath + "/portal/model/decorator").getPath();
File freemarkerDir = FileHelper.createDir(portalTargetPath + "/freemarker");
FileHelper.writeFile(new File(freemarkerDir + "/common.ftl"), "");
defaultLayoutGroup = new ElementGroup();
defaultLayoutGroup.setName("默认布局器组");
defaultLayoutGroup.setType(ElementGroup.LAYOUT_TYPE);
defaultLayoutGroup.setParentId(PortalConstants.ROOT_ID);
defaultLayoutGroup = elementService.saveGroup(defaultLayoutGroup);
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);
defaultLayoutId = defaultLayout.getId();
defaultDecoratorGroup = new ElementGroup();
defaultDecoratorGroup.setName("默认修饰器组");
defaultDecoratorGroup.setType(ElementGroup.DECORATOR_TYPE);
defaultDecoratorGroup.setParentId(PortalConstants.ROOT_ID);
defaultDecoratorGroup = elementService.saveGroup(defaultDecoratorGroup);
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);
defaultDecoratorId = defaultDecorator.getId();
}
protected void login(Long userId, String loginName) {
OperatorDTO loginUser = new OperatorDTO(userId, loginName);
String token = TokenUtil.createToken("1234567890", userId);
IdentityCard card = new IdentityCard(token, loginUser);
Context.initIdentityInfo(card);
// 获取登陆用户的权限(拥有的角色)并保存到用户权限(拥有的角色)对应表
List<Object[]> userRoles = loginSerivce.getUserRolesAfterLogin(userId);
permissionService.saveUserRolesAfterLogin(userRoles, userId);
}
}