Home / Class/ MemberPath Class — spring-boot Architecture

MemberPath Class — spring-boot Architecture

Architecture documentation for the MemberPath class in JsonWriter.java from the spring-boot codebase.

Entity Profile

Relationship Graph

Source Code

core/spring-boot/src/main/java/org/springframework/boot/json/JsonWriter.java lines 781–882

	record MemberPath(@Nullable MemberPath parent, @Nullable String name, int index) {

		private static final String[] ESCAPED = { "\\", ".", "[", "]" };

		public MemberPath {
			Assert.isTrue((name != null && index < 0) || (name == null && index >= 0),
					"'name' and 'index' cannot be mixed");
		}

		/**
		 * Indicates that the member has no index.
		 */
		public static final int UNINDEXED = -1;

		/**
		 * The root of all member paths.
		 */
		static final MemberPath ROOT = new MemberPath(null, "", UNINDEXED);

		/**
		 * Create a new child from this path with the specified index.
		 * @param index the index of the child
		 * @return a new {@link MemberPath} instance
		 */
		public MemberPath child(int index) {
			return new MemberPath(this, null, index);
		}

		/**
		 * Create a new child from this path with the specified name.
		 * @param name the name of the child
		 * @return a new {@link MemberPath} instance
		 */
		public MemberPath child(String name) {
			return (!StringUtils.hasLength(name)) ? this : new MemberPath(this, name, UNINDEXED);
		}

		@Override
		public String toString() {
			return toString(true);
		}

		/**
		 * Return a string representation of the path without any escaping.
		 * @return the unescaped string representation
		 */
		public String toUnescapedString() {
			return toString(false);
		}

		private String toString(boolean escape) {
			StringBuilder string = new StringBuilder((this.parent != null) ? this.parent.toString(escape) : "");
			if (this.index >= 0) {
				string.append("[").append(this.index).append("]");
			}
			else {
				string.append((!string.isEmpty()) ? "." : "").append((!escape) ? this.name : escape(this.name));
			}
			return string.toString();
		}

		private @Nullable String escape(@Nullable String name) {
			if (name == null) {
				return null;
			}
			for (String escape : ESCAPED) {
				name = name.replace(escape, "\\" + escape);
			}
			return name;
		}

		/**
		 * Create a new {@link MemberPath} instance from the given string.
		 * @param value the path value
		 * @return a new {@link MemberPath} instance
		 */
		public static MemberPath of(String value) {
			MemberPath path = MemberPath.ROOT;
			StringBuilder buffer = new StringBuilder();
			boolean escape = false;
			for (char ch : value.toCharArray()) {
				if (!escape && ch == '\\') {
					escape = true;
				}
				else if (!escape && (ch == '.' || ch == '[')) {
					path = path.child(buffer.toString());
					buffer.setLength(0);
				}
				else if (!escape && ch == ']') {
					path = path.child(Integer.parseUnsignedInt(buffer.toString()));
					buffer.setLength(0);
				}
				else {
					buffer.append(ch);
					escape = false;
				}
			}
			path = path.child(buffer.toString());
			return path;
		}

	}

Domain

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free