/* Locators.java Purpose: Description: History: Fri Dec 9 09:35:33 TST 2011, Created by tomyeh Copyright (C) 2011 Potix Corporation. All Rights Reserved. */ package org.zkoss.xml; import javax.xml.transform.SourceLocator; import org.zkoss.lang.Strings; import org.zkoss.util.resource.Location; /** * Utilities to handle {@link Locator}. * @author tomyeh * @since 6.0.0 */ public class Locators { /** Formats the message with the location information. * @param loc the location information. Ignored if null. */ public static String format(String message, Locator loc) { return loc != null ? format(message, loc.getPublicId(), loc.getSystemId(), loc.getLineNumber(), loc.getColumnNumber()): message; } /** Formats the message with the location information. * @param loc the location information. Ignored if null. */ public static String format(String message, org.xml.sax.Locator loc) { return loc != null ? format(message, loc.getPublicId(), loc.getSystemId(), loc.getLineNumber(), loc.getColumnNumber()): message; } /** Formats the message with the location information. * @param loc the location information. Ignored if null. */ public static String format(String message, SourceLocator loc) { return loc != null ? format(message, loc.getPublicId(), loc.getSystemId(), loc.getLineNumber(), loc.getColumnNumber()): message; } /** Formats the message with the location information. * @param pubId the public ID (ignored if null) * @param sysId the system ID (ignored if null) * @param lineno the line number (ignored if negative) * @param colno the line number (ignored if negative) */ public static String format(String message, String pubId, String sysId, int lineno, int colno) { final StringBuffer sb = new StringBuffer(); final String inf = combine(pubId, sysId); if (inf != null) { int len; if ((len = inf.length()) >= 45) sb.append(inf.substring(0, 14)) .append("...").append(inf.substring(len - 26)); else sb.append(inf); } if (lineno >= 0) { if (sb.length() > 0) sb.append(':'); sb.append(lineno); if (colno >= 0) sb.append(':').append(colno); } return sb.length() > 0 ? sb.append(": ").append(message).toString(): message; } private static String combine(String pubId, String sysId) { return Strings.isEmpty(pubId) ? sysId: Strings.isEmpty(sysId) ? pubId: pubId + ':' + sysId; } /** Converts an instance of {@link Locator} to {@link Location}. * If loc is null, this method returns null. */ public static Location toLocation(Locator loc) { return loc != null ? new Loc(combine(loc.getPublicId(), loc.getSystemId()), loc.getLineNumber(), loc.getColumnNumber()): null; } /** Converts an instance of {@link org.xml.sax.Locator} to {@link Location}. * If loc is null, this method returns null. */ public static Location toLocation(org.xml.sax.Locator loc) { return loc != null ? new Loc(combine(loc.getPublicId(), loc.getSystemId()), loc.getLineNumber(), loc.getColumnNumber()): null; } /** Converts an instance of {@link SourceLocator} to {@link Location}. * If loc is null, this method returns null. */ public static Location toLocation(SourceLocator loc) { return loc != null ? new Loc(combine(loc.getPublicId(), loc.getSystemId()), loc.getLineNumber(), loc.getColumnNumber()): null; } private static class Loc implements Location, java.io.Serializable { private final String _path; private final int _lnno; private final int _colno; private Loc(String path, int lnno, int colno) { _path = path; _lnno = lnno; _colno = colno; } public String getPath() { return _path; } public int getLineNumber() { return _lnno; } public int getColumnNumber() { return _colno; } public String format(String message) { return Locators.format(message, _path, null, _lnno, -1); } public String toString() { return '[' + _path + ':' + _lnno +']'; } } }