package com.digiarea.closurefx;
import java.io.File;
import java.io.IOException;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.control.TabPane;
import javafx.util.Callback;
import com.digiarea.closure.core.IPathResolver;
import com.digiarea.closure.core.PathResolverFactory;
import com.digiarea.closure.model.Closure;
import com.digiarea.closure.model.bind.Binder;
import com.digiarea.closure.model.bind.Checker;
import com.digiarea.closure.model.bind.ControllerFactory;
import com.digiarea.closure.model.bind.ModelFacade;
import com.digiarea.closure.model.controller.ClosureEditorController;
import com.digiarea.closure.model.validation.MessageManager;
import com.digiarea.closure.model.validation.Validator;
import com.digiarea.closure.model.zippy.ZippyClosureSerializer;
import com.digiarea.closurefx.build.validation.IStatus;
import com.digiarea.closurefx.build.validation.Status;
public class Document {
private StringProperty name = new SimpleStringProperty(this, "name");
private ObjectProperty<File> file = new SimpleObjectProperty<File>(this,
"file");
private Callback<Class<?>, Object> factory;
private ResourceBundle bundle;
private boolean needSave = true;
private Validator validator;
private MessageManager manager;
private ModelFacade modelFacade;
private IPathResolver pathResolver;
private Binder binder;
private Closure closure;
public Document(File file) {
setFile(file);
}
public void setName(String name) {
this.name.set(name);
}
public String getName() {
if (name.get().isEmpty() && getFile() != null) {
setName(getFile().getName());
}
return name.get();
}
public ObjectProperty<File> fileProperty() {
return file;
}
public StringProperty nameProperty() {
return name;
}
public Validator getValidator() {
return validator;
}
public ModelFacade getModelFacade() {
return modelFacade;
}
public IPathResolver getPathResolver() {
if (pathResolver == null) {
pathResolver = PathResolverFactory.getResolver(getFile());
}
return pathResolver;
}
public Binder getBinder() {
return binder;
}
public TabPane load() {
try {
// MODEL
if (closure == null) {
ZippyClosureSerializer closureSerializer = new ZippyClosureSerializer();
if (getFile() == null) {
closure = closureSerializer.read(getClass().getResource(
"resources/save.closure").openStream());
} else {
closure = closureSerializer.read(getFile()
.getAbsolutePath());
}
}
// CHECKER
Checker checker = new Checker();
closure.accept(checker, null);
// make ModelFacade and the ControllerFactory
manager = new MessageManager();
modelFacade = new ModelFacade(closure);
factory = new ControllerFactory(modelFacade, bundle);
modelFacade.setDocument(this);
modelFacade.setFactory(factory);
// LOAD UI
// TODO abstract the loading process
// FXMLLoader loader = new FXMLLoader(
// getClass()
// .getResource(
// "/com/digiarea/closure/model/controller/ClosureEditor.fxml"));
// if (bundle != null) {
// loader.setResources(bundle);
// }
// loader.setControllerFactory(factory);
// TabPane editor = (TabPane) loader.load();
Object call = factory.call(ClosureEditorController.class);
TabPane editor = ((ClosureEditorController) call).create();
// BINDING
binder = new Binder(factory);
closure.accept(binder, null);
// VALIDATION
validator = new Validator(bundle, factory, manager, pathResolver);
closure.accept(validator, null);
DocumentBinder documentBinder = new DocumentBinder(factory, this);
documentBinder.bind();
return editor;
} catch (IOException ex) {
Logger.getLogger(ClosureFXController.class.getName()).log(
Level.SEVERE, null, ex);
} catch (Exception e) {
Logger.getLogger(ClosureFXController.class.getName()).log(
Level.SEVERE, null, e);
}
return null;
}
public IStatus save() {
try {
if (getFile() == null) {
return Status.NO_STATUS;
}
if (!getFile().getName().endsWith(
"." + IConstants.EXTENSION_CLOSURE)) {
setFile(new File(getFile().getAbsolutePath() + "."
+ IConstants.EXTENSION_CLOSURE));
}
if (!getFile().exists()) {
getFile().createNewFile();
}
ZippyClosureSerializer closureSerializer = new ZippyClosureSerializer();
closureSerializer.write(closure, getFile().getAbsolutePath());
setName(getFile().getName());
// setNeedSave(false);
return Status.OK_STATUS;
} catch (Exception e) {
Logger.getLogger(ClosureFXController.class.getName()).log(
Level.SEVERE, null, e);
return Status.NO_STATUS;
}
}
public void setClosure(Closure closure) {
this.closure = closure;
}
public Closure getClosure() {
return closure;
}
public void setBundle(ResourceBundle bundle) {
this.bundle = bundle;
}
public ResourceBundle getBundle() {
return bundle;
}
public Callback<Class<?>, Object> getFactory() {
return factory;
}
public File getFile() {
return file.getValue();
}
public String getPath() {
if (getFile() != null) {
return getFile().getAbsolutePath();
}
return null;
}
public void setFile(File file) {
this.file.setValue(file);
if (getFile() != null) {
getPathResolver().setBasePath((getFile().getAbsolutePath()));
}
}
public boolean needSave() {
return needSave;
}
public void setNeedSave(boolean needSave) {
this.needSave = needSave;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Document) {
// equal by File or Closure model
Document document = (Document) obj;
return (document.getFile() != null && getFile() != null && getFile()
.equals(document.getFile()))
|| document.getClosure().equals(closure);
}
return super.equals(obj);
}
}