/**
* Copyright 2010 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.drools.eclipse.editors.rete.model;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.drools.reteoo.AccumulateNodeVertex;
import org.drools.reteoo.AlphaNodeVertex;
import org.drools.reteoo.BaseVertex;
import org.drools.reteoo.EntryPointNodeVertex;
import org.drools.reteoo.EvalConditionNodeVertex;
import org.drools.reteoo.ExistsNodeVertex;
import org.drools.reteoo.FromNodeVertex;
import org.drools.reteoo.JoinNodeVertex;
import org.drools.reteoo.LeftInputAdapterNodeVertex;
import org.drools.reteoo.NotNodeVertex;
import org.drools.reteoo.ObjectTypeNodeVertex;
import org.drools.reteoo.PropagationQueuingNodeVertex;
import org.drools.reteoo.QueryTerminalNodeVertex;
import org.drools.reteoo.ReteVertex;
import org.drools.reteoo.RightInputAdapterNodeVertex;
import org.drools.reteoo.RuleTerminalNodeVertex;
import org.drools.spi.Constraint;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertySource;
import org.eclipse.ui.views.properties.PropertyDescriptor;
/**
* Providing IPropertySource for property sheets that show
* rete graph vertex properties.
*
*/
public class VertexPropertySource
implements
IPropertySource {
private static final String VERTEX_FROM = "From BaseVertex";
private static final String VERTEX_ACCUMULATE = "Accumulate BaseVertex";
private static final String VERTEX_COLLECT = "Collect BaseVertex";
private static final String VERTEX_EXISTS = "Exists BaseVertex";
private static final String VERTEX_TERMINAL = "Terminal BaseVertex";
private static final String VERTEX_QUERY_TERMINAL = "Query Terminal BaseVertex";
private static final String VERTEX_EVAL_CONDITION = "Eval Condition BaseVertex";
private static final String VERTEX_NOT = "Not BaseVertex";
private static final String VERTEX_JOIN = "Join BaseVertex";
private static final String VERTEX_RIGHT_INPUT_ADAPTER = "Right Input Adapter BaseVertex";
private static final String VERTEX_LEFT_INPUT_ADAPTER = "Left Input Adapter BaseVertex";
private static final String VERTEX_ALPHA = "Alpha BaseVertex";
private static final String VERTEX_OBJECT_TYPE = "Object Type BaseVertex";
private static final String VERTEX_RETE = "Rete BaseVertex";
private static final String VERTEX_ENTRY_POINT = "Entry Point BaseVertex";
private static final String VERTEX_PROPAGATION_QUEUING = "Propagation Queuing BaseVertex";
private static final String CONSTRAINT_CAP = "Constraint";
private static final String CONSTRAINT = "constraint";
public String ID_ROOT = "vertex"; //$NON-NLS-1$
public String ID_ID = "id"; //$NON-NLS-1$
public String ID_HTML = "html"; //$NON-NLS-1$
private IPropertyDescriptor[] descriptors;
private final IPropertyDescriptor PROP_NAME = new PropertyDescriptor( "name",
"Name" );
private final IPropertyDescriptor PROP_ID = new PropertyDescriptor( "id",
"ID" );
private final IPropertyDescriptor PROP_RULE = new PropertyDescriptor( "rule",
"Rule" );
private final IPropertyDescriptor PROP_QUERY = new PropertyDescriptor( "query",
"Query" );
// Alpha-specific
private final IPropertyDescriptor PROP_ALPHA_FIELD_NAME = new PropertyDescriptor( "fieldName",
"Field Name" );
private final IPropertyDescriptor PROP_ALPHA_EVALUATOR = new PropertyDescriptor( "evaluator",
"Evaluator" );
private final IPropertyDescriptor PROP_ALPHA_VALUE = new PropertyDescriptor( "value",
"Value" );
// ObjectType specific
private final IPropertyDescriptor PROP_OBJ_TYPE = new PropertyDescriptor( "objectType",
"Object Type" );
private final IPropertyDescriptor PROP_EXP_OFFSET = new PropertyDescriptor( "expirationOffset",
"Expiration Offset" );
// EntryPoint specific
private final IPropertyDescriptor PROP_ENTRY_POINT_NAME = new PropertyDescriptor( "entryPointName",
"Entry Point Name" );
private final static String CAT_GENERAL = "General";
private final static String CAT_OTHER = "Other";
protected BaseVertex vertex = null;
// Map<String,NodeValue>
private Map values = new HashMap();
/**
* Constructor initializing properties from <code>vertex</code>
*
* @param vertex source vertex for this property source
*/
public VertexPropertySource(BaseVertex vertex) {
this.vertex = vertex;
initProperties( vertex );
}
final private void initProperties(BaseVertex vertex) {
List descriptorList = new ArrayList();
if ( vertex instanceof ExistsNodeVertex ) {
initExistsNodeProperties( (ExistsNodeVertex) vertex,
descriptorList,
values );
} else if ( vertex instanceof FromNodeVertex ) {
initFromNodeProperties( (FromNodeVertex) vertex,
descriptorList,
values );
} else if ( vertex instanceof AccumulateNodeVertex ) {
initAccumulateNodeProperties( (AccumulateNodeVertex) vertex,
descriptorList,
values );
}else if ( vertex instanceof RuleTerminalNodeVertex ) {
initTerminalNodeProperties( (RuleTerminalNodeVertex) vertex,
descriptorList,
values );
} else if ( vertex instanceof QueryTerminalNodeVertex ) {
initQueryTerminalNodeProperties( (QueryTerminalNodeVertex) vertex,
descriptorList,
values );
} else if ( vertex instanceof EvalConditionNodeVertex ) {
initEvalConditionNodeProperties( (EvalConditionNodeVertex) vertex,
descriptorList,
values );
} else if ( vertex instanceof NotNodeVertex ) {
initNotNodeProperties( (NotNodeVertex) vertex,
descriptorList,
values );
} else if ( vertex instanceof JoinNodeVertex ) {
initJoinNodeProperties( (JoinNodeVertex) vertex,
descriptorList,
values );
} else if ( vertex instanceof RightInputAdapterNodeVertex ) {
initRightInputAdapterNodeProperties( descriptorList,
values );
} else if ( vertex instanceof LeftInputAdapterNodeVertex ) {
initLeftInputAdapterNodeProperties( (LeftInputAdapterNodeVertex) vertex,
descriptorList,
values );
} else if ( vertex instanceof AlphaNodeVertex ) {
initAlphaNodeProperties( (AlphaNodeVertex) vertex,
descriptorList,
values );
} else if ( vertex instanceof ObjectTypeNodeVertex ) {
initObjectTypeNodeProperties( (ObjectTypeNodeVertex) vertex,
descriptorList,
values );
} else if ( vertex instanceof ReteVertex ) {
initReteNodeProperties( (ReteVertex) vertex,
descriptorList,
values );
} else if ( vertex instanceof PropagationQueuingNodeVertex ) {
initPropagationQueuingNodeProperties( (PropagationQueuingNodeVertex) vertex,
descriptorList,
values );
} else if ( vertex instanceof EntryPointNodeVertex ) {
initEntryPointNodeProperties( (EntryPointNodeVertex) vertex,
descriptorList,
values );
}
descriptors = (IPropertyDescriptor[]) descriptorList.toArray( new IPropertyDescriptor[0] );
}
private void initExistsNodeProperties(ExistsNodeVertex vertex,
List descriptorList,
Map valueMap) {
addProperty( PROP_NAME,
VERTEX_EXISTS,
descriptorList,
valueMap );
addProperty( PROP_ID,
Integer.toString( vertex.getId() ),
descriptorList,
valueMap );
}
private void initAccumulateNodeProperties(AccumulateNodeVertex vertex,
List descriptorList,
Map valueMap) {
addProperty( PROP_NAME,
VERTEX_ACCUMULATE,
descriptorList,
valueMap );
addProperty( PROP_ID,
Integer.toString( vertex.getId() ),
descriptorList,
valueMap );
}
private void initFromNodeProperties(FromNodeVertex vertex,
List descriptorList,
Map valueMap) {
addProperty( PROP_NAME,
VERTEX_FROM,
descriptorList,
valueMap );
addProperty( PROP_ID,
Integer.toString( vertex.getId() ),
descriptorList,
valueMap );
}
private void initReteNodeProperties(ReteVertex vertex,
List descriptorList,
Map valueMap) {
addProperty( PROP_NAME,
VERTEX_RETE,
descriptorList,
valueMap );
addProperty( PROP_ID,
Integer.toString( vertex.getId() ),
descriptorList,
valueMap );
}
private void initObjectTypeNodeProperties(ObjectTypeNodeVertex vertex,
List descriptorList,
Map valueMap) {
addProperty( PROP_NAME,
VERTEX_OBJECT_TYPE,
descriptorList,
valueMap );
addProperty( PROP_OBJ_TYPE,
vertex.getObjectType(),
descriptorList,
valueMap );
addProperty( PROP_EXP_OFFSET,
vertex.getExpirationOffset(),
descriptorList,
valueMap );
}
private void initAlphaNodeProperties(AlphaNodeVertex vertex,
List descriptorList,
Map valueMap) {
addProperty( PROP_NAME,
VERTEX_ALPHA,
descriptorList,
valueMap );
addProperty( PROP_ALPHA_FIELD_NAME,
vertex.getFieldName(),
descriptorList,
valueMap );
addProperty( PROP_ALPHA_EVALUATOR,
vertex.getEvaluator(),
descriptorList,
valueMap );
addProperty( PROP_ALPHA_VALUE,
vertex.getValue(),
descriptorList,
valueMap );
Constraint constraint = vertex.getConstraint();
if ( constraint == null ) {
return;
}
IPropertyDescriptor prop = new PropertyDescriptor( CONSTRAINT,
CONSTRAINT_CAP );
addProperty( prop,
constraint.toString(),
descriptorList,
valueMap );
}
private void initLeftInputAdapterNodeProperties(LeftInputAdapterNodeVertex vertex,
List descriptorList,
Map valueMap) {
addProperty( PROP_NAME,
VERTEX_LEFT_INPUT_ADAPTER,
descriptorList,
valueMap );
}
private void initRightInputAdapterNodeProperties(List descriptorList,
Map valueMap) {
addProperty( PROP_NAME,
VERTEX_RIGHT_INPUT_ADAPTER,
descriptorList,
valueMap );
}
private void initJoinNodeProperties(JoinNodeVertex vertex,
List descriptorList,
Map valueMap) {
addProperty( PROP_NAME,
VERTEX_JOIN,
descriptorList,
valueMap );
addProperty( PROP_ID,
Integer.toString( vertex.getId() ),
descriptorList,
valueMap );
Constraint[] constraints = vertex.getConstraints();
if ( constraints == null ) {
return;
}
for ( int i = 0, length = constraints.length; i < length; i++ ) {
PropertyDescriptor prop = new PropertyDescriptor( CONSTRAINT + (i + 1),
CONSTRAINT_CAP + " " + (i + 1) );
addOther( prop,
constraints[i].toString(),
descriptorList,
valueMap );
}
}
private void initNotNodeProperties(NotNodeVertex vertex,
List descriptorList,
Map valueMap) {
addProperty( PROP_NAME,
VERTEX_NOT,
descriptorList,
valueMap );
addProperty( PROP_ID,
Integer.toString( vertex.getId() ),
descriptorList,
valueMap );
}
private void initEvalConditionNodeProperties(EvalConditionNodeVertex vertex,
List descriptorList,
Map valueMap) {
addProperty( PROP_NAME,
VERTEX_EVAL_CONDITION,
descriptorList,
valueMap );
addProperty( PROP_ID,
Integer.toString( vertex.getId() ),
descriptorList,
valueMap );
}
private void initTerminalNodeProperties(RuleTerminalNodeVertex node,
List descriptorList,
Map valueMap) {
addProperty( PROP_NAME,
VERTEX_TERMINAL,
descriptorList,
valueMap );
addProperty( PROP_ID,
Integer.toString( node.getId() ),
descriptorList,
valueMap );
addProperty( PROP_RULE,
node.getRuleName(),
descriptorList,
valueMap );
}
private void initQueryTerminalNodeProperties(QueryTerminalNodeVertex node,
List descriptorList,
Map valueMap) {
addProperty( PROP_NAME,
VERTEX_QUERY_TERMINAL,
descriptorList,
valueMap );
addProperty( PROP_ID,
Integer.toString( node.getId() ),
descriptorList,
valueMap );
addProperty( PROP_QUERY,
node.getQueryName(),
descriptorList,
valueMap );
}
private void initPropagationQueuingNodeProperties(PropagationQueuingNodeVertex vertex,
List descriptorList,
Map valueMap) {
addProperty( PROP_NAME,
VERTEX_PROPAGATION_QUEUING,
descriptorList,
valueMap );
addProperty( PROP_ID,
Integer.toString( vertex.getId() ),
descriptorList,
valueMap );
}
private void initEntryPointNodeProperties(EntryPointNodeVertex vertex,
List descriptorList,
Map valueMap) {
addProperty( PROP_NAME,
VERTEX_ENTRY_POINT,
descriptorList,
valueMap );
addProperty( PROP_ENTRY_POINT_NAME,
vertex.getEntryPointName(),
descriptorList,
valueMap );
addProperty( PROP_ID,
Integer.toString( vertex.getId() ),
descriptorList,
valueMap );
}
private void addProperty(IPropertyDescriptor field,
String value,
List descriptorList,
Map valueMap) {
descriptorList.add( field );
valueMap.put( field.getId().toString(),
new NodeValue( CAT_GENERAL,
value ) );
if ( field instanceof PropertyDescriptor ) {
((PropertyDescriptor) field).setAlwaysIncompatible( true );
((PropertyDescriptor) field).setCategory( CAT_GENERAL );
}
}
private void addOther(IPropertyDescriptor field,
String value,
List descriptorList,
Map valueMap) {
descriptorList.add( field );
valueMap.put( field.getId().toString(),
new NodeValue( CAT_OTHER,
value ) );
if ( field instanceof PropertyDescriptor ) {
((PropertyDescriptor) field).setAlwaysIncompatible( true );
((PropertyDescriptor) field).setCategory( CAT_OTHER );
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
*/
public Object getEditableValue() {
return null;
}
/* (non-Javadoc)
* @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
*/
public Object getPropertyValue(Object propName) {
return getPropertyValue( (String) propName );
}
/**
* Property value.
*
* @param propName
* @return
*/
public Object getPropertyValue(String propName) {
return ((NodeValue) (values.get( propName ))).value;
}
/* (non-Javadoc)
* @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
*/
public void setPropertyValue(Object propName,
Object value) {
setPropertyValue( propName,
value );
}
/* (non-Javadoc)
* @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
*/
public IPropertyDescriptor[] getPropertyDescriptors() {
return descriptors;
}
/**
* Doing nothing as resetting properties from property sheet is not possible.
*/
public void resetPropertyValue(Object propName) {
}
/* (non-Javadoc)
* @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
*/
public boolean isPropertySet(Object propName) {
return values.containsKey( propName );
}
private class NodeValue {
final String category;
final String value;
NodeValue(String category,
String value) {
this.category = category;
this.value = value;
}
}
}