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.
1073 lines
38 KiB
1073 lines
38 KiB
package com.fr.env; |
|
|
|
import com.fr.base.EnvException; |
|
import com.fr.base.TableData; |
|
import com.fr.base.operator.common.CommonOperator; |
|
import com.fr.base.operator.connect.ConnectOperator; |
|
import com.fr.base.operator.file.FileOperator; |
|
import com.fr.base.remote.RemoteDeziConstants; |
|
import com.fr.common.rpc.RemoteCallServerConfig; |
|
import com.fr.common.rpc.netty.MessageSendExecutor; |
|
import com.fr.common.rpc.netty.RemoteCallClient; |
|
import com.fr.core.env.EnvConstants; |
|
import com.fr.core.env.EnvContext; |
|
import com.fr.design.env.RemoteEnvConfig; |
|
import com.fr.data.TableDataSource; |
|
import com.fr.data.impl.EmbeddedTableData; |
|
import com.fr.data.impl.storeproc.StoreProcedure; |
|
import com.fr.dav.AbstractEnv; |
|
import com.fr.dav.DavXMLUtils; |
|
import com.fr.design.DesignerEnvManager; |
|
import com.fr.design.mainframe.DesignerContext; |
|
import com.fr.file.CacheManager; |
|
import com.fr.file.ConnectionConfig; |
|
import com.fr.file.TableDataConfig; |
|
import com.fr.general.CommonIOUtils; |
|
import com.fr.general.ComparatorUtils; |
|
import com.fr.general.IOUtils; |
|
import com.fr.general.Inter; |
|
import com.fr.general.LogRecordTime; |
|
import com.fr.general.LogUtils; |
|
import com.fr.general.http.HttpToolbox; |
|
import com.fr.io.utils.ResourceIOUtils; |
|
import com.fr.json.JSONArray; |
|
import com.fr.json.JSONObject; |
|
import com.fr.log.FineLoggerFactory; |
|
import com.fr.report.DesignAuthority; |
|
import com.fr.report.util.AuthorityXMLUtils; |
|
import com.fr.share.ShareConstants; |
|
import com.fr.stable.ArrayUtils; |
|
import com.fr.stable.EncodeConstants; |
|
import com.fr.stable.Filter; |
|
import com.fr.stable.JavaCompileInfo; |
|
import com.fr.stable.ProductConstants; |
|
import com.fr.stable.StableUtils; |
|
import com.fr.stable.StringUtils; |
|
import com.fr.stable.SvgProvider; |
|
import com.fr.stable.file.XMLFileManagerProvider; |
|
import com.fr.stable.project.ProjectConstants; |
|
import com.fr.stable.xml.XMLTools; |
|
import com.fr.third.guava.base.Strings; |
|
import com.fr.third.guava.collect.ImmutableMap; |
|
import com.fr.web.ResourceConstants; |
|
|
|
import javax.swing.*; |
|
import javax.xml.transform.Source; |
|
import javax.xml.transform.Transformer; |
|
import javax.xml.transform.TransformerConfigurationException; |
|
import javax.xml.transform.TransformerException; |
|
import javax.xml.transform.TransformerFactory; |
|
import javax.xml.transform.dom.DOMSource; |
|
import javax.xml.transform.stream.StreamResult; |
|
import java.awt.*; |
|
import java.io.BufferedReader; |
|
import java.io.ByteArrayInputStream; |
|
import java.io.ByteArrayOutputStream; |
|
import java.io.File; |
|
import java.io.FileInputStream; |
|
import java.io.IOException; |
|
import java.io.InputStream; |
|
import java.io.InputStreamReader; |
|
import java.io.OutputStream; |
|
import java.io.OutputStreamWriter; |
|
import java.io.UnsupportedEncodingException; |
|
import java.util.ArrayList; |
|
import java.util.HashMap; |
|
import java.util.Iterator; |
|
import java.util.Map; |
|
|
|
import static com.fr.third.guava.base.Preconditions.checkArgument; |
|
|
|
/** |
|
* @author null |
|
*/ |
|
public class RemoteEnv extends AbstractEnv<RemoteEnvConfig> implements DesignAuthorityConfigurable { |
|
|
|
private static final String CERT_KEY = "javax.net.ssl.trustStore"; |
|
private static final String PWD_KEY = "javax.net.ssl.trustStorePassword"; |
|
private static final String HTTPS_PREFIX = "https:"; |
|
private final static String[] FILE_TYPE = {"cptx", "cpt", "frm", "form", "cht", "chart"}; |
|
private String buildFilePath; |
|
private RemoteEnvConfig config; |
|
|
|
public RemoteEnv(RemoteEnvConfig config) { |
|
this.config = config; |
|
} |
|
|
|
@Override |
|
public void connect() throws Exception { |
|
RemoteCallClient.getInstance().load(config.getHost(), config.getPort(), RemoteCallServerConfig.getInstance().getSerializeProtocol()); |
|
} |
|
|
|
@Override |
|
public void connectOnce() throws Exception { |
|
RemoteCallClient.getInstance().loadOnce(config.getHost(), config.getPort(), RemoteCallServerConfig.getInstance().getSerializeProtocol(), 10 * 1000); |
|
ConnectOperator operator = RemoteCallClient.getInstance().execute(ConnectOperator.class); |
|
boolean result = false; |
|
try { |
|
result = operator.connect(config.getUsername(), config.getPassword()); |
|
} catch (Exception ignore) { |
|
|
|
} |
|
if (!result) { |
|
throw new Exception("Cannot connect to the remote server!"); |
|
} |
|
} |
|
|
|
@Override |
|
public boolean disconnect() { |
|
MessageSendExecutor.getInstance().stop(); |
|
return true; |
|
} |
|
|
|
@Override |
|
public FileOperator getFileOperator() throws Exception { |
|
return MessageSendExecutor.getInstance().execute(FileOperator.class); |
|
} |
|
|
|
@Override |
|
public CommonOperator getCommonOperator() throws Exception { |
|
return MessageSendExecutor.getInstance().execute(CommonOperator.class); |
|
} |
|
|
|
@Override |
|
public RemoteEnvConfig getEnvConfig() { |
|
return config; |
|
} |
|
|
|
@Override |
|
public String getPath() { |
|
return config.getPath(); |
|
} |
|
|
|
@Override |
|
public String getUser() { |
|
return config.getUsername(); |
|
} |
|
|
|
public String getPassword() { |
|
return config.getPassword(); |
|
} |
|
|
|
@Override |
|
public String getUserID() { |
|
return EnvContext.currentToken(); |
|
} |
|
|
|
@Override |
|
public boolean isLocalEnv() { |
|
return false; |
|
} |
|
|
|
/** |
|
* execute method之后,取返回的 InputStream |
|
*/ |
|
private InputStream filterInputStream(InputStream in) throws Exception { |
|
if (in == null) { |
|
return null; |
|
} |
|
ByteArrayOutputStream out = new ByteArrayOutputStream(); |
|
try { |
|
IOUtils.copyBinaryTo(in, out); |
|
// 看一下传过来的byte[]是不是DesignProcessor.INVALID,如果是的话,就抛Exception |
|
byte[] bytes = out.toByteArray(); |
|
// carl:格式一致传中文 |
|
String message = new String(bytes, EncodeConstants.ENCODING_UTF_8); |
|
if (ComparatorUtils.equals(message, RemoteDeziConstants.NO_SUCH_RESOURCE)) { |
|
return null; |
|
} else if (ComparatorUtils.equals(message, RemoteDeziConstants.INVALID_USER)) { |
|
throw new EnvException(RemoteDeziConstants.INVALID_USER); |
|
} else if (ComparatorUtils.equals(message, RemoteDeziConstants.FILE_LOCKED)) { |
|
JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Remote_File_is_Locked")); |
|
return null; |
|
} |
|
return new ByteArrayInputStream(bytes); |
|
} finally { |
|
synchronized (this) { |
|
in.close(); |
|
out.close(); |
|
} |
|
} |
|
} |
|
|
|
|
|
/** |
|
* nameValuePairs,这个参数要接着this.path,拼成一个URL,否则服务器端req.getParameter是无法得到的 |
|
* |
|
* @param bytes 数据 |
|
* @return 是否成功提交 |
|
* @throws Exception 异常 |
|
*/ |
|
private boolean postBytes2Server(byte[] bytes, HashMap<String, String> para) throws Exception { |
|
filterInputStream(RemoteEnvUtils.simulateRPCByHttpPost(bytes, para, false, this)); |
|
return true; |
|
} |
|
|
|
/** |
|
* 把InputStream转成一段String |
|
* |
|
* @param in InputStream输入流 |
|
* @return 转换后的字符串 |
|
*/ |
|
public static String stream2String(InputStream in) { |
|
if (in == null) { |
|
return null; |
|
} |
|
String result = null; |
|
try { |
|
result = CommonIOUtils.inputStream2String(in, EncodeConstants.ENCODING_UTF_8); |
|
} catch (UnsupportedEncodingException e) { |
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
} |
|
return result; |
|
} |
|
|
|
/** |
|
* 测试连接服务器 |
|
* |
|
* @return 测试连接成功返回true |
|
* @throws Exception 异常 |
|
*/ |
|
public boolean testServerConnection() throws Exception { |
|
return testConnection(true, true, DesignerContext.getDesignerFrame()); |
|
} |
|
|
|
/** |
|
* 测试当前配置是否正确 |
|
* |
|
* @return 链接是否成功 |
|
* @throws Exception 异常 |
|
*/ |
|
@Override |
|
public boolean testServerConnectionWithOutShowMessagePane() throws Exception { |
|
return testConnection(false, true, DesignerContext.getDesignerFrame()); |
|
} |
|
|
|
/** |
|
* 主要用于在环境配置面板中的测试连接按钮时,不要注册进远程环境 |
|
* |
|
* @param messageParentPane 弹框的依赖的面板 |
|
* @return 是否测试连接成功 |
|
* @throws Exception 异常 |
|
*/ |
|
public boolean testConnectionWithOutRegisteServer(Component messageParentPane) throws Exception { |
|
return testConnection(true, false, messageParentPane); |
|
} |
|
|
|
|
|
private boolean testConnection(boolean needMessage, boolean isRegisteServer, Component parentComponent) throws Exception { |
|
checkArgument(parentComponent instanceof Component, "parentComponent should be a java.awt.component"); |
|
Component component = parentComponent; |
|
String url = String.format("%s/connection", EnvConstants.toDecisionPath(getPath())); |
|
ImmutableMap<String, Object> params = ImmutableMap.of( |
|
"version", (Object) ProductConstants.DESIGNER_VERSION |
|
); |
|
ImmutableMap<String, String> headers = ImmutableMap.of( |
|
EnvConstants.USERNAME, getUser(), |
|
EnvConstants.PWD, getPassword()); |
|
String res = HttpToolbox.post(url, params, headers); |
|
if (Strings.isNullOrEmpty(res)) { |
|
if (needMessage) { |
|
JOptionPane.showMessageDialog(component, Inter.getLocText("Datasource-Connection_failed")); |
|
} |
|
return false; |
|
} else if (ComparatorUtils.equals(res, "true")) { |
|
return true; |
|
} else { |
|
if (ComparatorUtils.equals(res, EnvConstants.AUTH_ERROR)) { |
|
JOptionPane.showMessageDialog(component, |
|
Inter.getLocText(new String[]{"Datasource-Connection_failed", "Registration-User_Name", "Password", "Error"}, new String[]{",", "", "", "!"}) |
|
, Inter.getLocText("FR-Server-All_Error"), JOptionPane.ERROR_MESSAGE); |
|
return false; |
|
} else { |
|
if (ComparatorUtils.equals(res, EnvConstants.WAR_ERROR)) { |
|
if (needMessage) { |
|
JOptionPane.showMessageDialog(component, Inter.getLocText(new String[]{"Datasource-Connection_failed", "NS-war-remote"}, new String[]{",", "!"})); |
|
} else { |
|
FineLoggerFactory.getLogger().info(Inter.getLocText(new String[]{"Datasource-Connection_failed", "NS-war-remote"}, new String[]{",", "!"})); |
|
} |
|
return false; |
|
} else { |
|
if (needMessage) { |
|
JOptionPane.showMessageDialog(component, Inter.getLocText("Datasource-Connection_failed")); |
|
} else { |
|
FineLoggerFactory.getLogger().info(Inter.getLocText(new String[]{"Datasource-Connection_failed", "Version-does-not-support"}, new String[]{",", "!"})); |
|
} |
|
return false; |
|
} |
|
} |
|
} |
|
} |
|
|
|
|
|
private void refreshHttpSProperty() { |
|
if (getPath().startsWith(HTTPS_PREFIX) && System.getProperty(CERT_KEY) == null) { |
|
DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); |
|
System.setProperty(CERT_KEY, envManager.getCertificatePath()); |
|
System.setProperty(PWD_KEY, envManager.getCertificatePass()); |
|
} |
|
} |
|
|
|
|
|
/** |
|
* 心跳访问,用来更新当前用户的访问时间 |
|
* |
|
* @throws Exception e |
|
*/ |
|
|
|
/** |
|
* 返回描述该运行环境的名字 |
|
* |
|
* @return 描述环境名字的字符串 |
|
*/ |
|
@Override |
|
public String getEnvDescription() { |
|
return Inter.getLocText("Env-Remote_Server"); |
|
} |
|
|
|
public class Bytes2ServerOutputStream extends OutputStream { |
|
private ByteArrayOutputStream out = new ByteArrayOutputStream(); |
|
private HashMap<String, String> nameValuePairs; |
|
|
|
public Bytes2ServerOutputStream(HashMap<String, String> nameValuePairs) { |
|
this.nameValuePairs = nameValuePairs; |
|
} |
|
|
|
public HashMap<String, String> getNameValuePairs() { |
|
return nameValuePairs; |
|
} |
|
|
|
public ByteArrayOutputStream getOut() { |
|
return out; |
|
} |
|
|
|
public OutputStream getZipOutputStream() throws Exception { |
|
return IOUtils.toZipOut(out); |
|
} |
|
|
|
/** |
|
* post ro Server 提交到服务器 |
|
* |
|
* @return 是否提交成功 |
|
*/ |
|
public boolean post2Server() { |
|
try { |
|
return postBytes2Server(out.toByteArray(), nameValuePairs); |
|
} catch (Exception e) { |
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
return false; |
|
} |
|
} |
|
|
|
/** |
|
* 刷新数出流,并提交 |
|
* |
|
* @throws IOException e |
|
*/ |
|
@Override |
|
public void flush() throws IOException { |
|
super.flush(); |
|
post2Server(); |
|
} |
|
|
|
/** |
|
* 将指定字节写入输入流数组 |
|
* |
|
* @param b 写入的字节 |
|
*/ |
|
@Override |
|
public void write(int b) { |
|
out.write(b); |
|
|
|
} |
|
} |
|
|
|
@Override |
|
public boolean updateAuthorities(DesignAuthority[] authorities) { |
|
refreshHttpSProperty(); |
|
String res = null; |
|
try { |
|
InputStream inputStream = RemoteEnvUtils.updateAuthorities(authorities, this); |
|
inputStream = filterInputStream(inputStream); |
|
res = IOUtils.inputStream2String(inputStream, EncodeConstants.ENCODING_UTF_8); |
|
} catch (Exception e) { |
|
FineLoggerFactory.getLogger().error(e.getMessage()); |
|
} |
|
return StringUtils.isNotEmpty(res) && Boolean.valueOf(res); |
|
} |
|
|
|
@Override |
|
public DesignAuthority[] getAuthorities() { |
|
refreshHttpSProperty(); |
|
DesignAuthority[] authorities = new DesignAuthority[0]; |
|
try { |
|
InputStream inputStream = RemoteEnvUtils.getAuthorities(this); |
|
inputStream = filterInputStream(inputStream); |
|
authorities = AuthorityXMLUtils.readDesignAuthoritiesXML(inputStream); |
|
return authorities; |
|
} catch (Exception e) { |
|
FineLoggerFactory.getLogger().error(e.getMessage()); |
|
} |
|
return authorities; |
|
} |
|
|
|
/** |
|
* 远程设计器设计时,假如开了权限就不可预览了。这边放一个全局的map来开后门 |
|
* |
|
* @param key 键值 |
|
* @param value 值 |
|
* @return 如果写入成功,返回true |
|
* @throws Exception e |
|
*/ |
|
public boolean writePrivilegeMap(String key, String value) throws Exception { |
|
refreshHttpSProperty(); |
|
HashMap<String, String> para = new HashMap<>(); |
|
para.put("op", "fr_remote_design"); |
|
para.put("cmd", "write_privilege_map"); |
|
para.put("current_user", getUser()); |
|
para.put("current_password", getPassword()); |
|
para.put("key", key); |
|
para.put("value", value); |
|
|
|
//jim :加上user,远程设计点击预览时传递用户角色信息 |
|
InputStream input = filterInputStream( |
|
RemoteEnvUtils.simulateRPCByHttpGet(para, false, this) |
|
); |
|
|
|
if (input == null) { |
|
return false; |
|
} |
|
|
|
return Boolean.valueOf(IOUtils.inputStream2String(input, EncodeConstants.ENCODING_UTF_8)); |
|
} |
|
|
|
/** |
|
* DataSource中去除当前角色没有权限访问的数据源 |
|
*/ |
|
@Override |
|
public void removeNoPrivilegeConnection() { |
|
refreshHttpSProperty(); |
|
TableDataConfig dm = TableDataConfig.getInstance(); |
|
|
|
try { |
|
HashMap<String, String> para = new HashMap<>(); |
|
para.put("op", "fs_remote_design"); |
|
para.put("cmd", "env_get_role"); |
|
para.put("currentUsername", this.getUser()); |
|
para.put("currentPwd", this.getPassword()); |
|
|
|
InputStream input = filterInputStream( |
|
RemoteEnvUtils.simulateRPCByHttpGet(para, false, this) |
|
); |
|
JSONArray ja = new JSONArray(stream2String(input)); |
|
ArrayList<String> toBeRemoveTDName = new ArrayList<>(); |
|
for (int i = 0; i < ja.length(); i++) { |
|
String toBeRemoveConnName = (String) ((JSONObject) ja.get(i)).get("name"); |
|
ConnectionConfig.getInstance().removeConnection(toBeRemoveConnName); |
|
Iterator it = dm.getTableDatas().keySet().iterator(); |
|
while (it.hasNext()) { |
|
String tdName = (String) it.next(); |
|
TableData td = dm.getTableData(tdName); |
|
td.registerNoPrivilege(toBeRemoveTDName, toBeRemoveConnName, tdName); |
|
} |
|
} |
|
|
|
for (int i = 0; i < toBeRemoveTDName.size(); i++) { |
|
dm.removeTableData(toBeRemoveTDName.get(i)); |
|
} |
|
} catch (Exception e) { |
|
FineLoggerFactory.getLogger().error(e.getMessage()); |
|
} |
|
} |
|
|
|
@Override |
|
public EmbeddedTableData previewTableData(Object tableData, Map parameterMap, int rowCount) throws Exception { |
|
return previewTableData(null, tableData, parameterMap, rowCount); |
|
} |
|
|
|
/** |
|
* 根据指定的参数生成一个实际可预览的数据集 |
|
* |
|
* @param tableData 带参数的数据集 |
|
* @param parameterMap 参数键值对 |
|
* @param rowCount 需要获取的行数 |
|
* @return 实际的二维数据集 |
|
* @throws Exception 如果生成数据失败则抛出此异常 |
|
*/ |
|
@Override |
|
public EmbeddedTableData previewTableData(TableDataSource dataSource, Object tableData, java.util.Map parameterMap, int rowCount) throws Exception { |
|
ByteArrayOutputStream out = new ByteArrayOutputStream(); |
|
|
|
// 把tableData写成xml文件到out |
|
DavXMLUtils.writeXMLFileTableDataAndSource((TableData) tableData, out); |
|
|
|
// 把parameterMap转成JSON格式的字符串 |
|
JSONObject jo = new JSONObject(parameterMap); |
|
String jsonParameter = jo.toString(); |
|
HashMap<String, String> para = new HashMap<>(); |
|
para.put("op", "fr_remote_design"); |
|
para.put("cmd", "design_preview_td"); |
|
para.put("pars", jsonParameter); |
|
para.put("rowcount", String.valueOf(rowCount)); |
|
InputStream input = postBytes2ServerB(out.toByteArray(), para); |
|
|
|
if (input == null) { |
|
return null; |
|
} |
|
|
|
return (EmbeddedTableData) DavXMLUtils.readXMLTableData(input); |
|
} |
|
|
|
/** |
|
* 根据指定的参数生成一个实际可预览的数据集 |
|
* |
|
* @param tableData 带参数的数据集 |
|
* @param parameterMap 参数键值对 |
|
* @param start 开始 |
|
* @param end 结尾 |
|
* @param cols 列名 |
|
* @param colIdx 列序号 |
|
* @return 实际的二位数据条 |
|
* @throws Exception 异常 |
|
*/ |
|
@Override |
|
public Object previewTableData(Object tableData, java.util.Map parameterMap, int start, int end, String[] cols, int[] colIdx) throws Exception { |
|
return previewTableData(tableData, parameterMap, -1); |
|
} |
|
|
|
@Override |
|
public Object previewTableData(TableDataSource dataSource, Object tableData, Map parameterMap, int start, int end, String[] cols, int[] colIdx) throws Exception { |
|
return previewTableData(dataSource, tableData, parameterMap, -1); |
|
} |
|
|
|
/** |
|
* nameValuePairs,这个参数要接着this.path,拼成一个URL,否则服务器端req.getParameter是无法得到的 |
|
* |
|
* @param bytes 数据 |
|
* @param para 参数 |
|
* @return 从服务器端得到InputStream |
|
* @throws Exception 异常 |
|
*/ |
|
public InputStream postBytes2ServerB(byte[] bytes, HashMap<String, String> para) throws Exception { |
|
refreshHttpSProperty(); |
|
return filterInputStream(RemoteEnvUtils.simulateRPCByHttpPost(bytes, para, false, this)); |
|
} |
|
|
|
|
|
/** |
|
* 读取路径下的svg文件 |
|
* |
|
* @param path 制定路径,是基于报表目录下resource文件夹路径 |
|
* @return 读到的文件 |
|
*/ |
|
@Override |
|
public String[] readPathSvgFiles(String path) { |
|
refreshHttpSProperty(); |
|
String cataloguePath = StableUtils.pathJoin(CacheManager.getProviderInstance().getCacheDirectory().getPath(), SvgProvider.SERVER, path); |
|
|
|
ArrayList<String> fileArray = new ArrayList<>(); |
|
try { |
|
HashMap<String, String> para = new HashMap<>(); |
|
para.put("op", "fr_remote_design"); |
|
para.put("cmd", "design_read_svgfile"); |
|
para.put("resourcePath", path); |
|
para.put("current_uid", this.getUserID()); |
|
para.put("currentUsername", this.getUser()); |
|
|
|
InputStream input = filterInputStream( |
|
RemoteEnvUtils.simulateRPCByHttpGet(para, false, this) |
|
); |
|
JSONArray ja = new JSONArray(stream2String(input)); |
|
for (int i = 0; i < ja.length(); i++) { |
|
JSONObject jsonObject = (JSONObject) ja.get(i); |
|
String svgFileName = (String) jsonObject.get("svgfileName"); |
|
String svgFileContent = (String) jsonObject.get("svgfileContent"); |
|
|
|
String file = StableUtils.pathJoin(cataloguePath, svgFileName); |
|
InputStream in = new ByteArrayInputStream(svgFileContent.getBytes(EncodeConstants.ENCODING_UTF_8)); |
|
ResourceIOUtils.write(file, in); |
|
fileArray.add(file); |
|
} |
|
} catch (Exception e) { |
|
FineLoggerFactory.getLogger().error(e.getMessage()); |
|
} |
|
|
|
return fileArray.toArray(new String[0]); |
|
} |
|
|
|
|
|
/** |
|
* 写svg文件 |
|
* |
|
* @param svgFile svg文件 |
|
* @return 是否写入成功 |
|
* @throws Exception 异常 |
|
*/ |
|
@Override |
|
public boolean writeSvgFile(SvgProvider svgFile) throws Exception { |
|
testServerConnection(); |
|
|
|
HashMap<String, String> para = new HashMap<>(); |
|
para.put("op", "svgrelate"); |
|
para.put("cmd", "design_save_svg"); |
|
para.put("filePath", svgFile.getFilePath()); |
|
para.put("current_uid", this.getUserID()); |
|
para.put("currentUsername", this.getUser()); |
|
|
|
// 通过ByteArrayOutputStream将svg写成字节流 |
|
Bytes2ServerOutputStream out = new Bytes2ServerOutputStream(para); |
|
OutputStreamWriter outWriter = new OutputStreamWriter(out, "UTF-8"); |
|
StreamResult result = new StreamResult(outWriter); |
|
|
|
Source source = new DOMSource(svgFile.getSvgDocument()); |
|
try { |
|
Transformer xformer = TransformerFactory.newInstance().newTransformer(); |
|
try { |
|
xformer.transform(source, result); |
|
} catch (TransformerException ex) { |
|
FineLoggerFactory.getLogger().error(ex.getMessage()); |
|
} |
|
|
|
} catch (TransformerConfigurationException ex) { |
|
FineLoggerFactory.getLogger().error(ex.getMessage()); |
|
return false; |
|
} |
|
|
|
try { |
|
String res = stream2String(filterInputStream( |
|
RemoteEnvUtils.simulateRPCByHttpPost(out.getOut().toByteArray(), out.nameValuePairs, false, this) |
|
)); |
|
if (StringUtils.isNotEmpty(res)) { |
|
JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Already_exist") + res); |
|
return false; |
|
} |
|
} catch (Exception e) { |
|
FineLoggerFactory.getLogger().error(e.getMessage()); |
|
return false; |
|
} |
|
|
|
return true; |
|
} |
|
|
|
/** |
|
* 写报表运行环境所需的配置文件 |
|
* |
|
* @param mgr 管理各个资源文件的管理器 |
|
* @return 写入xml成功返回true |
|
* @throws Exception 写入xml错误则抛出此异常 |
|
*/ |
|
@Override |
|
public boolean writeResource(XMLFileManagerProvider mgr) throws Exception { |
|
testServerConnection(); |
|
|
|
HashMap<String, String> para = new HashMap<>(); |
|
para.put("op", "fr_remote_design"); |
|
para.put("cmd", "design_save_resource"); |
|
para.put("resource", mgr.fileName()); |
|
para.put("class_name", mgr.getClass().getName()); |
|
para.put("current_uid", this.getUserID()); |
|
para.put("currentUsername", this.getUser()); |
|
|
|
// alex:通过ByteArrayOutputStream将mgr写成字节流 |
|
Bytes2ServerOutputStream out = new Bytes2ServerOutputStream(para); |
|
XMLTools.writeOutputStreamXML(mgr, out); |
|
|
|
try { |
|
String res = stream2String( |
|
filterInputStream( |
|
RemoteEnvUtils.simulateRPCByHttpPost(out.getOut().toByteArray(), out.nameValuePairs, false, this) |
|
) |
|
); |
|
if (StringUtils.isNotEmpty(res)) { |
|
JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Already_exist") + res); |
|
return false; |
|
} |
|
} catch (Exception e) { |
|
FineLoggerFactory.getLogger().error(e.getMessage()); |
|
return false; |
|
} |
|
|
|
return true; |
|
} |
|
|
|
/** |
|
* 读取文件 |
|
* |
|
* @param beanPath 文件名 |
|
* @param prefix 当前Env下得工程分类,如reportlets,lib等 |
|
* @return InputStream 输入流 |
|
*/ |
|
@Override |
|
public InputStream readBean(String beanPath, String prefix) |
|
throws Exception { |
|
refreshHttpSProperty(); |
|
HashMap<String, String> para = new HashMap<>(); |
|
para.put("op", "fs_remote_design"); |
|
para.put("cmd", "design_open"); |
|
para.put(RemoteDeziConstants.PREFXI, prefix); |
|
para.put("resource", beanPath); |
|
|
|
return filterInputStream(RemoteEnvUtils.simulateRPCByHttpGet(para, false, this)); |
|
} |
|
|
|
/** |
|
* 写文件 |
|
* |
|
* @param beanPath 文件名 |
|
* @param prefix 当前Env下得工程分类,如reportlets,lib等 |
|
* @return OutputStream 输出流 |
|
*/ |
|
@Override |
|
public OutputStream writeBean(String beanPath, String prefix) { |
|
HashMap<String, String> para = new HashMap<>(); |
|
para.put("op", "fs_remote_design"); |
|
para.put("cmd", "design_save_report"); |
|
para.put(RemoteDeziConstants.PREFXI, prefix); |
|
para.put(RemoteDeziConstants.TEMPLATE_PATH, beanPath); |
|
|
|
return new Bytes2ServerOutputStream(para); |
|
} |
|
|
|
/** |
|
* 返回模板文件路径 |
|
*/ |
|
@Override |
|
public String getWebReportPath() { |
|
return getPath().substring(0, getPath().lastIndexOf("/")); |
|
} |
|
|
|
public String[] getProcedureColumns(StoreProcedure storeProcedure, Map parameterMap) throws Exception { |
|
refreshHttpSProperty(); |
|
String[] columns; |
|
HashMap<String, String> para = new HashMap<>(); |
|
para.put("op", "fr_remote_design"); |
|
para.put("cmd", "list_sp"); |
|
try { |
|
InputStream input = filterInputStream( |
|
RemoteEnvUtils.simulateRPCByHttpGet(para, false, this) |
|
); |
|
|
|
if (input == null) { |
|
return ArrayUtils.EMPTY_STRING_ARRAY; |
|
} |
|
|
|
columns = DavXMLUtils.readXMLSPColumns(input); |
|
return columns; |
|
} catch (Exception e) { |
|
FineLoggerFactory.getLogger().error(e.getMessage()); |
|
} |
|
|
|
return new String[0]; |
|
} |
|
|
|
public String[] getProcedureColumns(String name) throws Exception { |
|
refreshHttpSProperty(); |
|
String[] columns; |
|
HashMap<String, String> para = new HashMap<>(); |
|
para.put("op", "fr_remote_design"); |
|
para.put("cmd", "list_sp_columns_name"); |
|
para.put("name", name); |
|
try { |
|
InputStream input = filterInputStream( |
|
RemoteEnvUtils.simulateRPCByHttpGet(para, false, this) |
|
); |
|
if (input == null) { |
|
return ArrayUtils.EMPTY_STRING_ARRAY; |
|
} |
|
columns = DavXMLUtils.readXMLSPColumns(input); |
|
return columns; |
|
} catch (Exception e) { |
|
FineLoggerFactory.getLogger().error(e.getMessage()); |
|
} |
|
return new String[0]; |
|
|
|
} |
|
|
|
/** |
|
* 输出日志信息 |
|
* |
|
* @throws Exception e |
|
*/ |
|
@Override |
|
public void printLogMessage() throws Exception { |
|
ByteArrayOutputStream out = new ByteArrayOutputStream(); |
|
HashMap<String, String> para = new HashMap<>(); |
|
para.put("op", "fr_remote_design"); |
|
para.put("cmd", "get_log_message"); |
|
|
|
InputStream input = postBytes2ServerB(out.toByteArray(), para); |
|
if (input == null) { |
|
return; |
|
} |
|
LogRecordTime[] records = LogUtils.readXMLLogRecords(input); |
|
} |
|
|
|
@Override |
|
public String[] getSupportedTypes() { |
|
return FILE_TYPE; |
|
} |
|
|
|
|
|
/** |
|
* 判断是否有文件夹权限 |
|
* |
|
* @param path 路径 |
|
* @return 有权限则返回true |
|
*/ |
|
@Override |
|
public boolean hasFileFolderAllow(String path) { |
|
refreshHttpSProperty(); |
|
try { |
|
HashMap<String, String> para = new HashMap<>(); |
|
para.put("op", "fs_remote_design"); |
|
para.put("cmd", "design_filefolder_allow"); |
|
para.put("current_uid", this.getUserID()); |
|
para.put(RemoteDeziConstants.TEMPLATE_PATH, path); |
|
|
|
InputStream input = filterInputStream( |
|
RemoteEnvUtils.simulateRPCByHttpGet(para, false, this) |
|
); |
|
|
|
if (input == null) { |
|
return false; |
|
} |
|
return Boolean.valueOf(IOUtils.inputStream2String(input, EncodeConstants.ENCODING_UTF_8)); |
|
} catch (Exception e) { |
|
FineLoggerFactory.getLogger().error(e.getMessage()); |
|
return false; |
|
} |
|
|
|
} |
|
|
|
@Override |
|
public InputStream getDataSourceInputStream(String filePath) throws Exception { |
|
return readBean(filePath, "datasource"); |
|
} |
|
|
|
|
|
@Override |
|
public ArrayList getAllRole4Privilege(boolean isFS) { |
|
refreshHttpSProperty(); |
|
ArrayList<String> allRoleList = new ArrayList<>(); |
|
try { |
|
HashMap<String, String> para = new HashMap<>(); |
|
para.put("op", "fr_remote_design"); |
|
para.put("cmd", "get_all_role"); |
|
para.put("isFS", String.valueOf(isFS)); |
|
|
|
InputStream input = filterInputStream( |
|
RemoteEnvUtils.simulateRPCByHttpGet(para, false, this) |
|
); |
|
JSONArray ja = new JSONArray(stream2String(input)); |
|
for (int i = 0; i < ja.length(); i++) { |
|
String roleName = (String) ((JSONObject) ja.get(i)).get("name"); |
|
allRoleList.add(roleName); |
|
} |
|
} catch (Exception e) { |
|
FineLoggerFactory.getLogger().error(e.getMessage()); |
|
} |
|
return allRoleList; |
|
} |
|
|
|
|
|
/** |
|
* 获取当前env的build文件路径 |
|
*/ |
|
@Override |
|
public String getBuildFilePath() { |
|
return StringUtils.isEmpty(buildFilePath) ? ResourceConstants.BUILD_PATH : buildFilePath; |
|
} |
|
|
|
/** |
|
* 设置当前env的build文件路径 |
|
*/ |
|
@Override |
|
public void setBuildFilePath(String buildFilePath) { |
|
this.buildFilePath = buildFilePath; |
|
} |
|
|
|
/** |
|
* 编译Java源代码,方便二次开发的进行 |
|
* |
|
* @param sourceText 源代码 |
|
* @return 编译信息,有可能是成功信息,也有可能是出错或者警告信息 |
|
*/ |
|
@Override |
|
public JavaCompileInfo compilerSourceCode(String sourceText) throws Exception { |
|
HashMap<String, String> para = new HashMap<>(); |
|
para.put("op", "fr_remote_design"); |
|
para.put("cmd", "design_compile_source_code"); |
|
InputStream in = postBytes2ServerB(sourceText.getBytes(EncodeConstants.ENCODING_UTF_8), para); |
|
BufferedReader br = new BufferedReader(new InputStreamReader(in, EncodeConstants.ENCODING_UTF_8)); |
|
StringBuilder sb = new StringBuilder(); |
|
String line; |
|
while ((line = br.readLine()) != null) { |
|
sb.append(line); |
|
} |
|
JSONObject jo = new JSONObject(sb.toString()); |
|
JavaCompileInfo info = new JavaCompileInfo(); |
|
info.parseJSON(jo); |
|
return info; |
|
} |
|
|
|
|
|
@Override |
|
public String pluginServiceAction(String serviceID, String req) throws Exception { |
|
refreshHttpSProperty(); |
|
HashMap<String, String> para = new HashMap<>(); |
|
para.put("op", "fr_remote_design"); |
|
para.put("cmd", "design_get_plugin_service_data"); |
|
para.put("serviceID", serviceID); |
|
para.put("req", req); |
|
//jim :加上user,远程设计点击预览时传递用户角色信息 |
|
InputStream inputStream = filterInputStream( |
|
RemoteEnvUtils.simulateRPCByHttpPost(para, false, this) |
|
); |
|
return IOUtils.inputStream2String(inputStream); |
|
} |
|
|
|
/** |
|
* 远程不启动,使用虚拟服务 |
|
* <p> |
|
* |
|
* @param serviceID serviceID |
|
*/ |
|
@Override |
|
public void pluginServiceStart(String serviceID) { |
|
} |
|
|
|
@Override |
|
public String[] loadREUFile() { |
|
refreshHttpSProperty(); |
|
ResourceIOUtils.delete(StableUtils.pathJoin( |
|
CacheManager.getProviderInstance().getCacheDirectory().getAbsolutePath(), |
|
ShareConstants.DIR_SHARE_CACHE)); |
|
|
|
String zipFilePath = null; |
|
try { |
|
HashMap<String, String> para = new HashMap<>(); |
|
para.put("op", "fr_remote_design"); |
|
para.put("cmd", "design_read_reufile"); |
|
para.put("current_uid", this.getUserID()); |
|
para.put("currentUsername", this.getUser()); |
|
|
|
//拿到服务端传过来的整个共享文件夹的压缩文件的文件流 |
|
InputStream input = RemoteEnvUtils.simulateRPCByHttpGet(para, false, this); |
|
|
|
zipFilePath = StableUtils.pathJoin(CacheManager.getProviderInstance().getCacheDirectory().getAbsolutePath(), "share.zip"); |
|
String cacheDir = StableUtils.pathJoin(CacheManager.getProviderInstance().getCacheDirectory().getAbsolutePath(), ShareConstants.DIR_SHARE_CACHE); |
|
|
|
ResourceIOUtils.write(zipFilePath, input); |
|
ResourceIOUtils.unzip(zipFilePath, cacheDir, EncodeConstants.ENCODING_GBK); |
|
|
|
|
|
return ResourceIOUtils.listWithFullPath(cacheDir, new Filter<String>() { |
|
@Override |
|
public boolean accept(String s) { |
|
return s.endsWith(ProjectConstants.REU); |
|
} |
|
}); |
|
|
|
} catch (Exception e) { |
|
FineLoggerFactory.getLogger().error(e.getMessage()); |
|
} finally { |
|
|
|
if (zipFilePath != null) { |
|
ResourceIOUtils.delete(zipFilePath); |
|
} |
|
} |
|
|
|
return new String[0]; |
|
} |
|
|
|
@Override |
|
public boolean installREUFile(File reuFile) { |
|
refreshHttpSProperty(); |
|
if (reuFile == null) { |
|
return false; |
|
} |
|
File tempFile = new File(CacheManager.getProviderInstance().getCacheDirectory(), "temp_remote"); |
|
IOUtils.unzip(reuFile, tempFile.getAbsolutePath()); |
|
String shareXMLName = StableUtils.pathJoin(tempFile.getAbsolutePath(), ShareConstants.NAME_XML_MODULE); |
|
String helpXMLName = StableUtils.pathJoin(tempFile.getAbsolutePath(), ShareConstants.NAME_XML_HELP); |
|
try { |
|
HashMap<String, String> para = new HashMap<>(); |
|
para.put("op", "fr_remote_design"); |
|
para.put("cmd", "design_install_reufile"); |
|
para.put("current_uid", this.getUserID()); |
|
para.put("currentUsername", this.getUser()); |
|
para.put("reuFileName", reuFile.getName()); |
|
|
|
InputStream input = filterInputStream( |
|
RemoteEnvUtils.simulateRPCByHttpPost( |
|
IOUtils.inputStream2Bytes( |
|
new FileInputStream(new File(shareXMLName)) |
|
) |
|
, para, |
|
false, |
|
this) |
|
); |
|
para.put("isComplete", "true"); |
|
InputStream input1 = filterInputStream(RemoteEnvUtils.simulateRPCByHttpPost( |
|
IOUtils.inputStream2Bytes( |
|
new FileInputStream(new File(helpXMLName)) |
|
) |
|
, para, |
|
false, |
|
this)); |
|
return ComparatorUtils.equals(stream2String(input), "true") && ComparatorUtils.equals(stream2String(input1), "true"); |
|
} catch (Exception e) { |
|
return false; |
|
} |
|
} |
|
|
|
@Override |
|
public boolean removeREUFilesByName(String fileName) { |
|
refreshHttpSProperty(); |
|
if (StringUtils.isEmpty(fileName)) { |
|
return true; |
|
} |
|
try { |
|
HashMap<String, String> para = new HashMap<>(); |
|
para.put("op", "fr_remote_design"); |
|
para.put("cmd", "design_remove_reufile"); |
|
para.put("current_uid", this.getUserID()); |
|
para.put("currentUsername", this.getUser()); |
|
para.put("reuFileName", fileName); |
|
|
|
InputStream input = filterInputStream( |
|
RemoteEnvUtils.simulateRPCByHttpGet(para, false, this) |
|
); |
|
return ComparatorUtils.equals(stream2String(input), "true"); |
|
} catch (Exception e) { |
|
return false; |
|
} |
|
} |
|
|
|
@Override |
|
public String getSharePath() { |
|
refreshHttpSProperty(); |
|
try { |
|
HashMap<String, String> para = new HashMap<>(); |
|
para.put("op", "fr_remote_design"); |
|
para.put("cmd", "design_get_share_path"); |
|
para.put("current_uid", this.getUserID()); |
|
para.put("currentUsername", this.getUser()); |
|
|
|
InputStream input = filterInputStream( |
|
RemoteEnvUtils.simulateRPCByHttpGet(para, false, this) |
|
); |
|
return stream2String(input); |
|
} catch (Exception e) { |
|
return StringUtils.EMPTY; |
|
} |
|
} |
|
|
|
|
|
@Override |
|
public boolean hasPluginServiceStarted(String key) { |
|
|
|
return true; |
|
} |
|
|
|
} |