Skip to content

Commit

Permalink
Merge pull request #5217 from kwvanderlinde/refactor/5216-json-indent
Browse files Browse the repository at this point in the history
Reimplement json-indent to remove json-lib
  • Loading branch information
cwisniew authored Feb 13, 2025
2 parents a1e2594 + 6f01e2f commit 58c9f4f
Show file tree
Hide file tree
Showing 22 changed files with 167 additions and 33 deletions.
4 changes: 1 addition & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,7 @@ dependencies {
implementation 'commons-net:commons-net:3.11.1'
// commandline parsing
implementation 'commons-cli:commons-cli:1.6.0'
implementation 'org.apache.commons:commons-lang3:3.17.0'

// needed for preference dialog at runtime
implementation 'commons-beanutils:commons-beanutils:1.9.4'
Expand All @@ -410,9 +411,6 @@ dependencies {
implementation group: 'com.jidesoft', name: 'jide-properties', version: '3.7.9'
implementation group: 'com.jidesoft', name: 'jide-shortcut', version: '3.7.9'

// old json lib only used for one macro function. Use gson instead
implementation 'net.sf.json-lib:json-lib:2.4:jdk15'

// utils for handling reflection
implementation 'org.reflections:reflections:0.10.2'

Expand Down
4 changes: 2 additions & 2 deletions src/main/java/net/rptools/lib/ModelVersionManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
import java.util.Set;
import net.rptools.lib.io.PackedFile;
import net.rptools.maptool.util.PersistenceUtil;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;

/**
* An object of this class is created in the {@link PersistenceUtil} code for the purpose of
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/net/rptools/lib/net/FTPLocation.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import net.rptools.maptool.server.proto.FtpLocationDto;
import net.rptools.maptool.server.proto.LocationDto;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;

public class FTPLocation implements Location {
private final String username;
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/net/rptools/maptool/client/AppUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
import net.rptools.maptool.model.Zone;
import net.rptools.maptool.model.player.Player;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
import net.rptools.maptool.model.library.LibraryManager;
import net.rptools.parser.ParserException;
import net.rptools.parser.function.Function;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
import net.rptools.parser.ParserException;
import net.rptools.parser.VariableResolver;
import net.rptools.parser.function.AbstractFunction;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.commons.lang3.math.NumberUtils;

/**
* @author Jamz
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
import net.rptools.parser.VariableResolver;
import net.rptools.parser.function.AbstractFunction;
import net.rptools.parser.function.ParameterException;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;

// @formatter:off
// Jamz: Had to remove <pre> tags and add formatter:off due to Spotless 3.x error, still not fixed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
import net.rptools.parser.ParserException;
import net.rptools.parser.VariableResolver;
import net.rptools.parser.function.AbstractFunction;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;

public class LookupTableFunction extends AbstractFunction {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
import net.rptools.parser.VariableResolver;
import net.rptools.parser.function.AbstractFunction;
import net.rptools.parser.function.ParameterException;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.mutable.MutableInt;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@
import net.rptools.parser.ParserException;
import net.rptools.parser.VariableResolver;
import net.rptools.parser.function.AbstractFunction;
import org.apache.commons.lang.WordUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.commons.lang3.text.WordUtils;

public class StringFunctions extends AbstractFunction {
private int matchNo = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
import net.rptools.parser.ParserException;
import net.rptools.parser.VariableResolver;
import net.rptools.parser.function.Function;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,16 @@
package net.rptools.maptool.client.functions.json;

import com.google.gson.*;
import com.google.gson.stream.JsonWriter;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.Option;
import com.jayway.jsonpath.PathNotFoundException;
import com.jayway.jsonpath.spi.json.GsonJsonProvider;
import com.jayway.jsonpath.spi.mapper.GsonMappingProvider;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
Expand All @@ -34,13 +38,15 @@
import net.rptools.parser.ParserException;
import net.rptools.parser.VariableResolver;
import net.rptools.parser.function.AbstractFunction;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/** Class used to implement Json related functions in MT script. */
public class JSONMacroFunctions extends AbstractFunction {

private static final Logger log = LogManager.getLogger(JSONMacroFunctions.class);

/** Object used to convert between json and MTS primitive types. */
private final JsonMTSTypeConversion typeConversion;

Expand Down Expand Up @@ -778,13 +784,15 @@ public JsonElement jsonEvaluate(JsonElement jsonElement, MapToolVariableResolver
* @return The json as a formatted string.
*/
public String jsonIndent(JsonElement json, int indent) {

// This is a bit ugly but the GSON library offers no way to specify indentation.
if (json.isJsonArray()) {
return JSONArray.fromObject(json.toString()).toString(indent);
} else if (json.isJsonObject()) {
return JSONObject.fromObject(json.toString()).toString(indent);
} else {
final Gson gsonPrettyPrinting = new GsonBuilder().setPrettyPrinting().create();
try (final Writer writer = new StringWriter()) {
final JsonWriter jWriter = gsonPrettyPrinting.newJsonWriter(writer);
jWriter.setIndent(" ".repeat(indent));
gsonPrettyPrinting.toJson(json, jWriter);
return writer.toString();
} catch (final IOException e) {
// This case should not happen, it's just an artifact of working with writers.
log.error("Unexpected error while formatting JSON", e);
return json.toString();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
import net.rptools.maptool.util.GraphicsUtil;
import net.rptools.maptool.util.ImageManager;
import net.rptools.maptool.util.StringUtil;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;

/**
* This is the pointer tool from the top-level of the toolbar. It allows tokens to be selected and
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@
import net.rptools.maptool.model.drawing.Pen;
import net.rptools.maptool.util.ImageManager;
import org.apache.commons.collections4.map.LinkedMap;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.xml.sax.SAXException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
import net.rptools.maptool.client.ui.theme.Icons;
import net.rptools.maptool.client.ui.theme.RessourceManager;
import net.rptools.maptool.language.I18N;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
import net.rptools.maptool.model.MacroButtonProperties;
import net.rptools.maptool.model.Token;
import net.rptools.maptool.util.PersistenceUtil;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;

@SuppressWarnings("serial")
public class ButtonGroupPopupMenu extends JPopupMenu {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import net.rptools.maptool.client.functions.UserDefinedMacroFunctions;
import net.rptools.maptool.language.I18N;
import net.rptools.parser.function.Function;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.fife.ui.autocomplete.BasicCompletion;
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/net/rptools/maptool/model/GUID.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import java.io.Serializable;
import java.util.HexFormat;
import java.util.UUID;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;

/** Global unique identificator object. */
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/net/rptools/maptool/model/LightSource.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
import javax.annotation.Nullable;
import net.rptools.lib.FileUtil;
import net.rptools.maptool.server.proto.LightSourceDto;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.commons.lang3.math.NumberUtils;

/**
* Represents a light source that can be attached to tokens.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import java.util.stream.Collectors;
import net.rptools.maptool.language.I18N;
import net.rptools.maptool.model.library.Library;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;

/**
* Manages the stat sheets that are available to the system. This includes the legacy stat sheet.
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/net/rptools/maptool/util/StringUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
/*
* This software Copyright by the RPTools.net development team, and
* licensed under the Affero GPL Version 3 or, at your option, any later
* version.
*
* MapTool Source Code is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU Affero General Public
* License * along with this source Code. If not, please visit
* <http://www.gnu.org/licenses/> and specifically the Affero license
* text at <http://www.gnu.org/licenses/agpl.html>.
*/
package net.rptools.maptool.client.functions.json;

import static org.junit.jupiter.api.Assertions.assertEquals;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

public class JSONMacroFunctionsTest {
private JSONMacroFunctions jsonMacroFunctions;

@BeforeEach
void setup() {
jsonMacroFunctions = JSONMacroFunctions.getInstance();
}

@ParameterizedTest
@MethodSource("indentSource")
void testIndent(JsonElement input, int indent, String expectedOutput) {
expectedOutput = expectedOutput.trim();

String indented = jsonMacroFunctions.jsonIndent(input, indent);
indented = indented.trim();

assertEquals(expectedOutput, indented);
}

static List<Arguments> indentSource() {
var simpleObject = new JsonObject();
simpleObject.addProperty("a", 1);
simpleObject.addProperty("b", "2");
simpleObject.addProperty("c", true);

var simpleArray = new JsonArray();
simpleArray.add(1);
simpleArray.add("2");
simpleArray.add(true);

var complexObject = new JsonObject();
complexObject.addProperty("x", 1);
complexObject.addProperty("y", "2");
var complexObjectSubObject = new JsonArray();
complexObjectSubObject.add(false);
complexObjectSubObject.add("1");
complexObjectSubObject.add(2);
complexObject.add("z", complexObjectSubObject);

return List.of(
Arguments.argumentSet(
"Simple object, indent = 2",
simpleObject,
2,
"""
{
"a": 1,
"b": "2",
"c": true
}
"""),
Arguments.argumentSet(
"Simple object, indent = 4",
simpleObject,
4,
"""
{
"a": 1,
"b": "2",
"c": true
}
"""),
Arguments.argumentSet(
"Simple array, indent = 2",
simpleArray,
2,
"""
[
1,
"2",
true
]
"""),
Arguments.argumentSet(
"Simple array, indent = 4",
simpleArray,
4,
"""
[
1,
"2",
true
]
"""),
Arguments.argumentSet(
"Complex object, indent = 2",
complexObject,
2,
"""
{
"x": 1,
"y": "2",
"z": [
false,
"1",
2
]
}
"""));
}
}

0 comments on commit 58c9f4f

Please sign in to comment.