use of lucee.runtime.type.UDF in project Lucee by lucee.
the class Props method call.
@Override
public Object call(PageContext pc) throws PageException {
// remote persistent (only type server is supported)
// Caster.toString(pc.urlFormScope().get(REMOTE_PERSISTENT_ID,null),null);
String strRemotePersisId = Caster.toString(getURLorForm(pc, REMOTE_PERSISTENT_ID, null), null);
if (!StringUtil.isEmpty(strRemotePersisId, true)) {
strRemotePersisId = strRemotePersisId.trim();
} else
strRemotePersisId = null;
HttpServletRequest req = pc.getHttpServletRequest();
// client
String client = Caster.toString(req.getAttribute("client"), null);
// call type (invocation, store-only)
String callType = Caster.toString(req.getAttribute("call-type"), null);
boolean internalCall = "lucee-gateway-1-0".equals(client) || "lucee-listener-1-0".equals(client);
boolean fromRest = "lucee-rest-1-0".equals(client);
Component component;
try {
pc.setSilent();
// load the cfc
try {
if (internalCall && strRemotePersisId != null) {
ConfigWebImpl config = (ConfigWebImpl) pc.getConfig();
GatewayEngineImpl engine = config.getGatewayEngine();
component = engine.getPersistentRemoteCFC(strRemotePersisId);
if (component == null) {
component = newInstance(pc, getComponentName(), false, false, true);
if (!internalCall)
component = ComponentSpecificAccess.toComponentSpecificAccess(Component.ACCESS_REMOTE, component);
engine.setPersistentRemoteCFC(strRemotePersisId, component);
}
} else {
component = newInstance(pc, getComponentName(), false, false, true);
if (!internalCall)
component = ComponentSpecificAccess.toComponentSpecificAccess(Component.ACCESS_REMOTE, component);
}
} finally {
pc.unsetSilent();
}
// Only get the Component, no invocation
if ("store-only".equals(callType)) {
req.setAttribute("component", component);
return null;
}
// METHOD INVOCATION
String qs = ReqRspUtil.getQueryString(pc.getHttpServletRequest());
if (pc.getBasePageSource() == this.getPageSource() && pc.getConfig().debug())
pc.getDebugger().setOutput(false);
boolean isPost = pc.getHttpServletRequest().getMethod().equalsIgnoreCase("POST");
boolean suppressContent = pc.getRequestDialect() == CFMLEngine.DIALECT_LUCEE || ((PageContextImpl) pc).getSuppressContent();
if (suppressContent)
pc.clear();
Object method;
if (fromRest) {
callRest(pc, component, Caster.toString(req.getAttribute("rest-path"), ""), (Result) req.getAttribute("rest-result"), suppressContent);
return null;
}
// POST
if (isPost) {
// Soap
if (isSoap(pc)) {
callWebservice(pc, component);
// close(pc);
return null;
} else // WDDX
if ((method = getURLorForm(pc, KeyConstants._method, null)) != null) {
callWDDX(pc, component, KeyImpl.toKey(method), suppressContent);
// close(pc);
return null;
}
} else // GET
{
// WSDL
if (qs != null && (qs.trim().equalsIgnoreCase("wsdl") || qs.trim().startsWith("wsdl&"))) {
callWSDL(pc, component);
// close(pc);
return null;
} else // WDDX
if ((method = getURLorForm(pc, KeyConstants._method, null)) != null) {
callWDDX(pc, component, KeyImpl.toKey(method), suppressContent);
// close(pc);
return null;
}
if (qs != null) {
int rf = UDFUtil.toReturnFormat(qs.trim(), -1);
if (rf != -1)
callCFCMetaData(pc, component, rf);
// close(pc);
return null;
}
}
// Include MUST
Array path = pc.getTemplatePath();
// if(path.size()>1 ) {
if (path.size() > 1 && !(path.size() == 3 && ListUtil.last(path.getE(2).toString(), "/\\", true).equalsIgnoreCase(pc.getRequestDialect() == CFMLEngine.DIALECT_CFML ? lucee.runtime.config.Constants.CFML_APPLICATION_EVENT_HANDLER : lucee.runtime.config.Constants.LUCEE_APPLICATION_EVENT_HANDLER))) {
// MUSTMUST bad impl -> check with and without application . cfc
ComponentSpecificAccess c = ComponentSpecificAccess.toComponentSpecificAccess(Component.ACCESS_PRIVATE, component);
Key[] keys = c.keys();
Object el;
Scope var = pc.variablesScope();
for (int i = 0; i < keys.length; i++) {
el = c.get(keys[i], null);
if (el instanceof UDF)
var.set(keys[i], el);
}
return null;
}
// DUMP
// TODO component.setAccess(pc,Component.ACCESS_PUBLIC);
String cdf = pc.getConfig().getComponentDumpTemplate();
if (cdf != null && cdf.trim().length() > 0) {
pc.variablesScope().set(KeyConstants._component, component);
pc.doInclude(cdf, false);
} else
pc.write(pc.getConfig().getDefaultDumpWriter(DumpWriter.DEFAULT_RICH).toString(pc, component.toDumpData(pc, 9999, DumpUtil.toDumpProperties()), true));
} catch (Throwable t) {
// Exception Handler.castAnd Stack(t, this, pc);
throw Caster.toPageException(t);
}
return null;
}
use of lucee.runtime.type.UDF in project Lucee by lucee.
the class Props method callCFCMetaData.
private void callCFCMetaData(PageContext pc, Component cfc, int format) throws IOException, PageException, ConverterException {
ComponentSpecificAccess cw = new ComponentSpecificAccess(Component.ACCESS_REMOTE, cfc);
ComponentScope scope = cw.getComponentScope();
Struct udfs = new StructImpl(), sctUDF, sctArg;
Array arrArg;
Iterator<Object> it = scope.valueIterator();
Object v;
UDF udf;
FunctionArgument[] args;
while (it.hasNext()) {
v = it.next();
// UDF
if (v instanceof UDF) {
udf = (UDF) v;
sctUDF = new StructImpl();
arrArg = new ArrayImpl();
udfs.setEL(udf.getFunctionName(), sctUDF);
args = udf.getFunctionArguments();
for (int i = 0; i < args.length; i++) {
sctArg = new StructImpl();
arrArg.appendEL(sctArg);
sctArg.setEL(KeyConstants._name, args[i].getName().getString());
sctArg.setEL(KeyConstants._type, args[i].getTypeAsString());
sctArg.setEL(KeyConstants._required, args[i].isRequired());
if (!StringUtil.isEmpty(args[i].getHint()))
sctArg.setEL(KeyConstants._hint, args[i].getHint());
}
sctUDF.set(KeyConstants._arguments, arrArg);
sctUDF.set(KeyConstants._returntype, udf.getReturnTypeAsString());
}
}
Struct rtn = new StructImpl();
rtn.set(KeyConstants._functions, udfs);
rtn.set(ACCEPT_ARG_COLL_FORMATS, "cfml,json");
InputStream is;
Charset cs = null;
// WDDX
if (UDF.RETURN_FORMAT_WDDX == format) {
WDDXConverter converter = new WDDXConverter(pc.getTimeZone(), false, false);
converter.setTimeZone(pc.getTimeZone());
String str = converter.serialize(rtn);
cs = getCharset(pc);
is = new ByteArrayInputStream(str.getBytes(cs));
} else // JSON
if (UDF.RETURN_FORMAT_JSON == format) {
boolean byColumn = false;
cs = getCharset(pc);
JSONConverter converter = new JSONConverter(false, cs);
String str = converter.serialize(pc, rtn, byColumn);
is = new ByteArrayInputStream(str.getBytes(cs));
} else // CFML
if (UDF.RETURN_FORMAT_SERIALIZE == format) {
ScriptConverter converter = new ScriptConverter(false);
String str = converter.serialize(rtn);
cs = getCharset(pc);
is = new ByteArrayInputStream(str.getBytes(cs));
} else // XML
if (UDF.RETURN_FORMAT_XML == format) {
XMLConverter converter = new XMLConverter(pc.getTimeZone(), false);
converter.setTimeZone(pc.getTimeZone());
String str = converter.serialize(rtn);
cs = getCharset(pc);
is = new ByteArrayInputStream(str.getBytes(cs));
} else // Plain
if (UDF.RETURN_FORMAT_PLAIN == format) {
String str = Caster.toString(rtn);
cs = getCharset(pc);
is = new ByteArrayInputStream(str.getBytes(cs));
} else // Java
if (UDF.RETURN_FORMAT_JAVA == format) {
byte[] bytes = JavaConverter.serializeAsBinary(rtn);
is = new ByteArrayInputStream(bytes);
} else
throw new IOException("invalid format defintion:" + format);
OutputStream os = null;
try {
os = pc.getResponseStream();
setFormat(pc.getHttpServletResponse(), format, cs);
IOUtil.copy(is, os, false, false);
} finally {
IOUtil.flushEL(os);
IOUtil.closeEL(os);
((PageContextImpl) pc).getRootOut().setClosed(true);
}
}
use of lucee.runtime.type.UDF in project Lucee by lucee.
the class JSONConverter method _serialize.
/**
* serialize a Object to his xml Format represenation
* @param object Object to serialize
* @param sb StringBuilder to write data
* @param serializeQueryByColumns
* @param done
* @throws ConverterException
*/
private void _serialize(PageContext pc, Set test, Object object, StringBuilder sb, boolean serializeQueryByColumns, Set done) throws ConverterException {
// NULL
if (object == null || object == NULL) {
sb.append(goIn());
sb.append("null");
return;
}
// String
if (object instanceof String || object instanceof StringBuilder) {
sb.append(goIn());
sb.append(StringUtil.escapeJS(object.toString(), '"', charsetEncoder));
return;
}
// Character
if (object instanceof Character) {
sb.append(goIn());
sb.append(StringUtil.escapeJS(String.valueOf(((Character) object).charValue()), '"', charsetEncoder));
return;
}
// Number
if (object instanceof Number) {
sb.append(goIn());
sb.append(Caster.toString(((Number) object)));
return;
}
// Boolean
if (object instanceof Boolean) {
sb.append(goIn());
sb.append(Caster.toString(((Boolean) object).booleanValue()));
return;
}
// DateTime
if (object instanceof DateTime) {
_serializeDateTime((DateTime) object, sb);
return;
}
// Date
if (object instanceof Date) {
_serializeDate((Date) object, sb);
return;
}
// XML
if (object instanceof Node) {
_serializeXML((Node) object, sb);
return;
}
// Timespan
if (object instanceof TimeSpan) {
_serializeTimeSpan((TimeSpan) object, sb);
return;
}
// File
if (object instanceof File) {
_serialize(pc, test, ((File) object).getAbsolutePath(), sb, serializeQueryByColumns, done);
return;
}
// String Converter
if (object instanceof ScriptConvertable) {
sb.append(((ScriptConvertable) object).serialize());
return;
}
// byte[]
if (object instanceof byte[]) {
sb.append("\"" + Base64Coder.encode((byte[]) object) + "\"");
return;
}
Object raw = LazyConverter.toRaw(object);
if (done.contains(raw)) {
sb.append(goIn());
sb.append("null");
return;
}
done.add(raw);
try {
// Component
if (object instanceof Component) {
_serializeComponent(pc, test, (Component) object, sb, serializeQueryByColumns, done);
return;
}
// UDF
if (object instanceof UDF) {
_serializeUDF(pc, test, (UDF) object, sb, serializeQueryByColumns, done);
return;
}
// Struct
if (object instanceof Struct) {
_serializeStruct(pc, test, (Struct) object, sb, serializeQueryByColumns, true, done);
return;
}
// Map
if (object instanceof Map) {
_serializeMap(pc, test, (Map) object, sb, serializeQueryByColumns, done);
return;
}
// Array
if (object instanceof Array) {
_serializeArray(pc, test, (Array) object, sb, serializeQueryByColumns, done);
return;
}
// List
if (object instanceof List) {
_serializeList(pc, test, (List) object, sb, serializeQueryByColumns, done);
return;
}
// Query
if (object instanceof Query) {
_serializeQuery(pc, test, (Query) object, sb, serializeQueryByColumns, done);
return;
}
// Native Array
if (Decision.isNativeArray(object)) {
if (object instanceof char[])
_serialize(pc, test, new String((char[]) object), sb, serializeQueryByColumns, done);
else {
_serializeArray(pc, test, ArrayUtil.toReferenceType(object, ArrayUtil.OBJECT_EMPTY), sb, serializeQueryByColumns, done);
}
return;
}
// ObjectWrap
if (object instanceof ObjectWrap) {
try {
_serialize(pc, test, ((ObjectWrap) object).getEmbededObject(), sb, serializeQueryByColumns, done);
} catch (PageException e) {
if (object instanceof JavaObject) {
_serializeClass(pc, test, ((JavaObject) object).getClazz(), null, sb, serializeQueryByColumns, done);
} else
throw new ConverterException("can't serialize Object of type [ " + Caster.toClassName(object) + " ]");
}
return;
}
_serializeClass(pc, test, object.getClass(), object, sb, serializeQueryByColumns, done);
} finally {
done.remove(raw);
}
}
use of lucee.runtime.type.UDF in project Lucee by lucee.
the class JSONConverter method _serializeStruct.
/**
* serialize a Struct
* @param struct Struct to serialize
* @param sb
* @param serializeQueryByColumns
* @param addUDFs
* @param done
* @throws ConverterException
*/
public void _serializeStruct(PageContext pc, Set test, Struct struct, StringBuilder sb, boolean serializeQueryByColumns, boolean addUDFs, Set<Object> done) throws ConverterException {
// Component
if (struct instanceof Component) {
String res = castToJson(pc, (Component) struct, NULL_STRING);
if (res != NULL_STRING) {
sb.append(res);
return;
}
}
sb.append(goIn());
sb.append("{");
// Key[] keys = struct.keys();
// Key key;
Iterator<Entry<Key, Object>> it = struct.entryIterator();
Entry<Key, Object> e;
Object value;
boolean doIt = false;
while (it.hasNext()) {
e = it.next();
// key=keys[i];
value = e.getValue();
if (!addUDFs && (value instanceof UDF || value == null))
continue;
if (doIt)
sb.append(',');
doIt = true;
sb.append(StringUtil.escapeJS(e.getKey().getString(), '"', charsetEncoder));
sb.append(':');
_serialize(pc, test, value, sb, serializeQueryByColumns, done);
}
if (struct instanceof Component) {
Boolean remotingFetch;
Component comp = (Component) struct;
boolean isPeristent = false;
isPeristent = comp.isPersistent();
Property[] props = comp.getProperties(false);
ComponentScope scope = comp.getComponentScope();
for (int i = 0; i < props.length; i++) {
if (!ignoreRemotingFetch) {
remotingFetch = Caster.toBoolean(props[i].getDynamicAttributes().get(REMOTING_FETCH, null), null);
if (remotingFetch == null) {
if (isPeristent && ORMUtil.isRelated(props[i]))
continue;
} else if (!remotingFetch.booleanValue())
continue;
}
Key key = KeyImpl.getInstance(props[i].getName());
value = scope.get(key, null);
if (!addUDFs && (value instanceof UDF || value == null))
continue;
if (doIt)
sb.append(',');
doIt = true;
sb.append(StringUtil.escapeJS(key.getString(), '"', charsetEncoder));
sb.append(':');
_serialize(pc, test, value, sb, serializeQueryByColumns, done);
}
}
sb.append('}');
}
use of lucee.runtime.type.UDF in project Lucee by lucee.
the class JSONConverter method castToJson.
private static String castToJson(PageContext pc, Component c, String defaultValue) throws ConverterException {
Object o = c.get(TO_JSON, null);
if (!(o instanceof UDF))
return defaultValue;
UDF udf = (UDF) o;
if (udf.getReturnType() != CFTypes.TYPE_VOID && udf.getFunctionArguments().length == 0) {
try {
return Caster.toString(c.call(pc, TO_JSON, new Object[0]));
} catch (PageException e) {
throw toConverterException(e);
}
}
return defaultValue;
}
Aggregations