/*
* Created on Jun 7, 2005
*/
package org.mindswap.swoop.popup;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URI;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
import org.mindswap.swoop.SwoopModel;
import org.mindswap.swoop.utils.RuleValue;
import org.mindswap.swoop.utils.RulesExpressivity;
import org.semanticweb.owl.impl.rules.OWLRuleDataFactoryImpl;
import org.semanticweb.owl.model.OWLClass;
import org.semanticweb.owl.model.OWLDataProperty;
import org.semanticweb.owl.model.OWLException;
import org.semanticweb.owl.model.OWLObject;
import org.semanticweb.owl.model.OWLObjectProperty;
import org.semanticweb.owl.model.OWLOntology;
import org.semanticweb.owl.rules.OWLRule;
import org.semanticweb.owl.rules.OWLRuleAtom;
import org.semanticweb.owl.rules.OWLRuleClassAtom;
import org.semanticweb.owl.rules.OWLRuleDVariable;
import org.semanticweb.owl.rules.OWLRuleDataPropertyAtom;
import org.semanticweb.owl.rules.OWLRuleIVariable;
import org.semanticweb.owl.rules.OWLRuleObjectPropertyAtom;
/**
* @author Daniel Hewlett
*
*/
public class PopupAddRule extends JFrame implements ActionListener {
SwoopModel model;
OWLRule rule;
OWLRuleAtom headAtom = null;
OWLRuleIVariable headVar = null;
OWLRuleIVariable headVar2 = null;
OWLRuleDVariable headDataVar = null;
HashMap tempRuleMap = new HashMap();
boolean fresh = true;
OWLRuleDataFactoryImpl factory = new OWLRuleDataFactoryImpl();
RulesExpressivity expr;
int currExpr = 1;
JList atomList;
DefaultListModel lm = new DefaultListModel();
JButton addRule;
JButton cancel;
JButton addAtom;
JButton deleteAtom;
JButton editAtom;
JLabel consLabel;
JLabel expLabel;
JLabel ruleLabel;
// creates a blank rule window for a new rule
public PopupAddRule( SwoopModel mod, OWLObject head ) {
model = mod;
fresh = true;
try {
headVar = factory.getOWLRuleIVariable( URI.create( "x" ) );
headVar2 = factory.getOWLRuleIVariable( URI.create( "y" ) );
headDataVar = factory.getOWLRuleDVariable( URI.create( "z" ) );
if ( head instanceof OWLClass ) {
headAtom = factory.getOWLRuleClassAtom( (OWLClass) head, headVar );
} else if ( head instanceof OWLObjectProperty ) {
headAtom = factory.getOWLRuleObjectPropertyAtom( headVar, (OWLObjectProperty) head, headVar2 );
} else if ( head instanceof OWLDataProperty ) {
headAtom = factory.getOWLRuleDataPropertyAtom( headVar, (OWLDataProperty) head, headDataVar );
} else {
System.err.println( "wrong class in parameter" );
}
Set consequents = new HashSet();
consequents.add( headAtom );
rule = factory.getOWLRule( new HashSet(), consequents );
} catch ( OWLException e ) {}
expr = (RulesExpressivity) mod.getRuleExpr().clone();
setupUI();
}
// creates a rule window populated by the current rule, for editing
public PopupAddRule( SwoopModel mod, OWLRule rule ) {
model = mod;
this.rule = rule;
fresh = false;
try {
headAtom = (OWLRuleAtom) rule.getConsequents().iterator().next();
}
catch (Exception e) {
System.out.println(e.getStackTrace());
}
expr = (RulesExpressivity) mod.getRuleExpr().clone();
currExpr = expr.calcOneRuleExpress( rule, mod.getSelectedOntology(), false );
setupUI();
}
private void setupUI() {
atomList = new JList();
atomList.setModel( lm );
consLabel = new JLabel( headAtom.toString() );
if ( !fresh ) {
decodeRule();
}
JScrollPane listSP = new JScrollPane( atomList );
listSP.setBorder( new EmptyBorder( 0, 5, 0, 5 ) );
// top panel
JPanel top = new JPanel();
top.setLayout( new BoxLayout ( top, BoxLayout.X_AXIS ) );
// try {
// top.add( new JLabel( "Creating Rule for " + model.shortForm( model.getSelectedEntity().getURI() ) ) );
// } catch ( OWLException e ) {}
top.add( consLabel );
// right panel - buttons for editing atoms
JPanel right = new JPanel();
right.setLayout( new BoxLayout( right, BoxLayout.Y_AXIS ) );
addAtom = new JButton( "Add Atom" );
addAtom.addActionListener( this );
addAtom.setMaximumSize( new Dimension( 110, 30 ) );
deleteAtom = new JButton( "Delete Atom" );
deleteAtom.addActionListener( this );
deleteAtom.setMaximumSize( new Dimension( 110, 30 ) );
editAtom = new JButton( "Edit Atom" );
editAtom.addActionListener( this );
editAtom.setMaximumSize( new Dimension( 110, 30 ) );
right.add( addAtom );
right.add( Box.createRigidArea( new Dimension( 5, 5 ) ) );
right.add( deleteAtom );
right.add( Box.createRigidArea( new Dimension( 5, 5 ) ) );
right.add( editAtom );
// bottom panel: contains expressivity and concise display of rule
JPanel bottom = new JPanel();
bottom.setLayout( new BoxLayout( bottom, BoxLayout.Y_AXIS ) );
bottom.setBorder( new EmptyBorder( 5, 5, 5, 5 ) );
ruleLabel = new JLabel();
ruleLabel.setText( regenerateRuleText() );
ruleLabel.setAlignmentX( 0 );
expLabel = new JLabel();
expLabel.setAlignmentX( 0 );
if ( fresh ) {
expLabel.setText( "Expressivity: " + "Full SWRL" );
} else {
// when editing, the function below was adding extra rules
// decided to simply comment it out
// updateExpressivity();
justUpdateExpressivity();
}
JPanel bottomButtons = new JPanel();
if ( fresh )
addRule = new JButton( "Add & Close" );
else
addRule = new JButton( "Done" );
addRule.addActionListener( this );
cancel = new JButton( "Cancel" );
cancel.addActionListener(this);
bottomButtons.add( addRule );
bottomButtons.add( cancel );
bottomButtons.setAlignmentX( 0 );
bottom.add( ruleLabel );
bottom.add( expLabel );
bottom.add( bottomButtons );
Container contentPane = this.getContentPane();
contentPane.setLayout( new BorderLayout() );
contentPane.add( top, BorderLayout.NORTH );
contentPane.add( listSP, BorderLayout.CENTER );
contentPane.add( right, BorderLayout.EAST );
contentPane.add( bottom, BorderLayout.SOUTH );
this.pack();
this.setTitle( "Editing Rule" );
this.setSize( 400, 300 );
}
public void decodeRule() {
try {
lm.removeAllElements();
for ( Iterator a = rule.getAntecedents().iterator(); a.hasNext(); ) {
OWLRuleAtom curr = (OWLRuleAtom) a.next();
lm.addElement( curr );
}
} catch ( OWLException e ) {}
}
public void setRule( OWLRule newRule ) {
OWLRule oldRule = rule;
rule = newRule;
decodeRule();
updateExpressivity(oldRule);
this.ruleLabel.setText( regenerateRuleText() );
}
public String regenerateRuleText() {
String text = new String();
for ( int i = 0; i < lm.getSize(); i++ ) {
if ( i > 0 )
text = text.concat( ", " );
text = text.concat( lm.get( i ).toString() );
}
return this.consLabel.getText() + " :- " + text;
}
public void justUpdateExpressivity() {
try {
OWLOntology ontology;
ontology = model.getSelectedOntology();
// For imported ontologies
HashSet importedOnts = (HashSet) ontology.getIncludedOntologies();
// If there is no imported ontology in the rules file it assumes
// that rules and ontology are in the same file
if (!(importedOnts.isEmpty())) {
Iterator it = importedOnts.iterator();
ontology = (OWLOntology) it.next();
}
currExpr = expr.calcOneRuleExpress( rule, ontology, false );
expLabel.setText( "Expressivity: " + expr.getTypeRulesExpress()[currExpr] );
}
catch (Exception e) {
e.printStackTrace();
}
}
public void updateExpressivity(OWLRule oldRule) {
try {
OWLOntology ontology;
ontology = model.getSelectedOntology();
// For imported ontologies
HashSet importedOnts = (HashSet) ontology.getIncludedOntologies();
// If there is no imported ontology in the rules file it assumes
// that rules and ontology are in the same file
if (!(importedOnts.isEmpty())) {
Iterator it = importedOnts.iterator();
ontology = (OWLOntology) it.next();
}
currExpr = expr.calcOneRuleExpress( rule, ontology, false );
RuleValue ruleValue = new RuleValue(rule,
currExpr);
//before adding to map, need to delete old rule
OWLRuleAtom consAtom = (OWLRuleAtom)oldRule.getConsequents().iterator().next();
OWLObject key = null;
if (consAtom instanceof OWLRuleClassAtom) {
key = ((OWLRuleClassAtom) consAtom).getDescription();
} else {
if (consAtom instanceof OWLRuleDataPropertyAtom) {
key = ((OWLRuleDataPropertyAtom) consAtom).getProperty();
} else {
if (consAtom instanceof OWLRuleObjectPropertyAtom) {
key = ((OWLRuleObjectPropertyAtom) consAtom)
.getProperty();
}
}
}
HashSet rulesSet = (HashSet) expr.getRuleMap().get(key);
//find the rule we want to delete
RuleValue rvDelete = null;
if (rulesSet != null) {
Iterator it = rulesSet.iterator();
while (it.hasNext()) {
RuleValue rv = (RuleValue) it.next();
if (rv.getRule().equals(oldRule)) {
rvDelete = rv;
}
}
rulesSet.remove(rvDelete);
expr.getRuleMap().put(key, rulesSet);
}
expr.addMap(ruleValue, (OWLRuleAtom) rule.getConsequents().iterator().next());
expLabel.setText( "Expressivity: " + expr.getTypeRulesExpress()[currExpr] );
}
catch (Exception e) {
e.printStackTrace();
}
}
public void addAtom( OWLRuleAtom atom ) {
try {
Set newAntecedents = new HashSet();
if ( rule.getAntecedents() != null )
newAntecedents.addAll( rule.getAntecedents() );
newAntecedents.add( atom );
OWLRule newRule = factory.getOWLRule( newAntecedents, rule.getConsequents() );
System.out.println( "NEW_RULE: " + newRule );
setRule( newRule );
} catch ( OWLException e ) { e.printStackTrace(); }
this.deleteAtom.setEnabled( true );
}
/* (non-Javadoc)
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
public void actionPerformed(ActionEvent arg0) {
JButton button = (JButton) arg0.getSource();
if ( button == addAtom ) {
PopupEditAtom test = new PopupEditAtom( model, rule, this );
test.setVisible(true);
} else if ( button == editAtom ) {
// TODO implement this later
} else if ( button == deleteAtom ) {
OWLRule oldRule = rule;
Set newAntecedents = new HashSet();
try {
for ( Iterator a = rule.getAntecedents().iterator(); a.hasNext(); ) {
Object curr = a.next();
if ( !curr.equals( atomList.getSelectedValue() ) ) {
newAntecedents.add( curr );
}
}
OWLRule newRule = factory.getOWLRule( newAntecedents, rule.getConsequents() );
System.out.println( "NEW_RULE: " + newRule );
rule = newRule;
} catch ( OWLException e ) {}
lm.remove( atomList.getSelectedIndex() );
ruleLabel.setText( regenerateRuleText() );
updateExpressivity(oldRule);
if ( lm.getSize() == 0 ) {
deleteAtom.setEnabled( false );
} else {
this.atomList.setSelectedIndex( lm.getSize() - 1 );
}
}
else if (button == addRule) {
this.setVisible(false);
//commit changes to ruleExpr in swoopModel
model.setRuleExpr(expr);
model.addUncommittedChanges(new HashSet());
}
else if (button == cancel) {
this.setVisible(false);
}
}
}