package org.orienteer.core.component.meta;
import com.orientechnologies.orient.core.compression.OCompressionFactory;
import com.orientechnologies.orient.core.conflict.ORecordConflictStrategy;
import com.orientechnologies.orient.core.db.ODatabase;
import com.orientechnologies.orient.core.db.document.ODatabaseDocument;
import com.orientechnologies.orient.core.metadata.schema.OClass;
import com.orientechnologies.orient.core.metadata.schema.clusterselection.OClusterSelectionStrategy;
import com.orientechnologies.orient.core.metadata.security.ORule;
import com.orientechnologies.orient.core.storage.OCluster;
import org.apache.wicket.Application;
import org.apache.wicket.Component;
import org.apache.wicket.Session;
import org.apache.wicket.core.util.lang.PropertyResolver;
import org.apache.wicket.core.util.lang.PropertyResolverConverter;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.IModel;
import org.orienteer.core.component.property.BooleanEditPanel;
import org.orienteer.core.component.property.BooleanViewPanel;
import org.orienteer.core.component.property.DisplayMode;
import org.orienteer.core.component.widget.schema.OClustersWidget;
import ru.ydn.wicket.wicketorientdb.OrientDbWebSession;
import ru.ydn.wicket.wicketorientdb.model.SimpleNamingModel;
import ru.ydn.wicket.wicketorientdb.security.OSecurityHelper;
import ru.ydn.wicket.wicketorientdb.security.OrientPermission;
import java.io.IOException;
import java.util.*;
/**
* Meta panel for {@link OCluster}
*
* @param <V> type of a value
*/
public class OClusterMetaPanel<V> extends AbstractComplexModeMetaPanel<OCluster, DisplayMode, String, V> implements IDisplayModeAware
{
public static final List<String> OCLUSTER_ATTRS = new ArrayList<String>(Arrays.asList(OClustersWidget.NAME,
OClustersWidget.CONFLICT_STRATEGY, OClustersWidget.COUNT, OClustersWidget.COMPRESSION,
OClustersWidget.RECORD_GROW_FACTOR, OClustersWidget.RECORD_OVERFLOW_GROW_FACTOR, OClustersWidget.USE_WAL));
public static final List<String> COMPRESSIONS = new ArrayList<String>();
public OClusterMetaPanel(String id, IModel<DisplayMode> modeModel, IModel<OCluster> entityModel, IModel<String> criteryModel) {
super(id, modeModel, entityModel, criteryModel);
if(COMPRESSIONS.isEmpty()) {
COMPRESSIONS.addAll(OCompressionFactory.INSTANCE.getCompressions());
}
Collections.sort(COMPRESSIONS);
}
@SuppressWarnings("unchecked")
@Override
protected V getValue(OCluster entity, String critery) {
if(OClustersWidget.CONFLICT_STRATEGY.equals(critery))
{
ORecordConflictStrategy strategy = entity.getRecordConflictStrategy();
return (V)(strategy!=null?strategy.getName():null);
}
else if(OClustersWidget.COMPRESSION.equals(critery))
{
return (V)entity.compression();
}
else {
return (V) PropertyResolver.getValue(critery, entity);
}
}
@Override
protected void setValue(OCluster entity, String critery, V value) {
ODatabaseDocument db = OrientDbWebSession.get().getDatabase();
db.commit();
try
{
if(OClustersWidget.COMPRESSION.equals(critery)) {
entity.set(OCluster.ATTRIBUTES.COMPRESSION, value);
}
else if(OClustersWidget.NAME.equals(critery)) {
entity.set(OCluster.ATTRIBUTES.NAME, value);
}
else if(OClustersWidget.RECORD_GROW_FACTOR.equals(critery)) {
entity.set(OCluster.ATTRIBUTES.RECORD_GROW_FACTOR, value);
}
else if(OClustersWidget.RECORD_OVERFLOW_GROW_FACTOR.equals(critery)) {
entity.set(OCluster.ATTRIBUTES.RECORD_OVERFLOW_GROW_FACTOR, value);
}
else if(OClustersWidget.USE_WAL.equals(critery)) {
entity.set(OCluster.ATTRIBUTES.USE_WAL, value);
}
else if(OClustersWidget.CONFLICT_STRATEGY.equals(critery)) {
entity.set(OCluster.ATTRIBUTES.CONFLICTSTRATEGY, value);
}
else {
entity.set(OCluster.ATTRIBUTES.valueOf(critery), value);
}
}
catch(IOException e) {
throw new RuntimeException(e);
}
finally
{
db.begin();
}
}
@SuppressWarnings("unchecked")
@Override
protected Component resolveComponent(String id, DisplayMode mode, String critery) {
if(DisplayMode.EDIT.equals(mode) && !OSecurityHelper.isAllowed(ORule.ResourceGeneric.SCHEMA, null, OrientPermission.UPDATE))
{
mode = DisplayMode.VIEW;
}
if(DisplayMode.VIEW.equals(mode))
{
if(OClustersWidget.USE_WAL.equals(critery)) {
return new BooleanViewPanel(id, (IModel<Boolean>)getModel()).setDefaultValue(false);
}
return new Label(id, getModel());
}
else if(DisplayMode.EDIT.equals(mode)) {
if (OClustersWidget.COMPRESSION.equals(critery)) {
return new DropDownChoice<String>(id, (IModel<String>)getModel(), COMPRESSIONS);
}
else if (OClustersWidget.USE_WAL.equals(critery)) {
return new BooleanEditPanel(id, (IModel<Boolean>)getModel());
}
else if(OClustersWidget.COUNT.equals(critery)){
return resolveComponent(id, DisplayMode.VIEW, critery);
} else {
return new TextField<V>(id, getModel()).setType(String.class);
}
}
return null;
}
@Override
protected IModel<String> newLabelModel() {
return new SimpleNamingModel<String>("cluster."+ getPropertyObject().toLowerCase());
}
}