Просмотр исходного кода

Merge branch 'wrdp' into 'develop'

Wrdp

See merge request o2oa/o2oa!1996
o2null 5 лет назад
Родитель
Сommit
d3a6f7bd74

+ 2 - 2
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/CmsJaxrsFilter.java

@@ -1,6 +1,6 @@
 package com.x.cms.assemble.control.jaxrs;
 
-import com.x.base.core.project.jaxrs.ManagerUserJaxrsFilter;
+import com.x.base.core.project.jaxrs.CipherManagerUserJaxrsFilter;
 
 import javax.servlet.annotation.WebFilter;
 
@@ -40,6 +40,6 @@ import javax.servlet.annotation.WebFilter;
         "/jaxrs/commend/*",
         "/servlet/*"
 }, asyncSupported = true)
-public class CmsJaxrsFilter extends ManagerUserJaxrsFilter {
+public class CmsJaxrsFilter extends CipherManagerUserJaxrsFilter {
 
 }

+ 130 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/document/ActionQueryListDocumentData.java

@@ -0,0 +1,130 @@
+package com.x.cms.assemble.control.jaxrs.document;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.cache.Cache;
+import com.x.base.core.project.cache.CacheManager;
+import com.x.base.core.project.gson.GsonPropertyObject;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.cms.assemble.control.Business;
+import com.x.cms.core.entity.Document;
+import com.x.cms.core.entity.content.Data;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+public class ActionQueryListDocumentData extends BaseAction {
+
+	private static  Logger logger = LoggerFactory.getLogger(ActionQueryListDocumentData.class);
+
+	protected ActionResult<List<Wo>> execute(HttpServletRequest request, EffectivePerson effectivePerson, JsonElement jsonElement) throws Exception {
+		ActionResult<List<Wo>> result = new ActionResult<>();
+		Wi wi = this.convertToWrapIn( jsonElement, Wi.class );
+		Business business = null;
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			business = new Business(emc);
+		}
+		List<Wo> wos = new ArrayList<>();
+		if(wi.getDocIds()!=null && !wi.getDocIds().isEmpty()) {
+			wos = getDocumentQueryResult(business, wi.getDocIds(), effectivePerson);
+		}
+		result.setData(wos);
+		return result;			
+	}
+
+	private List<Wo> getDocumentQueryResult(Business business, List<String> ids, EffectivePerson effectivePerson) throws Exception {
+		List<Wo> wos = new ArrayList<>();
+		Wo wo = null;
+		List<Document> docs = documentQueryService.list(ids);
+		List<String> unitNames = userManagerService.listUnitNamesWithPerson(effectivePerson.getDistinguishedName());
+		List<String> groupNames = userManagerService.listGroupNamesByPerson(effectivePerson.getDistinguishedName());
+		for (Document document : docs){
+			if(this.hasReadPermission(business, document, unitNames, groupNames, effectivePerson, null)) {
+				Cache.CacheKey cacheKey = new Cache.CacheKey(this.getClass(), document.getId());
+				Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
+				if (optional.isPresent()) {
+					wo = (Wo)optional.get();
+				} else {
+					wo = new Wo();
+					WoDocument woOutDocument = WoDocument.copier.copy(document);
+					wo.setDocId(document.getId());
+					wo.setDocument(woOutDocument);
+					wo.setData(documentQueryService.getDocumentData(document));
+					CacheManager.put(cacheCategory, cacheKey, wo);
+				}
+				wos.add(wo);
+			}
+		}
+		
+		return wos;
+	}
+
+	public static class Wo extends GsonPropertyObject {
+		@FieldDescribe( "文档ID." )
+		private String docId;
+
+		@FieldDescribe( "作为输出的CMS文档数据对象." )
+		private WoDocument document;
+
+		@FieldDescribe( "文档所有数据信息." )
+		private Data data;
+
+		public String getDocId() {
+			return docId;
+		}
+
+		public void setDocId(String docId) {
+			this.docId = docId;
+		}
+
+		public WoDocument getDocument() {
+			return document;
+		}
+
+		public void setDocument( WoDocument document) {
+			this.document = document;
+		}
+
+		public Data getData() {
+			return data;
+		}
+
+		public void setData(Data data) {
+			this.data = data;
+		}
+		
+	}
+	
+	public static class WoDocument extends Document {
+		
+		private static final long serialVersionUID = -5076990764713538973L;
+		
+		public static List<String> Excludes = new ArrayList<String>();
+		
+		public static WrapCopier<Document, WoDocument> copier = WrapCopierFactory.wo( Document.class, WoDocument.class, null,JpaObject.FieldsInvisible);
+
+	}
+
+	public static class Wi extends GsonPropertyObject {
+		@FieldDescribe( "文档id" )
+		private List<String> docIds = new ArrayList<>();
+
+		public List<String> getDocIds() {
+			return docIds;
+		}
+
+		public void setDocIds(List<String> docIds) {
+			this.docIds = docIds;
+		}
+	}
+}

+ 10 - 114
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/document/ActionQueryPermissionReadDocument.java

