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