Skip to content

Commit

Permalink
Merge branch '5.2' of https://github.com/lucee/Lucee into 5.2
Browse files Browse the repository at this point in the history
  • Loading branch information
michaeloffner committed Jul 7, 2017
2 parents a47fad1 + c35a862 commit 9839e93
Show file tree
Hide file tree
Showing 5 changed files with 142 additions and 83 deletions.
150 changes: 76 additions & 74 deletions core/src/main/java/lucee/runtime/converter/JSONConverter.java
Original file line number Diff line number Diff line change
Expand Up @@ -485,143 +485,144 @@ private void _serializeQuery(PageContext pc,Set test,Query query, StringBuilder
* @param done
* @throws ConverterException
*/
private void _serialize(PageContext pc,Set test,Object object, StringBuilder sb, boolean serializeQueryByColumns, Set<Object> 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) {
if (object==null || object==NULL) {
sb.append(goIn());
sb.append("null");
return;
}
// String
if(object instanceof String || object instanceof StringBuilder) {
if (object instanceof String || object instanceof StringBuilder) {
sb.append(goIn());
sb.append(StringUtil.escapeJS(object.toString(),'"',charsetEncoder));
return;
}
// Character
if(object instanceof Character) {
if (object instanceof Character) {
sb.append(goIn());
sb.append(StringUtil.escapeJS(String.valueOf(((Character)object).charValue()),'"',charsetEncoder));
return;
}
// Number
if(object instanceof Number) {
if (object instanceof Number) {
sb.append(goIn());
sb.append(Caster.toString(((Number)object)));
return;
}
// Boolean
if(object instanceof Boolean) {
if (object instanceof Boolean) {
sb.append(goIn());
sb.append(Caster.toString(((Boolean)object).booleanValue()));
return;
}
// DateTime
if(object instanceof DateTime) {
if (object instanceof DateTime) {
_serializeDateTime((DateTime)object,sb);
return;
}
// Date
if(object instanceof Date) {
if (object instanceof Date) {
_serializeDate((Date)object,sb);
return;
}
// XML
if(object instanceof Node) {
if (object instanceof Node) {
_serializeXML((Node)object,sb);
return;
}
// Timespan
if(object instanceof TimeSpan) {
if (object instanceof TimeSpan) {
_serializeTimeSpan((TimeSpan) object,sb);
return;
}
// File
if(object instanceof File) {
if (object instanceof File) {
_serialize(pc,test, ((File)object).getAbsolutePath(), sb, serializeQueryByColumns,done);
return;
}
// String Converter
if(object instanceof ScriptConvertable) {
if (object instanceof ScriptConvertable) {
sb.append(((ScriptConvertable)object).serialize());
return;
}
Object raw = LazyConverter.toRaw(object);
if(done.contains(raw)){
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;

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);
}
// 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;

return;
}
// ObjectWrap
if (object instanceof ObjectWrap) {
try {
_serialize(pc,test,((ObjectWrap)object).getEmbededObject(), sb, serializeQueryByColumns,done);
}
// 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)+" ]");
catch (PageException e) {
if(object instanceof JavaObject){
_serializeClass(pc,test,((JavaObject)object).getClazz(),null,sb,serializeQueryByColumns,done);
}
return;
else throw new ConverterException("can't serialize Object of type [ "+Caster.toClassName(object)+" ]");
}

_serializeClass(pc,test,object.getClass(),object,sb,serializeQueryByColumns,done);
return;
}

_serializeClass(pc,test,object.getClass(),object,sb,serializeQueryByColumns,done);
}
finally{
finally {
done.remove(raw);
}
}


private void _serializeXML(Node node, StringBuilder sb) {
node=XMLCaster.toRawNode(node);
sb.append(goIn());
Expand Down Expand Up @@ -651,9 +652,10 @@ private void _serializeTimeSpan(TimeSpan span, StringBuilder sb) {
* @return serialized wddx package
* @throws ConverterException
*/
public String serialize(PageContext pc,Object object, boolean serializeQueryByColumns) throws ConverterException {
StringBuilder sb=new StringBuilder();
_serialize(pc,null,object,sb,serializeQueryByColumns,new HashSet<Object>());
public String serialize(PageContext pc, Object object, boolean serializeQueryByColumns) throws ConverterException {

StringBuilder sb = new StringBuilder();
_serialize(pc, null, object, sb, serializeQueryByColumns, new HashSet());
return sb.toString();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,16 @@
import lucee.runtime.PageContext;
import lucee.runtime.converter.ConverterException;
import lucee.runtime.converter.JSONConverter;
import lucee.runtime.exp.FunctionException;
import lucee.runtime.exp.PageException;
import lucee.runtime.ext.function.Function;
import lucee.runtime.op.Caster;
import lucee.runtime.op.Decision;
import lucee.runtime.type.Array;
import lucee.runtime.type.ArrayImpl;
import lucee.runtime.type.Query;
import lucee.runtime.type.Struct;
import lucee.runtime.type.it.ForEachQueryIterator;

/**
* Decodes Binary Data that are encoded as String
Expand All @@ -39,16 +46,66 @@ public final class SerializeJSON implements Function {
public static String call(PageContext pc, Object var) throws PageException {
return _call(pc, var, false, pc.getWebCharset());
}
public static String call(PageContext pc, Object var,boolean serializeQueryByColumns) throws PageException {

public static String call(PageContext pc, Object var, boolean serializeQueryByColumns) throws PageException {
return _call(pc, var, serializeQueryByColumns, pc.getWebCharset());
}
public static String call(PageContext pc, Object var,boolean serializeQueryByColumns, String strCharset) throws PageException {

public static String call(PageContext pc, Object var, boolean serializeQueryByColumns, String strCharset) throws PageException {
Charset cs=StringUtil.isEmpty(strCharset)?pc.getWebCharset():CharsetUtil.toCharset(strCharset);
return _call(pc, var, serializeQueryByColumns, cs);
}
private static String _call(PageContext pc, Object var,boolean serializeQueryByColumns, Charset charset) throws PageException {

public static String call(PageContext pc, Object var, Object options) throws PageException {
return _call(pc, var, options, pc.getWebCharset());
}

public static String call(PageContext pc, Object var, Object options, String strCharset) throws PageException {
Charset cs=StringUtil.isEmpty(strCharset)?pc.getWebCharset():CharsetUtil.toCharset(strCharset);
return _call(pc, var, options, cs);
}

private static String _call(PageContext pc, Object var, Object options, Charset charset) throws PageException {

try {
return new JSONConverter(true,charset).serialize(pc,var,serializeQueryByColumns);

JSONConverter json = new JSONConverter(true, charset);

if (Decision.isBoolean(options))
return json.serialize(pc, var, Caster.toBoolean(options));

if (Decision.isQuery(var)){

if (Decision.isSimpleValue(options)) {

String opt = Caster.toString(options);
if ("struct".equalsIgnoreCase(opt)) {

Array arr = new ArrayImpl();
ForEachQueryIterator it = new ForEachQueryIterator((Query) var, pc.getId());

try {

while (it.hasNext()) {

arr.append(it.next()); // append each record from the query as a struct
}
} finally {
it.reset();
}

return json.serialize(pc, arr, false);
}
}
else if (Decision.isBoolean(options)) {

return json.serialize(pc, var, Caster.toBoolean(options));
}
else throw new FunctionException(pc, SerializeJSON.class.getSimpleName(), 2, "options", "When var is a Query, argument [options] must be either a boolean value or a string with the value of [struct]");
}

// var is not a query so options doesn't make a difference here
return json.serialize(pc, var, false);
} catch (ConverterException e) {
throw Caster.toPageException(e);
}
Expand Down
6 changes: 3 additions & 3 deletions core/src/main/java/resource/fld/core-base.fld
Original file line number Diff line number Diff line change
Expand Up @@ -14337,10 +14337,10 @@ You can find a list of all available timezones in the Lucee administrator (Setti
<description>A CFML data value or variable that represents one.</description>
</argument>
<argument>
<name>serializeQueryByColumns</name>
<type>boolean</type>
<name>options</name>
<type>any</type>
<required>No</required>
<description>A Boolean value that specifies how to serialize CFML queries.</description>
<description>Either a Boolean value that specifies whether to serialize CFML queries by Column, or a string with the value "struct".</description>
</argument>
<argument>
<name>charset</name>
Expand Down
2 changes: 1 addition & 1 deletion loader/build.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project default="core" basedir="." name="Lucee" xmlns:artifact="antlib:org.apache.maven.artifact.ant">

<property name="version" value="5.2.3.5-SNAPSHOT"/>
<property name="version" value="5.2.3.7-SNAPSHOT"/>

<path id="maven-ant-tasks.classpath" path="../ant/lib/maven-ant-tasks-2.1.3.jar" />
<typedef resource="org/apache/maven/artifact/ant/antlib.xml"
Expand Down
2 changes: 1 addition & 1 deletion loader/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

<groupId>org.lucee</groupId>
<artifactId>lucee</artifactId>
<version>5.2.3.5-SNAPSHOT</version>
<version>5.2.3.7-SNAPSHOT</version>
<packaging>jar</packaging>

<name>Lucee Loader Build</name>
Expand Down

0 comments on commit 9839e93

Please sign in to comment.