@@ -1,17 +1,14 @@
 package com.x.cms.assemble.control.jaxrs.document;
 
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.WrapBoolean;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
-import com.x.base.core.project.organization.Person;
-import com.x.base.core.project.tools.ListTools;
-import com.x.cms.core.entity.AppInfo;
-import com.x.cms.core.entity.CategoryInfo;
+import com.x.cms.assemble.control.Business;
 import com.x.cms.core.entity.Document;
-import org.apache.commons.lang3.StringUtils;
-import java.util.List;
 
 public class ActionQueryPermissionReadDocument extends BaseAction {
 
@@ -19,6 +16,10 @@ public class ActionQueryPermissionReadDocument extends BaseAction {
 
 	protected ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, String queryPerson) throws Exception {
 		ActionResult<Wo> result = new ActionResult<>();
+		Business business = null;
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			business = new Business(emc);
+		}
 		Wo wo = new Wo();
 		wo.setValue(false);
 		result.setData(wo);
@@ -26,115 +27,10 @@ public class ActionQueryPermissionReadDocument extends BaseAction {
 		if(document == null){
 			return result;
 		}
-		//匿名用户是否可读
-		if(effectivePerson.isAnonymous()){
-			AppInfo appInfo = appInfoServiceAdv.get( document.getAppId() );
-			CategoryInfo categoryInfo = categoryInfoServiceAdv.get(document.getCategoryId());
-			if(appInfo!=null && categoryInfo!=null){
-				boolean flag = true;
-				//检查这个文档所在的栏目和分类是否都是全员可见
-				if( ( ListTools.isNotEmpty( document.getReadPersonList() ) && !document.getReadPersonList().contains( "所有人" ) )
-						|| ListTools.isNotEmpty( document.getReadUnitList() ) || ListTools.isNotEmpty( document.getReadGroupList() ) ) {
-					flag = false;
-				}
-				//检查这个文档所在的栏目和分类是否都是全员可见
-				if( !appInfo.getAllPeopleView() ) {
-					//栏目不可见
-					flag = false;
-				}
-				//检查这个文档所在的栏目和分类是否都是全员可见
-				if( !categoryInfo.getAllPeopleView() ) {
-					//分类不可见
-					flag = false;
-				}
-				wo.setValue(flag);
-				return result;
-			}
-		}else{
-			String personName = effectivePerson.getDistinguishedName();
-			if(effectivePerson.isManager()){
-				if(StringUtils.isNotEmpty(queryPerson)){
-					Person person = userManagerService.getPerson(queryPerson);
-					if(person!=null){
-						personName = person.getDistinguishedName();
-					}else{
-						return result;
-					}
-				}else{
-					wo.setValue(true);
-					return result;
-				}
-			}
-			List<String> unitNames = userManagerService.listUnitNamesWithPerson(personName);
-			List<String> groupNames = userManagerService.listGroupNamesByPerson(personName);
-			//是否是读者
-			if(ListTools.contains(document.getReadPersonList(), getShortTargetFlag(personName)) ||
-					ListTools.contains(document.getReadPersonList(), "所有人")){
-				wo.setValue(true);
-				return result;
-			}
-			for(String unitName : unitNames){
-				if(ListTools.contains(document.getReadUnitList(), getShortTargetFlag(unitName))){
-					wo.setValue(true);
-					return result;
-				}
-			}
-			for(String groupName : groupNames){
-				if(ListTools.contains(document.getReadGroupList(), getShortTargetFlag(groupName))){
-					wo.setValue(true);
-					return result;
-				}
-			}
-			//是否是作者
-			if( ListTools.isNotEmpty( document.getAuthorPersonList() )) {
-				if( document.getAuthorPersonList().contains( personName ) ) {
-					wo.setValue(true);
-					return result;
-				}
-			}
-			if( ListTools.isNotEmpty( document.getAuthorUnitList() )) {
-				if( ListTools.containsAny( unitNames, document.getAuthorUnitList())) {
-					wo.setValue(true);
-					return result;
-				}
-			}
-			if( ListTools.isNotEmpty( document.getAuthorGroupList() )) {
-				if( ListTools.containsAny( groupNames, document.getAuthorGroupList())) {
-					wo.setValue(true);
-					return result;
-				}
-			}
-			//是否是分类的管理者
-			CategoryInfo categoryInfo = categoryInfoServiceAdv.get(document.getCategoryId());
-			if ( categoryInfoServiceAdv.isCategoryInfoManager( categoryInfo, personName, unitNames, groupNames )) {
-				wo.setValue(true);
-				return result;
-			}
-			//是否是栏目的管理者
-			AppInfo appInfo = appInfoServiceAdv.get( document.getAppId() );
-			if (appInfoServiceAdv.isAppInfoManager( appInfo, personName, unitNames, groupNames )) {
-				wo.setValue(true);
-				return result;
-			}
-		}
-		return result;			
-	}
+		wo.setValue(this.hasReadPermission(business, document, null, null, effectivePerson, queryPerson));
 
-	private String getShortTargetFlag(String distinguishedName) {
-		String target = null;
-		if( StringUtils.isNotEmpty( distinguishedName ) ){
-			String[] array = distinguishedName.split("@");
-			StringBuffer sb = new StringBuffer();
-			if( array.length == 3 ){
-				target = sb.append(array[1]).append("@").append(array[2]).toString();
-			}else if( array.length == 2 ){
-				//2段
-				target = sb.append(array[0]).append("@").append(array[1]).toString();
-			}else{
-				target = array[0];
-			}
-		}
-		return target;
+
+		return result;			
 	}
 
 	public static class Wo extends WrapBoolean {

+ 80 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/document/BaseAction.java

@@ -6,9 +6,12 @@ import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.entity.annotation.CheckPersistType;
 import com.x.base.core.project.cache.Cache;
+import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.organization.Person;
 import com.x.base.core.project.tools.ListTools;
 import com.x.cms.assemble.control.Business;
+import com.x.cms.assemble.control.ThisApplication;
 import com.x.cms.assemble.control.service.AppInfoServiceAdv;
 import com.x.cms.assemble.control.service.CategoryInfoServiceAdv;
 import com.x.cms.assemble.control.service.DocCommendPersistService;
@@ -23,6 +26,7 @@ import com.x.cms.assemble.control.service.QueryViewService;
 import com.x.cms.assemble.control.service.UserManagerService;
 import com.x.cms.core.entity.*;
 import com.x.query.core.entity.Item;
+import org.apache.commons.lang3.StringUtils;
 
 public class BaseAction extends StandardJaxrsAction {
 
@@ -208,6 +212,82 @@ public class BaseAction extends StandardJaxrsAction {
 		return false;
 	}
 
+	protected boolean hasReadPermission(Business business, Document document, List<String> unitNames, List<String> groupNames, EffectivePerson effectivePerson, String queryPerson) throws Exception{
+		String personName = effectivePerson.getDistinguishedName();
+		if(effectivePerson.isManager()){
+			if(StringUtils.isNotEmpty(queryPerson)){
+				Person person = userManagerService.getPerson(queryPerson);
+				if(person!=null){
+					personName = person.getDistinguishedName();
+				}else{
+					return false;
+				}
+			}else {
+				return true;
+			}
+		}
+		//是否是读者
+		if(ListTools.contains(document.getReadPersonList(), getShortTargetFlag(personName)) ||
+				ListTools.contains(document.getReadPersonList(), "所有人")){
+			return true;
+		}
+		if(unitNames == null){
+			unitNames = userManagerService.listUnitNamesWithPerson(personName);
+		}
+		for(String unitName : unitNames){
+			if(ListTools.contains(document.getReadUnitList(), getShortTargetFlag(unitName))){
+				return true;
+			}
+		}
+		if (groupNames == null){
+			groupNames = userManagerService.listGroupNamesByPerson(personName);
+		}
+		for(String groupName : groupNames){
+			if(ListTools.contains(document.getReadGroupList(), getShortTargetFlag(groupName))){
+				return true;
+			}
+		}
+		//是否是作者
+		if( ListTools.isNotEmpty( document.getAuthorPersonList() )) {
+			if( document.getAuthorPersonList().contains( personName ) ) {
+				return true;
+			}
+		}
+		if( ListTools.isNotEmpty( document.getAuthorUnitList() )) {
+			if( ListTools.containsAny( unitNames, document.getAuthorUnitList())) {
+				return true;
+			}
+		}
+		if( ListTools.isNotEmpty( document.getAuthorGroupList() )) {
+			if( ListTools.containsAny( groupNames, document.getAuthorGroupList())) {
+				return true;
+			}
+		}
+
+		if(business.isHasPlatformRole(personName, ThisApplication.ROLE_CMSManager)){
+			return true;
+		}
+
+		return false;
+	}
+
+	protected String getShortTargetFlag(String distinguishedName) {
+		String target = null;
+		if( StringUtils.isNotEmpty( distinguishedName ) ){
+			String[] array = distinguishedName.split("@");
+			StringBuffer sb = new StringBuffer();
+			if( array.length == 3 ){
+				target = sb.append(array[1]).append("@").append(array[2]).toString();
+			}else if( array.length == 2 ){
+				//2段
+				target = sb.append(array[0]).append("@").append(array[1]).toString();
+			}else{
+				target = array[0];
+			}
+		}
+		return target;
+	}
+
 
 
 //	/**

+ 19 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/document/DocumentAction.java

@@ -676,4 +676,23 @@ public class DocumentAction extends StandardJaxrsAction{
 		}
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
+
+	@JaxrsMethodDescribe(value = "列示文档数据.", action = ActionQueryListDocumentData.class)
+	@POST
+	@Path("list/document/data")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void query_listDocumentData( @Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request, JsonElement jsonElement ) {
+		EffectivePerson effectivePerson = this.effectivePerson( request );
+		ActionResult<List<ActionQueryListDocumentData.Wo>> result = new ActionResult<>();
+
+		try {
+			result = ((ActionQueryListDocumentData)proxy.getProxy(ActionQueryListDocumentData.class)).execute( request, effectivePerson, jsonElement );
+		} catch (Exception e) {
+			result.error( e );
+			logger.error( e, effectivePerson, request, jsonElement);
+		}
+
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
 }