package org.vaadin.mideaas.model; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.vaadin.aceeditor.AceMode; import org.vaadin.aceeditor.client.AceDoc; import org.vaadin.mideaas.editor.DocDiffMediator; import org.vaadin.mideaas.editor.DocDiffMediator.Guard; import org.vaadin.mideaas.editor.JavaSyntaxGuard; import org.vaadin.mideaas.editor.MultiUserDoc; import org.vaadin.mideaas.editor.MultiUserDoc.DifferingChangedListener; import org.vaadin.mideaas.editor.ErrorChecker; import org.vaadin.mideaas.editor.MultiUserEditor; import org.vaadin.mideaas.editor.XmlSyntaxGuard; import org.vaadin.mideaas.frontend.Icons; import org.vaadin.mideaas.java.JavaSyntaxErrorChecker; import org.vaadin.mideaas.java.util.CompilingService; import com.vaadin.server.Resource; public class ProjectFile extends ProjectItem { private final MultiUserDoc mud; public ProjectFile(String name, String content, ErrorChecker checker, File saveBaseTo, ProjectLog log) { super(name); mud = new MultiUserDoc(new AceDoc(content), saveBaseTo, guardForName(name)); } public static ProjectFile newJavaFile(String name, String content, File saveBaseTo, ProjectLog log) { return new ProjectFile(name, content, new JavaSyntaxErrorChecker(), saveBaseTo, log); } public MultiUserDoc getMud() { return mud; } public MultiUserEditor createEditor(User user) { return createEditor(user, mud, getName()); } public String getFileEnding() { return getFileEnding(getName()); } public static MultiUserEditor createEditor(User user, MultiUserDoc mud, String name) { MultiUserEditor ed = new MultiUserEditor(user.getEditorUser(), mud); ed.setTitle(name); String ending = getFileEnding(name); ed.setMode(AceMode.forFileEnding(ending)); return ed; } public static String getFileEnding(String name) { int i = name.lastIndexOf("."); return i==-1 ? "" : name.substring(i+1); } @Override public String[] getJavaClass() { String cls = getJavaClassName(); if (cls!=null) { String content = getBaseText(); return new String[] {cls, content}; } return null; } private String getJavaClassName() { String name = getName(); if (name.endsWith(".java")) { return name.substring(0,name.length()-".java".length()); } return null; } @Override public void writeBaseToDisk(File src) throws IOException { String s = getBaseText(); FileUtils.write(new File(src, getName()), s); } @Override public void removeFromDir(File sourceDir) { new File(sourceDir, getName()).delete(); } @Override public void removeFromClasspathOf(CompilingService compiler, String packageName) { compiler.removeClass(packageName+"."+getJavaClassName()); } @Override public void removeUser(User user) { getMud().removeUserDoc(user.getEditorUser()); } @Override public void addDifferingChangedListener(DifferingChangedListener li) { getMud().addDifferingChangedListener(li); } @Override public void removeDifferingChangedListener(DifferingChangedListener li) { getMud().removeDifferingChangedListener(li); } public String getBaseText() { return getMud().getBase().getDoc().getText(); // XXX Ugly } public static DocDiffMediator.Guard guardForName(String name) { if (name.endsWith(".java")) { return new JavaSyntaxGuard(); } else if (name.endsWith(".xml")) { return new XmlSyntaxGuard(); } return null; } @Override public Resource getIcon() { if (getName().endsWith(".java")) { return Icons.DOCUMENT_ATTRIBUTE_J; } else { return Icons.DOCUMENT; } } }