package ariba.ui.dev; import ariba.ui.aribaweb.util.AWUtil; import ariba.ui.widgets.HTMLActionFilter; import ariba.util.core.MapUtil; import ariba.util.core.Assert; import java.io.File; import java.io.FileFilter; import java.util.Map; public class AWApiUrlLookupFilter implements HTMLActionFilter.UrlFilter { String _javaDocResourceUrl; File _rootDirectory; String _translationPrefix; Map<String, File> _classNameToFile; static AWApiUrlLookupFilter _DefaultInstance = null; public static AWApiUrlLookupFilter defaultInstance () { if (_DefaultInstance == null) { // E.g. "http://aribaweb.org/api" String urlPrefix = (String)System.getProperties().get("AWAPI.URL"); // E.g. "/roots-mainline/install-s4/internal/opensource/docs/api" String sourcePath = (String)System.getProperties().get("AWAPI.RootDirectory"); Assert.that(urlPrefix != null, "Missing parameter: AWAPI.URL"); Assert.that(sourcePath != null, "Missing parameter: AWAPI.RootDirectory"); _DefaultInstance = new AWApiUrlLookupFilter(urlPrefix, new File(sourcePath), "/api/"); } return _DefaultInstance; } public AWApiUrlLookupFilter (String javaDocResourceUrl, File rootDirectory, String translationPrefix) { _rootDirectory = rootDirectory; _translationPrefix = translationPrefix; _javaDocResourceUrl = javaDocResourceUrl; if (!_javaDocResourceUrl.endsWith("/")) _javaDocResourceUrl += "/"; _classNameToFile = filesToPath(_rootDirectory); } public String replacementForUrl (String url) { if (!url.startsWith(_translationPrefix)) return null; String key = url.substring(_translationPrefix.length()); return urlForName(key + ".html"); } String urlForName (String name) { File file = _classNameToFile.get(name); if (file == null) return null; String relativePath = relativePath(_rootDirectory, file); return _javaDocResourceUrl.concat(relativePath); } static String relativePath (File parentDir, File file) { String parentPath = parentDir.getAbsolutePath().replace("\\", "/"); String filePath = file.getAbsolutePath().replace("\\", "/"); int offset = parentPath.length() + (parentPath.endsWith("/") ? 0 : 1); return filePath.substring(parentPath.length()); } static Map<String, File> filesToPath (File rootDir) { final Map<String, File> result = MapUtil.map(); AWUtil.eachFile(rootDir, new FileFilter(){ public boolean accept(File file) { return file.isDirectory() || file.getName().endsWith(".html"); } }, new AWUtil.FileProcessor () { public void process(File file) { if (!file.isDirectory()) result.put(file.getName(), file); } }); return result; } }