package tk.eclipse.plugin.htmleditor;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.QualifiedName;
/**
* This is a class to access and modify project preferences.
*
* @author Naoki Takezoe
*/
public class HTMLProjectParams {
private String _root = "/";
private boolean _useDTD = true;
private boolean _validateXML = true;
private boolean _validateHTML = true;
private boolean _validateJSP = true;
private boolean _validateDTD = true;
private boolean _validateJS = true;
private boolean _removeMarkers = false;
private boolean _detectTaskTag = false;
private String[] _javaScripts = new String[0];
public static final String P_ROOT = "root";
public static final String P_USE_DTD = "useDTD";
public static final String P_VALIDATE_XML = "validateXML";
public static final String P_VALIDATE_HTML = "validateHTML";
public static final String P_VALIDATE_JSP = "validateJSP";
public static final String P_VALIDATE_DTD = "validateDTD";
public static final String P_VALIDATE_JS = "validateJS";
public static final String P_REMOVE_MARKERS = "removeMarkers";
public static final String P_JAVA_SCRIPTS = "javaScripts";
/**
* Create empty WebProjectParams.
*/
public HTMLProjectParams() {
}
/**
* Create WebProjectParams loading specified project configuration.
*
* @param javaProject Java project
* @throws Exception
*/
public HTMLProjectParams(IProject project) throws Exception {
load(project);
}
/**
* Returns root of the web application.
*
* @return Root of the web application
*/
public String getRoot() {
return _root;
}
/**
* Sets root of the web application.
*
* @param webAppRoot Root of the web application
*/
public void setRoot(String webAppRoot) {
this._root = webAppRoot;
}
/**
* @param useDTD enable DTD based validation and code completion or not
* <ul>
* <li>true - enable</li>
* <li>false - disable</li>
* </ul>
*/
public void setUseDTD(boolean useDTD){
this._useDTD = useDTD;
}
/**
* @return enable DTD based validation and code completion or not
* <ul>
* <li>true - enable</li>
* <li>false - disable</li>
* </ul>
*/
public boolean getUseDTD(){
return this._useDTD;
}
public void setValidateHTML(boolean validateHTML){
this._validateHTML = validateHTML;
}
public boolean getValidateHTML(){
return this._validateHTML;
}
public void setValidateJSP(boolean validateJSP){
this._validateJSP = validateJSP;
}
public boolean getValidateJSP(){
return this._validateJSP;
}
public void setValidateDTD(boolean validateDTD){
this._validateDTD = validateDTD;
}
public boolean getValidateDTD(){
return this._validateDTD;
}
public void setValidateJavaScript(boolean validateJS){
this._validateJS = validateJS;
}
public boolean getValidateJavaScript(){
return this._validateJS;
}
public void setValidateXML(boolean validateXML){
this._validateXML = validateXML;
}
public boolean getValidateXML(){
return this._validateXML;
}
public void setRemoveMarkers(boolean removeMarkers){
this._removeMarkers = removeMarkers;
}
public boolean getRemoveMarkers(){
return this._removeMarkers;
}
public void setDetectTaskTag(boolean detectTaskTag){
this._detectTaskTag = detectTaskTag;
}
public boolean getDetectTaskTag(){
return this._detectTaskTag;
}
public void setJavaScripts(String[] javaScripts){
this._javaScripts = javaScripts;
}
public String[] getJavaScripts(){
return this._javaScripts;
}
/**
* Save configuration.
*
* @param javaProject Java project
* @throws Exception
*/
public void save(IProject project) throws Exception {
IFile configFile = project.getFile(".amateras");
Properties props = new Properties();
props.put(P_ROOT, _root);
props.put(P_USE_DTD, String.valueOf(_useDTD));
props.put(P_VALIDATE_XML, String.valueOf(_validateXML));
props.put(P_VALIDATE_HTML, String.valueOf(_validateHTML));
props.put(P_VALIDATE_JSP, String.valueOf(_validateJSP));
props.put(P_VALIDATE_DTD, String.valueOf(_validateDTD));
props.put(P_VALIDATE_JS, String.valueOf(_validateJS));
props.put(P_REMOVE_MARKERS, String.valueOf(_removeMarkers));
StringBuffer sb = new StringBuffer();
for(int i=0;i<_javaScripts.length;i++){
if(i!=0){
sb.append("\n");
}
sb.append(_javaScripts[i]);
}
props.put(P_JAVA_SCRIPTS, sb.toString());
File file = configFile.getLocation().makeAbsolute().toFile();
if(!file.exists()){
file.createNewFile();
}
props.store(new FileOutputStream(file), "EclipseHTMLEditor configuration file");
if(_detectTaskTag){
addNature(project);
} else {
removeNature(project);
}
project.refreshLocal(IResource.DEPTH_ONE, new NullProgressMonitor());
}
private void addNature(IProject project) throws CoreException {
IProjectDescription description = project.getDescription();
String[] natures = description.getNatureIds();
for(int i=0;i<natures.length;i++){
if(natures[i].equals(HTMLProjectNature.HTML_NATURE_ID)){
return;
}
}
String[] newNatures = new String[natures.length + 1];
System.arraycopy(natures, 0, newNatures, 0, natures.length);
newNatures[natures.length] = HTMLProjectNature.HTML_NATURE_ID;
description.setNatureIds(newNatures);
project.setDescription(description, null);
}
private void removeNature(IProject project) throws CoreException {
IProjectDescription description = project.getDescription();
String[] natures = description.getNatureIds();
List<String> newNatures = new ArrayList<String>();
for(int i=0;i<natures.length;i++){
if(!natures[i].equals(HTMLProjectNature.HTML_NATURE_ID)){
newNatures.add(natures[i]);
}
}
description.setNatureIds(newNatures.toArray(new String[newNatures.size()]));
project.setDescription(description, null);
}
/**
* Load configuration.
*
* @param javaProject Java project
* @throws Exception
*/
public void load(IProject project) throws Exception {
IFile configFile = project.getFile(".amateras");
String useDTD = null;
String validateXML = null;
String validateHTML = null;
String validateJSP = null;
String validateDTD = null;
String validateJS = null;
String removeMarkers = null;
String javaScripts = "";
if(configFile.exists()){
File file = configFile.getLocation().makeAbsolute().toFile();
Properties props = new Properties();
props.load(new FileInputStream(file));
_root = props.getProperty(P_ROOT);
useDTD = props.getProperty(P_USE_DTD);
validateXML = props.getProperty(P_VALIDATE_XML);
validateHTML = props.getProperty(P_VALIDATE_HTML);
validateJSP = props.getProperty(P_VALIDATE_JSP);
validateDTD = props.getProperty(P_VALIDATE_DTD);
validateJS = props.getProperty(P_VALIDATE_JS);
removeMarkers = props.getProperty(P_REMOVE_MARKERS);
javaScripts = props.getProperty(P_JAVA_SCRIPTS);
if(javaScripts==null){
javaScripts = "";
}
} else {
// for old versions
if (project.isOpen()) {
this._root = project.getPersistentProperty(
new QualifiedName(HTMLPlugin.getDefault().getPluginId(), P_ROOT));
useDTD = project.getPersistentProperty(
new QualifiedName(HTMLPlugin.getDefault().getPluginId(), P_USE_DTD));
validateHTML = project.getPersistentProperty(new QualifiedName(
HTMLPlugin.getDefault().getPluginId(), P_VALIDATE_HTML));
}
}
if(this._root==null){
this._root = "/";
}
this._useDTD = getBooleanValue(useDTD, true);
this._validateXML = getBooleanValue(validateXML, true);
this._validateHTML = getBooleanValue(validateHTML, true);
this._validateJSP = getBooleanValue(validateJSP, true);
this._validateDTD = getBooleanValue(validateDTD, true);
this._validateJS = getBooleanValue(validateJS, true);
this._removeMarkers = getBooleanValue(removeMarkers, false);
this._detectTaskTag = project.hasNature(HTMLProjectNature.HTML_NATURE_ID);
String[] dim = javaScripts.split("\n");
List<String> list = new ArrayList<String>();
for(int i=0;i<dim.length;i++){
if(dim[i].trim().length()!=0){
list.add(dim[i]);
}
}
this._javaScripts = list.toArray(new String[list.size()]);
}
private boolean getBooleanValue(String value, boolean defaultValue){
if(value!=null){
if(value.equals("true")){
return true;
} else if(value.equals("false")){
return false;
}
}
return defaultValue;
}
}