网页框控件插件。
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.
 
 
 

168 lines
5.5 KiB

package com.fr.plugin.form.widget.core;
import com.fr.base.Formula;
import com.fr.base.Parameter;
import com.fr.base.ParameterHelper;
import com.fr.base.TemplateUtils;
import com.fr.data.NetworkHelper;
import com.fr.general.FArray;
import com.fr.json.JSONArray;
import com.fr.json.JSONException;
import com.fr.json.JSONObject;
import com.fr.script.Calculator;
import com.fr.stable.CodeUtils;
import com.fr.stable.ParameterProvider;
import com.fr.stable.ProductConstants;
import com.fr.stable.UtilEvalError;
import com.fr.stable.js.WidgetName;
import com.fr.stable.script.CalculatorProvider;
import com.fr.stable.xml.XMLPrintWriter;
import com.fr.stable.xml.XMLableReader;
import com.fr.third.org.apache.http.NameValuePair;
import com.fr.third.org.apache.http.client.utils.URLEncodedUtils;
import javax.servlet.http.HttpServletRequest;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Created by richie on 15/12/2.
*/
public class TemplateSource extends RHIframeSource {
private String path;
public TemplateSource() {
}
public TemplateSource(String path) {
this.path = path;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
@Override
public String getCalculatedUrl(Calculator calculator, HttpServletRequest req) {
try {
String realPath = TemplateUtils.render(path, calculator);
List<NameValuePair> pairs = URLEncodedUtils.parse("__emb__=" + realPath, Charset.forName("utf-8"));
List<NameValuePair> extraPairs = new ArrayList<NameValuePair>();
for (NameValuePair pair : pairs) {
if (pair.getName().equals("__emb__")) {
realPath = pair.getValue();
} else {
extraPairs.add(pair);
}
}
if (realPath.contains(".cpt")) {
if (isNewerThan9()) {
return NetworkHelper.createServletURL(req) + "/view/report?viewlet=" + CodeUtils.encodeURIComponent(realPath) + createQueryString(extraPairs);
} else {
return NetworkHelper.createServletURL(req) + "?reportlet=" + CodeUtils.encodeURIComponent(realPath) + createQueryString(extraPairs);
}
} else if (realPath.contains(".frm")) {
if (isNewerThan9()) {
return NetworkHelper.createServletURL(req) + "/view/form?viewlet=" + CodeUtils.encodeURIComponent(realPath) + createQueryString(extraPairs);
}
return NetworkHelper.createServletURL(req) + "?formlet=" + CodeUtils.encodeURIComponent(realPath) + createQueryString(extraPairs);
}
} catch (Exception e) {
return null;
}
return null;
}
private boolean isNewerThan9() {
return Integer.parseInt(ProductConstants.MAIN_VERSION) > 9;
}
private String createQueryString(List<NameValuePair> pairs) {
StringBuilder sb = new StringBuilder();
for (int i = 0, len = pairs.size(); i < len; i ++) {
NameValuePair pair = pairs.get(i);
sb.append("&");
sb.append(CodeUtils.encodeURIComponent(pair.getName()));
sb.append("=");
sb.append(CodeUtils.encodeURIComponent(pair.getValue()));
}
return sb.toString();
}
@Override
public String[] dependence(CalculatorProvider ca) {
Parameter[] parameters = ParameterHelper.analyze4Parameters(path, false);
List<String> collections = new ArrayList<String>();
for (Parameter parameter : parameters) {
collections.addAll(Arrays.asList(parameter.dependence(ca)));
}
return collections.toArray(new String[collections.size()]);
}
@Override
public void mixCalculatedParameters(Calculator c, JSONArray ja, ParameterProvider[] parameters) throws JSONException, UtilEvalError {
if (parameters == null) {
return;
}
// richie:这里的key/value不需要做CJKEncode,在前端会处理的
for (ParameterProvider parameter : parameters) {
JSONObject jo = JSONObject.create();
String key = parameter.getName();
Object obj = parameter.getValue();
if (obj instanceof Formula) {
String content = ((Formula) obj).getContent();
obj = c.evalValue(content);
}
if (obj instanceof String) {
jo.put(parameter.getName(), obj);
} else if (obj instanceof FArray) {
jo.put(key, obj);
} else if (obj instanceof WidgetName) {
jo.put("widgetName", ((WidgetName) obj).getName());
} else {
// 还可以是数字啊什么的
jo.put(key, obj);
}
ja.put(jo);
}
}
@Override
public String getSourceType() {
return "tpl";
}
@Override
public String toString() {
return path;
}
@Override
public void readXML(XMLableReader reader) {
super.readXML(reader);
if (reader.isChildNode()) {
String nodeName = reader.getTagName();
if ("Attr".equals(nodeName)) {
this.path = reader.getAttrAsString("path", null);
}
}
}
@Override
public void writeXML(XMLPrintWriter writer) {
super.writeXML(writer);
writer.startTAG("Attr");
writer.attr("path", path);
writer.end();
}
}