/**
*
*/
package org.orienteer.core.component.widget.oclass;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import org.apache.wicket.Component;
import org.apache.wicket.Session;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.basic.MultiLineLabel;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.util.string.Strings;
import org.orienteer.core.CustomAttribute;
import org.orienteer.core.component.FAIcon;
import org.orienteer.core.component.FAIconType;
import org.orienteer.core.component.ODocumentPageLink;
import org.orienteer.core.component.command.EditODocumentCommand;
import org.orienteer.core.component.command.EditSchemaCommand;
import org.orienteer.core.component.command.SaveODocumentCommand;
import org.orienteer.core.component.command.SaveSchemaCommand;
import org.orienteer.core.component.meta.AbstractModeMetaPanel;
import org.orienteer.core.component.meta.OClassMetaPanel;
import org.orienteer.core.component.meta.ODocumentMetaPanel;
import org.orienteer.core.component.property.DisplayMode;
import org.orienteer.core.component.structuretable.OrienteerStructureTable;
import org.orienteer.core.component.structuretable.StructureTable;
import org.orienteer.core.component.widget.AbstractSchemaCustomPropertiesWidget;
import org.orienteer.core.component.widget.document.ODocumentNonRegisteredPropertiesWidget;
import org.orienteer.core.service.IOClassIntrospector;
import org.orienteer.core.widget.AbstractModeAwareWidget;
import org.orienteer.core.widget.Widget;
import org.orienteer.core.util.ODocumentChoiceRenderer;
import com.google.inject.Inject;
import com.orientechnologies.orient.core.db.document.ODatabaseDocument;
import com.orientechnologies.orient.core.db.record.OClassTrigger;
import com.orientechnologies.orient.core.id.ORecordId;
import com.orientechnologies.orient.core.metadata.function.OFunction;
import com.orientechnologies.orient.core.metadata.schema.OClass;
import com.orientechnologies.orient.core.metadata.schema.OClassImpl;
import com.orientechnologies.orient.core.metadata.schema.OProperty;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.sql.OCommandSQL;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
import com.orientechnologies.orient.core.type.ODocumentWrapper;
import ru.ydn.wicket.wicketorientdb.OrientDbWebSession;
import ru.ydn.wicket.wicketorientdb.components.TransactionlessForm;
import ru.ydn.wicket.wicketorientdb.model.AbstractCustomValueModel;
import ru.ydn.wicket.wicketorientdb.model.ListOPropertiesModel;
import ru.ydn.wicket.wicketorientdb.model.OClassCustomModel;
import ru.ydn.wicket.wicketorientdb.model.ODocumentPropertyModel;
import ru.ydn.wicket.wicketorientdb.model.OQueryModel;
import ru.ydn.wicket.wicketorientdb.model.SimpleNamingModel;
import ru.ydn.wicket.wicketorientdb.proto.OClassPrototyper;
/**
* @author Asm
* Widget for class-linked hooks
* Instead storing function names, we store their rid-s in trigger fields
*/
@Widget(domain="class", tab="configuration",selector=OClassTrigger.CLASSNAME, id = OClassHooksWidget.WIDGET_TYPE_ID, order=20, autoEnable=true)
public class OClassHooksWidget extends AbstractModeAwareWidget<OClass> {
public static final String WIDGET_TYPE_ID = "classHooks";
public static final List<String> EVENTS_LIST = new ArrayList<String>();
static
{
EVENTS_LIST.add("onBeforeCreate");
EVENTS_LIST.add("onAfterCreate");
EVENTS_LIST.add("onBeforeRead");
EVENTS_LIST.add("onAfterRead");
EVENTS_LIST.add("onBeforeUpdate");
EVENTS_LIST.add("onAfterUpdate");
EVENTS_LIST.add("onBeforeDelete");
EVENTS_LIST.add("onAfterDelete");
}
private OrienteerStructureTable<OClass, String> structureTable;
public OClassHooksWidget(String id, final IModel<OClass> model, IModel<ODocument> widgetDocumentModel) {
super(id, model, widgetDocumentModel);
final OQueryModel<ODocument> functions = new OQueryModel<ODocument>("SELECT FROM OFunction");
Form form = new TransactionlessForm<>("form");
add(form);
structureTable = new OrienteerStructureTable<OClass, String>("events", model, EVENTS_LIST) {
@Override
protected Component getValueComponent(String id, IModel<String> rowModel) {
return new AbstractModeMetaPanel<OClass, DisplayMode, String, ODocument>(id, getModeModel(), OClassHooksWidget.this.getModel(), rowModel) {
@Override
protected Component resolveComponent(String id, DisplayMode mode, String critery) {
if(DisplayMode.EDIT.equals(mode)) {
return new DropDownChoice<ODocument>(
id,
getValueModel(),
functions,
new ODocumentChoiceRenderer()
).setNullValid(true);
} else {
return new ODocumentPageLink(id, getValueModel()).setDocumentNameAsBody(true);
}
}
@Override
protected IModel<String> newLabelModel() {
return new SimpleNamingModel<String>("class.hooks."+ getPropertyObject());
}
@Override
protected IModel<ODocument> resolveValueModel() {
return new LoadableDetachableModel<ODocument>() {
@Override
protected ODocument load() {
String idStr = getEntityObject().getCustom(getPropertyObject());
if (Strings.isEmpty(idStr)) return null;
else if (ORecordId.isA(idStr)){
return new ORecordId(idStr).getRecord();
}else{
ODatabaseDocument db = OrientDbWebSession.get().getDatabase();
OSQLSynchQuery<ODocument> query = new OSQLSynchQuery<ODocument>("SELECT FROM OFunction WHERE name=?");
List<ODocument> ret = db.query(query, idStr);
return ret!=null && !ret.isEmpty() ? ret.get(0):null;
}
}
@Override
public void setObject(ODocument value) {
getEntityObject().setCustom(getPropertyObject(), (value!=null?value.getIdentity().toString():null));
super.setObject(value);
}
};
}
};
}
};
form.add(structureTable);
structureTable.addCommand(new EditSchemaCommand<OClass>(structureTable, getModeModel()));
structureTable.addCommand(new SaveSchemaCommand<OClass>(structureTable, getModeModel()));
}
@Override
protected FAIcon newIcon(String id) {
return new FAIcon(id, FAIconType.list);
}
@Override
protected IModel<String> getDefaultTitleModel() {
return new ResourceModel("class.hooks");
}
@Override
protected String getWidgetStyleClass() {
return "strict";
}
}