/**
* Copyright (c) 2013-2016 Angelo ZERR.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
*/
package tern.eclipse.ide.tools.core.webbrowser;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import tern.eclipse.ide.tools.core.generator.Options;
import tern.eclipse.ide.tools.internal.core.TernToolsCorePlugin;
import tern.repository.ITernRepository;
import tern.server.ITernDef;
import tern.server.ITernModule;
import tern.server.ITernPlugin;
import tern.utils.IOUtils;
import tern.utils.TernModuleHelper;
public class EditorOptions extends Options {
private TernDefLoaderType ternDefLoaderType;
/**
* JSON Type definitions used by the editor.
*/
private ITernDef[] ternDefs;
/**
* tern server plugins used by the editor.
*/
private ITernPlugin[] ternPlugins;
/**
* Tern repository where tern modules comes from.
*/
private ITernRepository repository;
/**
* the project and null otherwise.
*/
private IProject project;
private String baseURL;
private String editorContent;
private final EditorType type;
public EditorOptions(EditorType type) {
this.type = type;
this.ternDefLoaderType = TernDefLoaderType.EmbedDefInHTML;
}
public EditorType getType() {
return type;
}
public TernDefLoaderType getTernDefLoaderType() {
return ternDefLoaderType;
}
public void setTernDefLoaderType(TernDefLoaderType ternDefLoaderType) {
this.ternDefLoaderType = ternDefLoaderType;
}
public String getEditorContent() {
return editorContent;
}
public void setEditorContent(String editorContent) {
this.editorContent = editorContent;
}
public String resolve(String uri) {
if (baseURL == null) {
try {
return TernToolsCorePlugin.getEditorURL(type, uri);
} catch (IOException e) {
e.printStackTrace();
}
}
return resolve(baseURL, uri);
}
public String resolveTern(String uri) {
return TernModuleHelper.getPath(new File(repository.getTernBaseDir(),
uri));
}
public String resolveTernModule(ITernModule module) {
File f = repository.getFile(module);
if (f != null) {
return TernModuleHelper.getPath(f);
}
if (project != null) {
String fileName = TernModuleHelper.getFileName(module);
IFile projectFile = project.getFile(fileName);
if (projectFile.exists()) {
return TernModuleHelper.getPath(projectFile.getLocation()
.toFile());
}
}
return null;
}
private String resolve(String baseURL, String uri) {
return baseURL + uri;
}
public ITernDef[] getTernDefs() {
return ternDefs;
}
public void setTernDefs(ITernDef[] ternDefs) {
this.ternDefs = ternDefs;
}
public ITernPlugin[] getTernPlugins() {
return ternPlugins;
}
public void setRepository(ITernRepository repository) {
this.repository = repository;
}
public void setProject(IProject project) {
this.project = project;
}
public String toJSONDefs() {
StringBuilder json = new StringBuilder("[");
if (ternDefs != null) {
boolean hasQuote = isLoadDefWithAjax();
ITernDef def = null;
for (int i = 0; i < ternDefs.length; i++) {
def = ternDefs[i];
if (i > 0) {
json.append(",");
}
if (hasQuote) {
json.append("\"");
}
json.append(def.getName());
if (hasQuote) {
json.append("\"");
}
}
}
json.append("]");
return json.toString();
}
public String toJSONPlugins() {
StringBuilder json = new StringBuilder("{");
if (ternPlugins != null) {
ITernPlugin plugin = null;
String options = null;
for (int i = 0; i < ternPlugins.length; i++) {
plugin = ternPlugins[i];
// TODO : manage tern options
options = "{}";
if (i > 0) {
json.append(",");
}
json.append("\"");
json.append(plugin.getName());
json.append("\"");
json.append(":");
json.append(options);
}
}
json.append("}");
return json.toString();
}
public void setTernPlugins(ITernPlugin[] ternPlugins) {
this.ternPlugins = ternPlugins;
}
public String getEmbedJSONDefs() {
if (ternDefs != null && isEmbedDefInHTML()) {
StringBuilder js = new StringBuilder();
js.append("<script>");
ITernDef def = null;
for (int i = 0; i < ternDefs.length; i++) {
def = ternDefs[i];
String url = resolveTernModule(def);
File f = null;
if (url.startsWith("file:/")) {
f = new File(url.substring("file:/".length(), url.length()));
} else {
f = new File(url);
}
try {
String json = IOUtils.toString(new FileReader(f));
js.append("\nvar ");
js.append(def.getName());
js.append("=");
js.append(json);
} catch (IOException e) {
e.printStackTrace();
}
}
js.append("</script>");
return js.toString();
}
return null;
}
public String getTernDefsScriptsToInclude() {
if (ternDefs != null && isEmbedDefInJS()) {
}
return "";
}
public boolean isLoadDefWithAjax() {
return TernDefLoaderType.LoadDefWithAjax.equals(ternDefLoaderType);
}
public boolean isEmbedDefInHTML() {
return TernDefLoaderType.EmbedDefInHTML.equals(ternDefLoaderType);
}
public boolean isEmbedDefInJS() {
return TernDefLoaderType.EmbedDefInJS.equals(ternDefLoaderType);
}
}