class Platform {

		/**
		 * Compatibility range of supported platform versions. Requesting metadata or
		 * project generation with a platform version that does not match this range is
		 * not supported.
		 */
		private String compatibilityRange;

		@JsonIgnore
		private VersionRange range;

		/**
		 * Compatibility range of platform versions using the first version format.
		 */
		private String v1FormatCompatibilityRange;

		@JsonIgnore
		private VersionRange v1FormatRange;

		/**
		 * Compatibility range of platform versions using the second version format.
		 */
		private String v2FormatCompatibilityRange;

		@JsonIgnore
		private VersionRange v2FormatRange;

		public void updateCompatibilityRange(VersionParser versionParser) {<FILL_FUNCTION_BODY>}

		private void merge(Platform other) {
			this.compatibilityRange = other.compatibilityRange;
			this.range = other.range;
			this.v1FormatCompatibilityRange = other.v1FormatCompatibilityRange;
			this.v1FormatRange = other.v1FormatRange;
			this.v2FormatCompatibilityRange = other.v2FormatCompatibilityRange;
			this.v2FormatRange = other.v2FormatRange;
		}

		/**
		 * Specify whether the specified {@linkplain Version platform version} is
		 * supported.
		 * @param platformVersion the platform version to check
		 * @return {@code true} if this version is supported, {@code false} otherwise
		 */
		public boolean isCompatibleVersion(Version platformVersion) {
			return (this.range == null || this.range.match(platformVersion));
		}

		public String determineCompatibilityRangeRequirement() {
			return this.range.toString();
		}

		/**
		 * Format the expected {@link Version platform version}.
		 * @param platformVersion a platform version
		 * @return a platform version in the suitable format
		 */
		public Version formatPlatformVersion(Version platformVersion) {
			Format format = getExpectedVersionFormat(platformVersion);
			return platformVersion.format(format);
		}

		private Format getExpectedVersionFormat(Version version) {
			if (this.v2FormatRange != null && this.v2FormatRange.match(version)) {
				return Format.V2;
			}
			if (this.v1FormatRange != null && this.v1FormatRange.match(version)) {
				return Format.V1;
			}
			return version.getFormat();
		}

		public String getCompatibilityRange() {
			return this.compatibilityRange;
		}

		public void setCompatibilityRange(String compatibilityRange) {
			this.compatibilityRange = compatibilityRange;
		}

		public String getV1FormatCompatibilityRange() {
			return this.v1FormatCompatibilityRange;
		}

		public void setV1FormatCompatibilityRange(String v1FormatCompatibilityRange) {
			this.v1FormatCompatibilityRange = v1FormatCompatibilityRange;
		}

		public String getV2FormatCompatibilityRange() {
			return this.v2FormatCompatibilityRange;
		}

		public void setV2FormatCompatibilityRange(String v2FormatCompatibilityRange) {
			this.v2FormatCompatibilityRange = v2FormatCompatibilityRange;
		}

	}

			this.range = (this.compatibilityRange != null) ? versionParser.parseRange(this.compatibilityRange) : null;
			this.v1FormatRange = (this.v1FormatCompatibilityRange != null)
					? versionParser.parseRange(this.v1FormatCompatibilityRange) : null;
			this.v2FormatRange = (this.v2FormatCompatibilityRange != null)
					? versionParser.parseRange(this.v2FormatCompatibilityRange) : null;
		
<no_super_class>