1.5.5.2. Portlet配置

Portlet采用两种生成方式

1、代码级

实现标准接口生成portlet,用于需要获取系统数据或者进行权限控制的portlet

标准portlet生成接口

import java.util.List;

/**
 * <p>Title: Portlet接口</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2014</p>
 * <p>Company: seeyon.com</p>
 * @since CTP2.0
 */
public interface BasePortlet {
  /**
   * 获取PortletId
   */
  public String getId();
  /**
   * 获取Portlet数据
   */
  public List<ImagePortletLayout> getData();
  /**
  * 异步加载单个Portlet数据
  * @param portletId
  * @return
  */
  public ImagePortletLayout getPortlet(String portletId);
  /**
  * 获取数据总数
  * 不需要统计数据的请返回-1
  * @param String portlet数据Id Portlet数据唯一标识
  */
  public int getDataCount(String portletId);
  /**
  * 数据权限控制,用于判断该生成类产生的某一条Portlet数据是否可用
  * @param String portlet数据Id Portlet数据唯一标识
  */
  public boolean isAllowDataUsed(String portletId);
  /**
  * 数据生成类权限控制
  */
  public boolean isAllowUsed();
}

Portlet枚举

package com.seeyon.ctp.portal.portlet;
/**
 * <p>Title: Portlet枚举</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2014</p>
 * <p>Company: seeyon.com</p>
 * @since CTP2.0
 */
public class PortletConstants {
	/**
	 * 图片类型枚举
	 */
	public static enum ImageType{
		system,//系统图片
		link,//外部图片
	}
	/**
	 * Portlet访问地址类型
	 */
	public static enum UrlType{
		space,//空间地址
		workspace,//系统工作区地址
		open,//系统新窗口地址
		link,//外部地址
	}
	/**
	 * Portlet大小枚举
	 */
	public static enum PortletSize{
		middle,//中
		large,//大
	}
	/**
	 * Portlet分类
	 */
	public static enum PortletCategory{
		space,//空间
		common, //常用
		collaboration,//协同工作
		formbizconfigs, //表单应用
		edoc,//公文管理
		timeManagement, //目标管理
		meeting,//会议管理
		doc, //知识社区
		performanceAnalysis,//协同驾驶舱
		integratedoffice,//综合办公
		publicInformation, //文化建设
		hrmanage,//HR管理
		uccenter,//UC中心
		info,//信息报送
		businessfactory,//业务生成器
		mytool,//我的工具
	}
	public static enum PortletAppCategory{
		u8,//U8
		allinone,//all-in-one集成
		nc,//nc
	}
}

图片Portlet对象

package com.seeyon.ctp.portal.portlet;

import java.util.List;

/**
 * <p>Title: 工作桌面Portlet接口</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2014</p>
 * <p>Company: seeyon.com</p>
 * @since CTP2.0
 */
public class ImagePortletLayout {
	/**
	 * Portlet生成器Id,不需要设置
	 */
	public String id;
	/**
	 * PortletId,唯一标识,用于权限判断及Portlet数据更新
	 */
	public String portletId;
	/**
	 * 资源code
	 * 设置资源code的portlet会与系统资源权限控制保持一致,所以资源 code与资源权限里的RESOURCE_CODE需要一致
	 * 不设置资源code的portlet不受系统资源权限控制,所有用户均可访问
	 */
	public String resourceCode;
	/**
	 * 插件Id
	 * 设置模块插件Id的Portlet与系统的插件统一权限
	 * 不设置模块插件Id的Portlet不受插件权限控制
	 */
	public String pluginId;
	/**
	 * Portlet名称,可以为空
	 */
	public String portletName;
	/**
	 * Portlet显示名称,不能为空,预制数据需要国际化
	 */
	public String displayName;
	/**
	 * Portlet分类
	 * @see PortletConstants.PortletCategory
	 */
	public String category;
	/**
	 * Portlet点击响应地址
	 */
	public String portletUrl;
	/**
	 * Portlet点击响应地址类型
	 * @see PortletConstants.UrlType
	 */
	public String portletUrlType;
	/**
	 * Portlet大小
	 * @see PortletConstants.PortletSize
	 */
	public int size = 1;
	/**
	 * Portlet排序
	 */
	public int order;
	/**
	 * Portlet展示图片
	 */
	public List<ImageLayout> imageLayouts;
	/**
	 * 获取Portlet生成器Id
	 */
	public String getId() {
		return id;
	}
	/**
	 * 设置Portlet生成器Id,各实现不需要设置
	 */
	public void setId(String id) {
		this.id = id;
	}
	public List<ImageLayout> getImageLayouts() {
		return imageLayouts;
	}
	public void setImageLayouts(List<ImageLayout> imageLayouts) {
		this.imageLayouts = imageLayouts;
	}
	/**
	 * PortletId,唯一标识,用于权限判断及Portlet数据更新
	 */
	public String getPortletId() {
		return portletId;
	}
	/**
	 * PortletId,唯一标识,用于权限判断及Portlet数据更新
	 */
	public void setPortletId(String portletId) {
		this.portletId = portletId;
	}
	
