package org.ovirt.engine.ui.webadmin.binding;
import org.ovirt.engine.ui.webadmin.editor.AbstractUiCommonModelEditorDriver;
import org.ovirt.engine.ui.webadmin.editor.UiCommonModelEditorDelegate;
import com.google.gwt.core.ext.GeneratorContext;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.TreeLogger.Type;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import com.google.gwt.editor.client.SimpleBeanEditorDriver;
import com.google.gwt.editor.rebind.AbstractEditorDriverGenerator;
import com.google.gwt.editor.rebind.model.EditorData;
import com.google.gwt.editor.rebind.model.EditorModel;
import com.google.gwt.user.rebind.SourceWriter;
public class WebAdminEditorDriverGenerator extends
AbstractEditorDriverGenerator {
private JClassType entityModelType;
private JClassType listModelType;
private TreeLogger logger;
private EditorModel model;
private SourceWriter sw;
@Override
protected Class<?> getDriverInterfaceType() {
return SimpleBeanEditorDriver.class;
}
@Override
protected Class<?> getDriverSuperclassType() {
return AbstractUiCommonModelEditorDriver.class;
}
@Override
protected Class<?> getEditorDelegateType() {
return UiCommonModelEditorDelegate.class;
}
@Override
protected String mutableObjectExpression(EditorData data,
String sourceObjectExpression) {
return sourceObjectExpression;
}
/**
* Implement additional methods defined in {@link AbstractUiCommonModelEditorDriver}
*/
@Override
protected void writeAdditionalContent(TreeLogger logger,
GeneratorContext context,
EditorModel model,
SourceWriter sw)
throws UnableToCompleteException {
TypeOracle typeOracle = context.getTypeOracle();
entityModelType = typeOracle.findType("org.ovirt.engine.ui.uicommonweb.models.EntityModel");
listModelType = typeOracle.findType("org.ovirt.engine.ui.uicommonweb.models.ListModel");
this.logger = logger;
this.model = model;
this.sw = sw;
logger.log(Type.DEBUG, "Strating to write additional Driver code");
writeListenerMap();
writeEventMap();
writeOwnerModels();
}
/**
* Writes the UiCommonListenerMap for the edited model
*/
private void writeListenerMap() {
logger.log(Type.DEBUG, "Strating to write ListenerMap");
sw.println();
sw.println("@Override");
sw.println("protected org.ovirt.engine.ui.webadmin.editor.UiCommonListenerMap getListenerMap() {");
sw.indent();
sw.println("org.ovirt.engine.ui.webadmin.editor.UiCommonListenerMap listenerMap = new org.ovirt.engine.ui.webadmin.editor.UiCommonListenerMap();");
sw.println();
logger.log(Type.DEBUG, "Looking for top-level Editor Fields");
for (EditorData editorData : model.getEditorData()) {
logger.log(Type.DEBUG, "Going over Field: " + editorData);
String path = editorData.getPath();
// Change first letter to Upper to comply with UiCommon Property Names
path = Character.toUpperCase(path.charAt(0)) + path.substring(1, path.length());
if (path.length() == 0) {
continue;
}
// only relevant for top-level properties
if (!editorData.isDeclaredPathNested()) {
logger.log(Type.DEBUG, "Found top-level Field: " + editorData);
sw.println("listenerMap.addListener(\"%s\", \"PropertyChanged\", new org.ovirt.engine.core.compat.IEventListener() {",
path);
sw.indent();
sw.println("@Override");
sw.println("public void eventRaised(org.ovirt.engine.core.compat.Event ev, Object sender, org.ovirt.engine.core.compat.EventArgs args) {");
sw.indent();
sw.println("getEditor().%s.setValue(getObject()%s);",
editorData.getExpression(),
editorData.getGetterExpression());
sw.outdent();
sw.println("}");
sw.outdent();
sw.println("});");
sw.println();
}
}
sw.println("return listenerMap;");
sw.outdent();
sw.println("}");
}
/**
* Writes the UiCommonEventMap for the edited model
*/
private void writeEventMap() {
logger.log(Type.DEBUG, "Strating to write EventMap");
sw.println();
sw.println("@Override");
sw.println("protected org.ovirt.engine.ui.webadmin.editor.UiCommonEventMap getEventMap() {");
sw.indent();
sw.println("org.ovirt.engine.ui.webadmin.editor.UiCommonEventMap eventMap = new org.ovirt.engine.ui.webadmin.editor.UiCommonEventMap();");
logger.log(Type.DEBUG, "Looking for Model Fields");
for (EditorData editorData : model.getEditorData()) {
logger.log(Type.DEBUG, "Going over Field: " + editorData);
String path = editorData.getPath();
if (path.length() == 0) {
continue;
}
JClassType propertyOwnerType = editorData.getPropertyOwnerType();
if (propertyOwnerType == entityModelType) {
logger.log(Type.DEBUG, "Found EntityModel Field: " + editorData);
sw.println("eventMap.addEvent(\"%s\", \"EntityChanged\", getObject()%s.getEntityChangedEvent());",
path, editorData.getBeanOwnerExpression());
} else if (propertyOwnerType == listModelType) {
logger.log(Type.DEBUG, "Found ListModel Field: " + editorData);
sw.println("eventMap.addEvent(\"%s\", \"ItemsChanged\", getObject()%s.getItemsChangedEvent());",
path, editorData.getBeanOwnerExpression());
sw.println("eventMap.addEvent(\"%s\", \"SelectedItemsChanged\", getObject()%s.getSelectedItemsChangedEvent());",
path,
editorData.getBeanOwnerExpression());
sw.println("eventMap.addEvent(\"%s\", \"SelectedItemChanged\", getObject()%s.getSelectedItemChangedEvent());",
path,
editorData.getBeanOwnerExpression());
}
}
sw.println("return eventMap;");
sw.outdent();
sw.println("}");
}
/**
* Writes the map of the owner Models
*/
private void writeOwnerModels() {
logger.log(Type.DEBUG, "Strating to write OwnerModels");
sw.println();
sw.println("@Override");
sw.println("protected java.util.Map<String, org.ovirt.engine.ui.uicommonweb.models.EntityModel> getOwnerModels() {");
sw.indent();
sw.println("java.util.Map<String, org.ovirt.engine.ui.uicommonweb.models.EntityModel> regs = new java.util.HashMap<String, org.ovirt.engine.ui.uicommonweb.models.EntityModel>();");
logger.log(Type.DEBUG, "Going over Editor Fields");
for (EditorData editorData : model.getEditorData()) {
logger.log(Type.DEBUG, "Going over Field: " + editorData);
String path = editorData.getPath();
if (path.length() == 0) {
continue;
}
JClassType propertyOwnerType = editorData.getPropertyOwnerType();
if (propertyOwnerType == listModelType || propertyOwnerType == entityModelType) {
logger.log(Type.DEBUG, "Found owner Model Field: " + editorData);
sw.println("regs.put(\"%s\", getObject()%s);", path, editorData.getBeanOwnerExpression());
}
}
sw.println("return regs;");
sw.outdent();
sw.println("}");
}
}