/* * Copyright (c) 1998-2011 Caucho Technology -- all rights reserved * * Caucho Technology permits redistribution, modification and use * of this file in source and binary form ("the Software") under the * Caucho Developer Source License ("the License"). The following * conditions must be met: * * 1. Each copy or derived work of the Software must preserve the copyright * notice and this notice unmodified. * * 2. Redistributions of the Software in source or binary form must include * an unmodified copy of the License, normally in a plain ASCII text * * 3. The names "Resin" or "Caucho" are trademarks of Caucho Technology and * may not be used to endorse products derived from this software. * "Resin" or "Caucho" may not appear in the names of products derived * from this software. * * This Software is provided "AS IS," without a warranty of any kind. * ALL EXPRESS OR IMPLIED REPRESENTATIONS AND WARRANTIES, INCLUDING ANY * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. * * CAUCHO TECHNOLOGY AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES * SUFFERED BY LICENSEE OR ANY THIRD PARTY AS A RESULT OF USING OR * DISTRIBUTING SOFTWARE. IN NO EVENT WILL CAUCHO OR ITS LICENSORS BE LIABLE * FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR * INABILITY TO USE SOFTWARE, EVEN IF HE HAS BEEN ADVISED OF THE POSSIBILITY * OF SUCH DAMAGES. * * @author Sam */ package com.caucho.doc.javadoc; import com.caucho.config.ConfigException; import com.caucho.log.Log; import com.caucho.util.CharBuffer; import com.caucho.util.Crc64; import com.caucho.util.L10N; import com.caucho.vfs.Path; import com.caucho.vfs.Vfs; import java.util.ArrayList; import java.util.logging.Logger; import java.io.FileNotFoundException; /** * An Api is a javadoc generated api. */ public class Api { static protected final Logger log = Log.open(Api.class); static final L10N L = new L10N(Api.class); private String _id; private String _name; private String _description; private String _location; private String _indexString; private ArrayList<Path> _index = new ArrayList<Path>(); private Path _locationPath; private boolean _isLocal; private boolean _isLocalAbsolute; /** * A unique id for the api, required. */ public void setId(String id) throws ConfigException { for (int i = 0; i < id.length(); i++) { if (!Character.isJavaIdentifierPart(id.charAt(i))) throw new ConfigException(L.l("illegal character in `{0}': {1}","id",id.charAt(i))); } _id = id; } /** * A unique id for the api. */ public String getId() { return _id; } /** * A descriptive name for the api, default is to use location. */ public void setName(String name) { _name = name; } /** * A descriptive name for the api. */ public String getName() { return _name; } /** * A long descriptiion for the api, optional. */ public void setDescription(String description) { _description = description; } /** * A long description for the api, optional. */ public String getDescription() { return _description; } /** * The location of a javadoc generated api, can be a url, required. * <p>Examples: * <ul> * <li>http://java.sun.com/j2se/1.4.2/docs/api * <li>file://usr/local/java/axis_1-1/docs/apiDocs * <li>resin/ * </ul> */ public void setLocation(String location) { if (!location.endsWith("/")) { CharBuffer cb = CharBuffer.allocate(); cb.append(location); cb.append('/'); _location = cb.close(); } else _location = location; } /** * The location of a javadoc generated api. */ public String getLocation() { return _location; } /** * The location of a javadoc generated api, as a vfs Path object. */ Path getLocationPath() { return _locationPath; } /** * The location of a javadoc generated html index file, can be relative in * which case it is relative to `location'. Default is "index-all.html". */ public void setIndex(String index) { _indexString = index; } public void init() throws ConfigException { if (_id == null) throw new ConfigException(L.l("`{0}' is required","id")); if (_location == null) throw new ConfigException(L.l("`{0}' is required","location")); if (_name == null) _name = _location.toString(); if (_indexString == null) _indexString = "index-all.html"; _locationPath = Vfs.lookup(_location); int split = _indexString.indexOf('#'); if (split > -1) { CharBuffer before = new CharBuffer(_indexString.substring(0,split)); CharBuffer after = new CharBuffer(_indexString.substring(split + 1)); CharBuffer index = CharBuffer.allocate(); boolean isIndex = false; for (int i = 1; i <= 27; i++) { index.append(before); index.append(i); index.append(after); Path indexPath = _locationPath.lookup(index.toString()); if (indexPath.exists()) { isIndex = true; _index.add(indexPath); } index.clear(); } if (!isIndex) { throw new ConfigException(L.l("`{0}' not found", _locationPath.lookup(_indexString))); } } else _index.add(_locationPath.lookup(_indexString)); if (_locationPath.getScheme().equals("file")) { _isLocal = true; Path pwd = Vfs.getPwd(); if (!_locationPath.getPath().startsWith(pwd.getPath())) _isLocalAbsolute = true; } } long generateCrc64(long crc) { crc = Crc64.generate(crc,_location); return Crc64.generate(crc,_index.toString()); } /** * The location of all javadoc generated html index files. */ public ArrayList<Path> getIndexes() { return _index; } /** * An api that is local to the server. */ public boolean isLocal() { return _isLocal; } /** * An api that is local to the server, but somewhere on the filesystem * outside of the context of the web application. */ public boolean isLocalAbsolute() { return _isLocalAbsolute; } /** * A location href, relative to the web-app root, appropriately rewritten to * handle remote locations and locations that are local absolute. */ String getLocationHref(String file) { CharBuffer cb = CharBuffer.allocate(); if (_isLocalAbsolute) { cb.append(_id); cb.append('/'); } else { cb.append(_location); } cb.append(file); return cb.close(); } }