package org.vaadin.mideaas.model;
import japa.parser.ParseException;
import java.io.File;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.io.FileUtils;
import org.vaadin.aceeditor.ServerSideDocDiff;
import org.vaadin.aceeditor.client.AceDoc;
import org.vaadin.mideaas.editor.ClaraXmlUtil;
import org.vaadin.mideaas.editor.DocDiffMediator;
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.XmlSyntaxErrorChecker;
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 org.vaadin.mideaas.model.ControllerCode.Modifier;
import com.vaadin.server.Resource;
// TODO: Auto-generated Javadoc
/**
* The Class SharedView.
*/
public class SharedView extends ProjectItem {
public static final String NAME_PATTERN = "[A-Z]\\w+";
public static final Pattern REGEX_NAME = Pattern.compile(NAME_PATTERN);
public static final Pattern REGEX_MODEL = Pattern.compile("("
+ NAME_PATTERN + ")\\.clara.xml");
public static final Pattern REGEX_CONTROLLER = Pattern.compile("("
+ NAME_PATTERN + ").java");
/**
* The Enum ViewPart.
*/
public enum ViewPart {
MODEL(REGEX_MODEL),
CONTROLLER(REGEX_CONTROLLER);
private Pattern pattern;
private ViewPart(Pattern pattern) {
this.pattern = pattern;
}
public String componentNameOf(String filename) {
// TODO: better solution
if (filename.equals("App.java")) {
return null;
}
Matcher m = pattern.matcher(filename);
if (m.matches()) {
return m.group(1);
}
return null;
}
}
public static class ViewPartInfo {
public final String viewName;
public final ViewPart part;
public ViewPartInfo(String componentName, ViewPart part) {
this.viewName = componentName;
this.part = part;
}
}
private static final Set<String> RESERVED_COMPONENT_NAMES = new HashSet<String>();
static {
RESERVED_COMPONENT_NAMES.add(ProjectFileUtils.getAppClassName());
}
private String javaPackage;
private final String name;
// private final String modelId = generateModelId();
private MultiUserDoc controllerMud;
private MultiUserDoc modelMud;
/**
* Instantiates a new shared component.
*
* @param javaPackage
* the java package
* @param name
* the name
*/
public SharedView(String javaPackage, String name, File saveBaseToDir, ProjectLog log) {
super(name);
// TODO: it doesn't always make sense to assign something to the muds
// if we know we're going to set them right away, such as when reading from disk.
this.javaPackage = javaPackage;
this.name = name;
String code = ControllerCode.createInitial(javaPackage, name).getCode();
File codeFile = new File(saveBaseToDir, name+".java");
controllerMud = new MultiUserDoc(new AceDoc(code), codeFile, new JavaSyntaxGuard());
String xml = ClaraXmlUtil.createHelloWorld("VerticalLayout", "This is " + getName());
File modelFile = new File(saveBaseToDir, name+".clara.xml");
modelMud = new MultiUserDoc(new AceDoc(xml), modelFile, new XmlSyntaxGuard());
// storeModelForVisualDesigner();
}
//
/**
* Gets the component part.
*
* @param filename
* the filename
* @return the component part
*/
public static ViewPartInfo getViewPart(String filename) {
for (ViewPart part : ViewPart.values()) {
String name = part.componentNameOf(filename);
if (name != null) {
return new ViewPartInfo(name, part);
}
}
return null;
}
private String getControllerName() {
return getName();
}
public String getName() {
return name;
}
synchronized public String getControllerFullName() {
return javaPackage + "." + getControllerName();
}
/**
* Checks if is valid name.
*
* @param name
* the name
* @return true, if is valid name
*/
public static boolean isvalidName(String name) {
return REGEX_NAME.matcher(name).matches();
}
public MultiUserDoc getControllerMud() {
return controllerMud;
}
public MultiUserDoc getModelMud() {
return modelMud;
}
@Override
public void writeBaseToDisk(File dir) throws IOException {
String ctrl;
String model;
synchronized (this) {
ctrl = controllerMud.getBaseText();
model = modelMud.getBaseText();
}
FileUtils.write(new File(dir, getControllerName() + ".java"), ctrl);
FileUtils.write(new File(dir, name + ".clara.xml"), model);
}
public void setModelBase(String xml) {
modelMud.setBaseNoFire(xml);
}
public void setControllerBase(String code) {
controllerMud.setBaseNoFire(code);
}
// TODO: below
public void ensureClaraFieldExists(final String id, final String className) {
modify(new Modifier() {
@Override
public void modify(ControllerCode c) {
c.ensureClaraFieldExists(id, className);
}
});
}
private void modify(Modifier modifier) {
final ServerSideDocDiff d;
try {
d = ControllerCode.getDiffAfterModify(controllerMud.getBaseText(), modifier);
} catch (ParseException e) {
return;
}
DocDiffMediator mm = controllerMud.getBase().fork();
mm.getDownstream().applyDiff(d);
mm.detach();
}
public void ensureClaraHandlerExists(final String id, final String className, final String comment) {
modify(new Modifier() {
@Override
public void modify(ControllerCode c) {
c.ensureClaraHandlerExists(id, className, comment);
}
});
}
public void ensureDataSource(final String id, final String cls, final String comment) {
modify(new Modifier() {
@Override
public void modify(ControllerCode c) {
c.ensureClaraDataSource(id, cls, comment);
}
});
}
//?
public String getControllerFilename() {
return name+".java";
}
@Override
public String[] getJavaClass() {
String cls = getControllerName();
String content = getControllerMud().getBaseText();
return new String[] {cls, content};
}
@Override
public void removeFromDir(File sourceDir) {
new File(sourceDir, getName()+".java").delete();
new File(sourceDir, getName()+".clara.xml").delete();
}
@Override
public void removeFromClasspathOf(CompilingService compiler,
String packageName) {
compiler.removeClass(packageName+"."+getControllerName());
}
@Override
public void removeUser(User user) {
getControllerMud().removeUserDoc(user.getEditorUser());
getModelMud().removeUserDoc(user.getEditorUser());
}
@Override
public void addDifferingChangedListener(DifferingChangedListener li) {
getControllerMud().addDifferingChangedListener(li);
getModelMud().addDifferingChangedListener(li);
}
@Override
public void removeDifferingChangedListener(DifferingChangedListener li) {
getControllerMud().removeDifferingChangedListener(li);
getModelMud().removeDifferingChangedListener(li);
}
@Override
public Resource getIcon() {
return Icons.APPLICATION_FORM;
}
}