	public String getPortletName() {
		return portletName;
	}
	public void setPortletName(String portletName) {
		this.portletName = portletName;
	}
	public String getDisplayName() {
		return displayName;
	}
	public void setDisplayName(String displayName) {
		this.displayName = displayName;
	}
	public String getCategory() {
		return category;
	}
	public void setCategory(String category) {
		this.category = category;
	}
	public int getSize() {
		return size;
	}
	public void setSize(int size) {
		this.size = size;
	}
	public int getOrder() {
		return order;
	}
	public void setOrder(int order) {
		this.order = order;
	}
	public String getPortletUrl() {
		return portletUrl;
	}
	public void setPortletUrl(String portletUrl) {
		this.portletUrl = portletUrl;
	}
	public String getPortletUrlType() {
		return portletUrlType;
	}
	public void setPortletUrlType(String portletUrlType) {
		this.portletUrlType = portletUrlType;
	}
	public String getResourceCode() {
		return resourceCode;
	}
	public void setResourceCode(String resourceCode) {
		this.resourceCode = resourceCode;
	}
	public String getPluginId() {
		return pluginId;
	}
	public void setPluginId(String pluginId) {
		this.pluginId = pluginId;
	}
}

单位图片新闻示例

public class NewsPortlet implements BasePortlet {

    private static final Log log = LogFactory.getLog(NewsPortlet.class);

    private NewsDataManager  newsDataManager;
    private FileManager      fileManager;

    public void setNewsDataManager(NewsDataManager newsDataManager) {
        this.newsDataManager = newsDataManager;
    }

    public void setFileManager(FileManager fileManager) {
        this.fileManager = fileManager;
    }

    @Override
    public String getId() {
        return "NewsPortlet";
    }

    @Override
    public List<ImagePortletLayout> getData() {
        List<ImagePortletLayout> layouts = new ArrayList<ImagePortletLayout>();

        ImagePortletLayout accountImageNews = new ImagePortletLayout();

        accountImageNews.setPortletId("AccountImageNews");
        accountImageNews.setResourceCode("F05_newsIndexAccount");
        accountImageNews.setPluginId("news");
        accountImageNews.setPortletName("单位图片新闻");
        accountImageNews.setDisplayName("bbs.imageNews.label");
        accountImageNews.setCategory(PortletCategory.publicInformation.name());
        accountImageNews.setPortletUrl("/newsData.do?method=imageNewsMore&spaceType=" + SpaceType.corporation.ordinal() + "&imageOrFocus=0");
        accountImageNews.setPortletUrlType(UrlType.workspace.name());
        accountImageNews.setSize(PortletSize.large.ordinal());
        accountImageNews.setOrder(0);

        List<ImageLayout> accountImageNewsIms = new ArrayList<ImageLayout>();
        try {
            Pagination.setNeedCount(false);
            Pagination.setFirstResult(0);
            Pagination.setMaxResults(5);
            List<NewsData> newsDatas = newsDataManager.findByReadUser4ImageNews(AppContext.getCurrentUser(), Constants.ImageNews, SpaceType.corporation.ordinal(), null);

            if (CollectionUtils.isNotEmpty(newsDatas)) {
                for (NewsData newsData : newsDatas) {
                    V3XFile file = fileManager.getV3XFile(newsData.getImageId());
                    Long fileId = 0L;
                    Date date = new Date();
                    if (file != null) {
                        fileId = file.getId();
                        date = file.getCreateDate();
                    }
                    String createDate = Datetimes.formatDate(date);

                    ImageLayout accountImageNewsImg = new ImageLayout();
                    accountImageNewsImg.setImageTitle(newsData.getTitle());
                    accountImageNewsImg.setImageUrl("/fileUpload.do?method=showRTE&fileId=" + fileId + "&createDate=" + createDate + "&type=image&showType=small");
                    accountImageNewsIms.add(accountImageNewsImg);
                }
            } else {
                ImageLayout accountImageNewsImg = new ImageLayout();
                accountImageNewsImg.setImageTitle("bbs.imageNews.label");
                accountImageNewsImg.setImageUrl("d_photonews.png");
                accountImageNewsIms.add(accountImageNewsImg);
            }
        } catch (Exception e) {
            log.error("", e);
        }

        accountImageNews.setImageLayouts(accountImageNewsIms);
        layouts.add(accountImageNews);
        return layouts;
    }

