package tk.eclipse.plugin.jspeditor.editors;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.JavaCore;
import tk.eclipse.plugin.htmleditor.HTMLProjectParams;
import tk.eclipse.plugin.htmleditor.assist.TagInfo;
public class TLDInfo {
private String prefix;
private String uri;
private String taglibUri;
private String tagdir;
private List<TagInfo> tagInfoList = new ArrayList<TagInfo>();
/** cache results of TLD parsing */
private static HashMap<String, TLDInfo> cache = new HashMap<String, TLDInfo>();
/**
* This method returns empty TLDInfo.
*
* @param file IFile
* @param prefix prefix of taglib
* @param tagdir tagdir
* @return an instance of TLDInfo
*/
public static TLDInfo getTLDInfoFromTagdir(IFile file, String prefix,String tagdir){
try {
File basedir = getBaseDir(file.getProject()).getLocation().makeAbsolute().toFile();
File folder = new File(basedir, tagdir);
if(folder.exists() && folder.isDirectory()){
return new TLDInfo(folder, prefix, tagdir);
}
} catch(Exception ex){
}
return null;
}
/**
* Creates an instance of TLDInfo.
*
* @param file IFile
* @param prefix prefix of taglib
* @param url TURL of taglib
* @return an instance of TLDInfo
*/
public static TLDInfo getTLDInfo(IFile file,String prefix,String uri){
if(cache.get(uri)!=null){
return cache.get(uri);
}
try {
return new TLDInfo(file,prefix,uri);
} catch(Exception ex){
return null;
}
}
/**
*
*
* @param prefix
*/
private TLDInfo(File folder, String prefix, String tagdir){
super();
this.prefix = prefix;
this.tagdir = tagdir;
this.tagInfoList = new ArrayList<TagInfo>();
File[] files = folder.listFiles();
for(int i=0;i<files.length;i++){
if(files[i].isFile() && files[i].getName().endsWith(".tag")){
try {
tagInfoList.add(TagFileParser.parseTagFile(prefix, files[i]));
} catch(Exception ex){
}
}
}
}
/**
* private constructor.
*
* @param file IFile
* @param prefix prefix of taglib
* @param url URL of TLD file
*/
private TLDInfo(IFile file,String prefix,String uri) throws Exception {
super();
this.prefix = prefix;
this.uri = uri;
IContainer basedir = getBaseDir(file.getProject());
InputStream in = TLDLoader.get(basedir.getLocation().makeAbsolute().toFile(),uri);
TLDParser parser = new TLDParser(JavaCore.create(file.getProject()), this.prefix);
parser.parse(in);
tagInfoList = parser.getResult();
taglibUri = parser.getUri();
// add to cache
cache.put(uri, this);
}
/**
* Returns the <code>IContainer</code> of the web application root folder.
* <p>
* TODO This method should be moved to the utility class.
*
* @param project the project
* @return the <code>IContainer</code> of the web application root folder
*/
public static IContainer getBaseDir(IProject project) throws Exception {
HTMLProjectParams params = new HTMLProjectParams(project);
String root = params.getRoot();
IContainer basedir = null;
if(root.equals("") || root.equals("/")){
basedir = project;
} else {
basedir = project.getFolder(new Path(root));
}
return basedir;
}
/**
* Returns tagdir that's defined by taglib directive.
* @return tagdir
*/
public String getTagdir(){
return tagdir;
}
/**
* Returns prefix of taglib.
* @return prefix
*/
public String getPrefix(){
return prefix;
}
/**
* Returns URI of taglib (that's defined by taglib directive).
* @return URI
*/
public String getUri(){
return uri;
}
/**
* Returns URI of taglib (that's defined by <uri> of TLD file)
* @return URI
*/
public String getTaglibUri(){
return taglibUri;
}
/**
* Returns List of all TagInfo.
* @return List of TagInfo
*/
public List<TagInfo> getTagInfo(){
return tagInfoList;
}
@Override
public String toString(){
StringBuffer sb = new StringBuffer();
sb.append("[TLDInfo]");
sb.append(" uri=").append(getUri());
sb.append(" prefix=").append(getPrefix());
return sb.toString();
}
}