帆软报表设计器源代码。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

506 lines
12 KiB

package com.fr.file;
import com.fr.base.FRContext;
import com.fr.base.svg.IconUtils;
import com.fr.design.file.TemplateResourceManager;
import com.fr.io.FineEncryptUtils;
import com.fr.base.io.XMLEncryptUtils;
import com.fr.design.file.NodeAuthProcessor;
import com.fr.design.gui.itree.filetree.FileNodeComparator;
import com.fr.design.gui.itree.filetree.FileTreeIcon;
import com.fr.design.i18n.Toolkit;
import com.fr.event.Event;
import com.fr.event.EventDispatcher;
import com.fr.event.Listener;
import com.fr.file.filetree.FileNode;
import com.fr.general.ComparatorUtils;
import com.fr.io.EncryptUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.CoreConstants;
import com.fr.stable.StableUtils;
import com.fr.stable.project.ProjectConstants;
import com.fr.workspace.WorkContext;
import com.fr.workspace.Workspace;
import com.fr.workspace.WorkspaceEvent;
import com.fr.workspace.server.entity.WorkResourceTempRenameStream;
import com.fr.workspace.server.entity.template.TemplateListBean;
import com.fr.workspace.server.repository.system.WorkspaceSystemInfo;
import com.fr.workspace.server.repository.template.TemplateRepository;
import javax.swing.*;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
public class FileNodeFILE implements FILE {
public static String webRootPath = WorkspaceSystemInfo.getINSTANCE().getWebRootPath();
private static String[] supportTypes = TemplateRepository.getInstance().getSupportedTypes();
static {
EventDispatcher.listen(WorkspaceEvent.AfterSwitch, new Listener<Workspace>() {
@Override
public void on(Event event, Workspace workspace) {
webRootPath = WorkspaceSystemInfo.getINSTANCE().getWebRootPath();
supportTypes = TemplateRepository.getInstance().getSupportedTypes();
}
});
}
private FileNode node;
//记录下FILE对应的运行环境,每次创建都设置下当前的运行环境
private String envPath;
/**
* 是否有全部权限
*/
private boolean hasFullAuth = true;
public FileNodeFILE(FileNodeFILE parent, String name, boolean isDir) {
FileNode fn = parent.node;
String parentDir;
if (fn.isDirectory()) {
parentDir = fn.getEnvPath();
} else {
parentDir = fn.getParent();
}
this.node = new FileNode(StableUtils.pathJoin(parentDir, name), isDir);
this.envPath = WorkContext.getCurrent().getPath();
this.hasFullAuth = NodeAuthProcessor.getInstance().checkFileNodeAuth(node);
}
public FileNodeFILE(FileNode node) {
this.node = node;
this.envPath = WorkContext.getCurrent().getPath();
this.hasFullAuth = NodeAuthProcessor.getInstance().checkFileNodeAuth(node);
}
public FileNodeFILE(FileNode node, boolean hasFullAuth) {
this(node);
this.hasFullAuth = hasFullAuth;
}
public FileNodeFILE(String envPath) {
this.node = null;
this.envPath = envPath;
}
public FileNodeFILE(FileNode node, String envPath) {
this.node = node;
this.envPath = envPath;
this.hasFullAuth = NodeAuthProcessor.getInstance().checkFileNodeAuth(node);
}
public FileNodeFILE(FileNode node, String envPath, boolean hasFullAuth) {
this(node, envPath);
this.hasFullAuth = hasFullAuth;
}
/**
* @return 是否有完整权限
*/
public boolean hasFullAuth() {
return hasFullAuth;
}
/**
* 前缀
*
* @return 前缀
*/
@Override
public String prefix() {
if (ComparatorUtils.equals(getEnvPath(), webRootPath)) {
return FILEFactory.WEBREPORT_PREFIX;
}
return FILEFactory.ENV_PREFIX;
}
/**
* @return
*/
public String getEnvPath() {
return this.envPath;
}
/**
* 是否是目录
*
* @return 是则返回true
*/
@Override
public boolean isDirectory() {
return ComparatorUtils.equals(node, null) || node.isDirectory();
}
/**
* @return
*/
@Override
public String getName() {
if (node == null) {
return null;
}
if (ComparatorUtils.equals(node.getEnvPath(), ProjectConstants.REPORTLETS_NAME)) {
return Toolkit.i18nText("Fine-Design_Basic_Utils_Report_Runtime_Env");
} else {
return node.getName();
}
}
/**
* @return
*/
@Override
public Icon getIcon() {
if (node == null) {
return null;
}
if (ComparatorUtils.equals(node.getEnvPath(), ProjectConstants.REPORTLETS_NAME)) {
return IconUtils.readIcon("/com/fr/base/images/oem/logo.svg");
} else {
if (!hasFullAuth) {
return FileTreeIcon.getFolderHalfImageIcon();
}
return FileTreeIcon.getIcon(node);
}
}
/**
* @return
*/
@Override
public String getPath() {
if (node == null) {
return "";
}
return node.getEnvPath();
}
/**
* @param path
*/
@Override
public void setPath(String path) {
node.setEnvPath(path);
}
/**
* @return
*/
@Override
public FILE getParent() {
if (node == null) {
return null;
}
return new FileNodeFILE(new FileNode(node.getParent(), true));
}
/**
* 文件
*
* @return 文件组
*/
@Override
public FILE[] listFiles() {
if (ComparatorUtils.equals(node, null)) {
node = new FileNode(CoreConstants.SEPARATOR, true);
}
if (!node.isDirectory()) {
return new FILE[]{this};
}
try {
FileNode[] nodeArray;
nodeArray = listFile(node.getEnvPath());
Arrays.sort(nodeArray, new FileNodeComparator(supportTypes));
return fileNodeArray2FILEArray(nodeArray, envPath);
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
return new FILE[0];
}
}
private FILE[] fileNodeArray2FILEArray(FileNode[] nodeArray, String envPath) {
return NodeAuthProcessor.getInstance().parser2FILEArray(nodeArray, envPath);
}
/**
* 根目录文件地址
*
* @param rootFilePath 根文件路径
* @return 返回文件节点
*/
private FileNode[] listFile(String rootFilePath) {
try {
TemplateListBean bean = new TemplateListBean();
bean.setTargetPath(rootFilePath);
bean.setListWebroot(ComparatorUtils.equals(envPath, webRootPath));
return TemplateRepository.getInstance().list(bean);
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
return new FileNode[0];
}
/**
* 创建文件夹
*
* @param name 文件夹名字
* @return 创建成功返回true
*/
@Override
public boolean createFolder(String name) {
if (ComparatorUtils.equals(node, null) || !node.isDirectory()) {
return false;
}
try {
return WorkContext.getWorkResource().createDirectory(StableUtils.pathJoin(node.getEnvPath(), name));
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
return false;
}
}
/**
* 是否锁住
*
* @return 文件被锁返回true
*/
public boolean isLocked() {
if (node == null) {
return false;
}
try {
return FRContext.getCommonOperator().fileLocked(node.getEnvPath());
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
return false;
}
}
/**
* 是否存在
*
* @return 文件存在返回 true
*/
@Override
public boolean exists() {
if (node == null) {
return false;
}
// 当运行环境不一致,返回false
if (!isCurrentEnv()) {
return false;
}
try {
return TemplateRepository.getInstance().exists(node.getEnvPath());
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
return false;
}
}
/**
* 是否是当前环境
*
* @return 是报表当前环境返回true
*/
public boolean isCurrentEnv() {
return ComparatorUtils.equals(WorkContext.getCurrent().getPath(), envPath);
}
/**
* 创建文件
*
* @return 成功返回true
*/
@Override
public boolean mkfile() {
if (node == null) {
return false;
}
try {
return WorkContext.getWorkResource().createFile(node.getEnvPath());
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
return false;
}
}
/**
* 作为输入流
*
* @return 输入流
* @throws Exception
*/
@Override
public InputStream asInputStream() throws Exception {
if (node == null) {
return null;
}
String envPath = node.getEnvPath();
// envPath必须以reportlets开头
if (!envPath.startsWith(ProjectConstants.REPORTLETS_NAME)) {
return null;
}
InputStream in = TemplateResourceManager.getResource().readTemplate(
StableUtils.pathJoin(
ProjectConstants.REPORTLETS_NAME,
envPath.substring(ProjectConstants.REPORTLETS_NAME.length() + 1)
));
return envPath.endsWith(".cpt") || envPath.endsWith(".frm")
? XMLEncryptUtils.decodeInputStream(EncryptUtils.decodeInputStream(FineEncryptUtils.decode(in))) : in;
}
/**
* 作为输出流
*
* @return 返回输出流
* @throws Exception
*/
@Override
public OutputStream asOutputStream() throws Exception {
if (ComparatorUtils.equals(node, null)) {
return null;
}
String envPath = node.getEnvPath();
// envPath必须以reportlets开头
if (!envPath.startsWith(ProjectConstants.REPORTLETS_NAME)) {
return null;
}
return new WorkResourceTempRenameStream(envPath);
}
/**
* 关闭模板
*
* @throws Exception
*/
@Override
public void closeTemplate() throws Exception {
if (node == null) {
return;
}
String envPath = node.getEnvPath();
// envPath必须以reportlets开头
if (!envPath.startsWith(ProjectConstants.REPORTLETS_NAME)) {
return;
}
// 看上去好像没用了
//FRContext.getCommonOperator().unlockTemplate(
// envPath.substring(ProjectConstants.REPORTLETS_NAME.length() + 1));
}
/**
* 得到环境的全名
*
* @return
*/
@Override
public String getEnvFullName() {
return this.node.getEnvPath().substring(ProjectConstants.REPORTLETS_NAME.length() + 1);
}
/**
* 是否是内存文件
*
* @return 是则返回true
*/
@Override
public boolean isMemFile() {
return false;
}
/**
* 是否是环境文件
*
* @return 是则返回true
*/
@Override
public boolean isEnvFile() {
return true;
}
/**
* 是佛相同
*
* @param obj
* @return
*/
public boolean equals(Object obj) {
if (!(obj instanceof FileNodeFILE)) {
return false;
}
return ComparatorUtils.equals(this.envPath, ((FileNodeFILE) obj).envPath) && ComparatorUtils.equals(this.node, ((FileNodeFILE) obj).node);
}
/**
* 返回hash码
*
* @return 返回hash码
*/
public int hashCode() {
int hash = 5;
hash = 61 * hash + (this.node != null ? this.node.hashCode() : 0);
hash = 61 * hash + (this.envPath != null ? this.envPath.hashCode() : 0);
return hash;
}
/**
* 作为字符串返回
*
* @return String 字符串
*/
public String toString() {
return prefix() + (this.node != null ? this.node.getEnvPath() : "");
}
}