    @Override
    public ImagePortletLayout getPortlet(String portletId) {
        List<ImagePortletLayout> layouts = this.getData();
        if (layouts != null) {
            for (ImagePortletLayout layout : layouts) {
                if (portletId.equals(layout.getPortletId())) {
                    return layout;
                }
            }
        }
        return null;
    }

    @Override
    public int getDataCount(String portletId) {
        return -1;
    }

    @Override
    public boolean isAllowDataUsed(String portletId) {
        return true;
    }

    @Override
    public boolean isAllowUsed() {
        return true;
    }

}

2、配置级

已办事项portlet示例,配置文件名称为portletCfg.xml。

	<portlet>
		<!-- 唯一标识,用于权限判断及Portlet数据更新 -->
		<portletId>doneevent</portletId>
		<!-- 需要进行权限判断时使用的资源Id-->
		<resourceCode></resourceCode>
		<!-- 需要进行权限判断时使用的插件Id-->
		<pluginId>collaboration</pluginId>
		<!-- Portlet名称,可以为空 -->
		<portletName>已办事项</portletName>
		<!-- Portlet显示名称,不能为空,预制数据需要国际化 -->
		<displayName>已办事项</displayName>
		<!-- Portlet分类 -->
		<category>collaboration</category>
		<!-- Portlet点击响应地址 -->
		<portletUrl><![CDATA[/collaboration/collaboration.do?method=listDone]]></portletUrl>
		<!-- Portlet点击响应地址类型,space:空间地址,workspace:系统工作区地址,open:系统新窗口地址,link:外部地址 -->
		<portletUrlType>workspace</portletUrlType>
		<!-- Portlet大小,0:中,1:大 -->
		<size>0</size>
		<!-- Portlet排序 -->
		<order>5</order>
		<!-- Portlet展示图片 -->
		<imageLayouts>
			<imageLayout>
				<!-- 图片路径 -->
				<imageUrl><![CDATA[d_doneevent.png]]></imageUrl>
				<!-- 图片名称 -->
				<imageName>已办事项</imageName>
				<!-- 图片内容标题 -->
				<imageTitle></imageTitle>
				<!-- 图片内容摘要 -->
				<summary></summary>
			</imageLayout>
		</imageLayouts>
	</portlet>

前台调用Portlet接口

package com.seeyon.ctp.portal.portlet.manager;

import java.util.List;
import java.util.Map;

import com.seeyon.ctp.common.exceptions.BusinessException;
import com.seeyon.ctp.portal.portlet.ImagePortletLayout;
import com.seeyon.ctp.portal.portlet.bo.CollaborationInfo;

/**
 * <p>Title: 工作桌面Portlet接口</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2014</p>
 * <p>Company: seeyon.com</p>
 * @since CTP2.0
 */
public interface PortletManager {
	/**
	 * 获取Portlet数据
	 */
	public ImagePortletLayout getData(Map params) throws BusinessException ;
	/**
	 * 获取数据总数
	 */
	public int getDataCount(Map params) throws BusinessException ;
	/**
	 * 获取代办数据
	 * @return
	 * @throws BusinessException
	 */
	public List<Map<String,Object>> getPendingData() throws BusinessException ;
	/**
	 * 工作桌面待办处理
	 * @param affairId
	 * @param summaryId 协同主表Id
	 * @param comment
	 * @param attitude 态度 [0:已阅,1:同意,2:不同意]
	 * @throws BusinessException
	 */
	public void finishWorkitemQuick(Map<String,String> param) throws BusinessException;
	/**
	 * 显示工作桌面待办数据详情
	 * @param affairId
	 * @param summaryId
	 * @param objectId
	 * @param subObjectId
	 * @param subApp
	 * @param sender
	 * @param rightId
	 * @return
	 * @throws BusinessException
	 */
	public CollaborationInfo getCollaboration(Map<String,String> param) throws BusinessException;

}

Portlet组件分类调用接口

package com.seeyon.ctp.portal.portlet.manager;

import java.util.List;

import com.seeyon.ctp.portal.portlet.ImagePortletLayout;
import com.seeyon.ctp.portal.portlet.PortletConstants;
/**
 * <p>Title: 工作桌面首页接口</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2014</p>
 * <p>Company: seeyon.com</p>
 * @since CTP2.0
 */
public interface BasePortletSelector {
	/**
	 * 获取Portlet展示数据
	 * @param String PortletCategory @see {@link PortletConstants}
	 * @return
	 */
	public List<ImagePortletLayout> selectPortletTreeData(String portletCategory);
}