|
|
|
package com.fr.plugin.form.widget.core;
|
|
|
|
|
|
|
|
import com.fr.base.Formula;
|
|
|
|
import com.fr.base.Parameter;
|
|
|
|
import com.fr.base.ParameterHelper;
|
|
|
|
import com.fanruan.api.util.RenderKit;
|
|
|
|
import com.fr.general.FArray;
|
|
|
|
import com.fr.general.FRLogger;
|
|
|
|
import com.fr.json.JSONArray;
|
|
|
|
import com.fanruan.api.err.JSONException;
|
|
|
|
import com.fr.json.JSONObject;
|
|
|
|
import com.fr.script.Calculator;
|
|
|
|
import com.fanruan.api.util.CodeKit;
|
|
|
|
import com.fr.stable.ParameterProvider;
|
|
|
|
import com.fanruan.api.cal.FormulaKit;
|
|
|
|
import com.fanruan.api.err.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.fanruan.api.util.GeneralKit;
|
|
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Arrays;
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Created by richie on 15/12/2.
|
|
|
|
*/
|
|
|
|
public class URLSource extends RHIframeSource {
|
|
|
|
private String url;
|
|
|
|
|
|
|
|
public URLSource() {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public URLSource(String url) {
|
|
|
|
this.url = url;
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getUrl() {
|
|
|
|
return url;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setUrl(String url) {
|
|
|
|
this.url = url;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String getCalculatedUrl(Calculator calculator, HttpServletRequest req) {
|
|
|
|
String result = null;
|
|
|
|
if (FormulaKit.checkFormulaContent(url)) {
|
|
|
|
try {
|
|
|
|
result = GeneralKit.objectToString(calculator.evalValue(new Formula(url)));
|
|
|
|
} catch (Exception u) {
|
|
|
|
FRLogger.getLogger().error(u.getMessage(), u);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
try {
|
|
|
|
result = RenderKit.render(url, calculator);
|
|
|
|
} catch (Exception e) {
|
|
|
|
FRLogger.getLogger().error(e.getMessage(), e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (result != null && !result.toLowerCase().startsWith("http")) {
|
|
|
|
result = "http://" + result;
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String[] dependence(CalculatorProvider ca) {
|
|
|
|
Parameter[] parameters = ParameterHelper.analyze4Parameters(url, 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 {
|
|
|
|
for (int i = 0; i < (parameters == null ? 0 : parameters.length); i++) {
|
|
|
|
Object obj = parameters[i].getValue();
|
|
|
|
if (obj instanceof Formula) {
|
|
|
|
try {
|
|
|
|
String content = ((Formula) obj).getContent();
|
|
|
|
obj = c.evalValue(content);
|
|
|
|
} catch (Exception e) {
|
|
|
|
}
|
|
|
|
JSONObject jo = JSONObject.create();
|
|
|
|
if (obj instanceof String) {
|
|
|
|
obj = CodeKit.passwordDecode((String) obj);
|
|
|
|
jo.put(parameters[i].getName(), obj);
|
|
|
|
} else if (obj instanceof FArray) {
|
|
|
|
obj = ((FArray) obj).cjkEncode();
|
|
|
|
jo.put(parameters[i].getName(), obj);
|
|
|
|
} else if (obj instanceof WidgetName) {
|
|
|
|
jo.put("widgetName", ((WidgetName) obj).getName());
|
|
|
|
} else {
|
|
|
|
// 还可以是数字啊什么的
|
|
|
|
jo.put(parameters[i].getName(), obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
ja.put(jo);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@Override
|
|
|
|
public String getSourceType() {
|
|
|
|
return "url";
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String toString() {
|
|
|
|
return url;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void readXML(XMLableReader reader) {
|
|
|
|
super.readXML(reader);
|
|
|
|
if (reader.isChildNode()) {
|
|
|
|
String nodeName = reader.getTagName();
|
|
|
|
if ("Attr".equals(nodeName)) {
|
|
|
|
this.url = reader.getAttrAsString("url", null);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void writeXML(XMLPrintWriter writer) {
|
|
|
|
super.writeXML(writer);
|
|
|
|
writer.startTAG("Attr");
|
|
|
|
writer.attr("url", url);
|
|
|
|
writer.end();
|
|
|
|
}
|
|
|
|
}
|