private LinearUnit makeUnit()

in core/org.openjdk.jmc.common/src/main/java/org/openjdk/jmc/common/unit/LinearKindOfQuantity.java [471:555]


	private LinearUnit makeUnit(
		String id, String localizedSymbol, ITypedQuantity<LinearUnit> quantity, String localizedName, boolean custom) {
		String symbol = resolveLocalizedSymbol(NONE, id, localizedSymbol);
		String name = resolveLocalizedName(NONE, id, localizedName);

		boolean isFactor = symbol.startsWith("\u00d7"); //$NON-NLS-1$
		StringBuilder descBuf = new StringBuilder();
		if (!isFactor) {
			if (symbol.length() == 0) {
				descBuf.append('1');
			} else {
				descBuf.append("1\u00a0"); //$NON-NLS-1$
				descBuf.append(symbol);
			}
			if (name != null) {
				descBuf.append(" (= 1\u00a0"); //$NON-NLS-1$
				descBuf.append(name);
				descBuf.append(" = "); //$NON-NLS-1$
			} else {
				descBuf.append(" (= "); //$NON-NLS-1$
			}
		}

		ScaleFactor factorToAtom;
		ScaleFactor factorToDefinition;
		String relStr;
		if (quantity instanceof LongStored) {
			descBuf.append(quantity.localizedFormat(false, false));
			relStr = " = "; //$NON-NLS-1$
			// FIXME: Throw QuantityConversionException if quantity is 0?
			factorToDefinition = getBestScaleFactorFor(quantity.longValue());
			factorToAtom = quantity.getUnit().valueTransformTo(atomUnit).concat(factorToDefinition);
		} else {
			descBuf.append(AutoFormatter.formatInUnit(quantity, quantity.getUnit(), 3));
			relStr = " \u2248 "; //$NON-NLS-1$
			factorToDefinition = new ImpreciseScaleFactor(quantity.doubleValue());
			factorToAtom = new ImpreciseScaleFactor(quantity.doubleValueIn(atomUnit));
		}

		if (!atomUnit.equals(quantity.getUnit())) {
			descBuf.append(relStr);
			descBuf.append(AutoFormatter.formatInUnit(quantity, atomUnit, 3));
		}

		if (!isFactor) {
			descBuf.append(')');
		}

		LinearUnit unit;
		String[] altNames;
		if (isFactor) {
			// NOTE: Will ignore the name even if one was resolved.
			String qStr = quantity.interactiveFormat();
			String suffix = quantity.getUnit().getAppendableSuffix(true);
			if (suffix.startsWith(" ")) { //$NON-NLS-1$
				// AltNames without space before original unit, and with "x" instead of multiplication sign.
				String trimmed = qStr.replace(suffix, quantity.getUnit().getLocalizedSymbol());
				String[] names = {"\u00d7" + qStr, "x" + qStr, "\u00d7" + trimmed, "x" + trimmed}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
				altNames = names;
			} else {
				String[] names = {"\u00d7" + qStr, "x" + qStr}; //$NON-NLS-1$ //$NON-NLS-2$
				altNames = names;
			}
		} else if (name != null) {
			String[] names = {name};
			altNames = names;
		} else {
			altNames = new String[0];
		}

		if (custom) {
			unit = new LinearUnit.Custom(this, id, factorToDefinition, quantity.getUnit(), symbol, descBuf.toString(),
					altNames);
		} else {
			unit = new LinearUnit(this, id, factorToAtom, symbol, descBuf.toString(), altNames);
		}

		if (id != null) {
			LinearUnit oldUnit = unitCache.put(id, unit);
			if (oldUnit != null) {
				UnitLookup.getLogger().log(Level.FINE, "Replaced cached unit " + oldUnit + " with " + unit); //$NON-NLS-1$ //$NON-NLS-2$
			}
		}
		return unit;
	}