/*
* Created on Jul 5, 2006
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package org.mindswap.swoop.utils.external;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import org.mindswap.swoop.SwoopModel;
import org.semanticweb.owl.rules.OWLRule;
/**
* @author Dave Wang
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class ExternalRuleSubmitter extends JFrame implements ActionListener, ItemListener
{
class SubmissionProfile
{
public String name;
public String endpoint;
public String authenticationPoint;
public String [] options = {};
public String [] predObjAsserts = {};
public HashMap optionToAsserts = new HashMap();
public SubmissionProfile( String aName, String aURI, String aPoint, String [] opts, String [] predObjAss )
{
this.name = aName;
this.endpoint = aURI;
this.authenticationPoint = aPoint;
if ( opts != null)
this.options = opts;
if ( predObjAss!= null)
this.predObjAsserts = predObjAss;
for ( int i = 0; i < options.length; i++ )
{ optionToAsserts.put( options[i], predObjAsserts[i] ); }
}
public String toString()
{ return name; }
}
private SubmissionProfile PIT = new SubmissionProfile("Profiles in Terror", "http://profilesinterror.mindswap.org/document/accept/", "http://profilesinterror.mindswap.org/document/accept/", null, null );
private SubmissionProfile PP = new SubmissionProfile("PaperPuppy", "http://paperpuppy.mindswap.org/document/accept/", "http://paperpuppy.mindswap.org/document/accept/check_user", new String[]{"is a Display Rule?"}, new String[]{"<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.mindswap.org/dav/ontologies/2006/paperpuppy.owl#GraphRule>"} );
private static final boolean DEBUG = false;
private JTextField userIDField = new JTextField();
private JPasswordField passwordField = new JPasswordField();
private JComboBox destinationCombo = new JComboBox();
private JLabel submitTo = new JLabel("Submit to");
private JLabel userID = new JLabel("User ID");
private JLabel password = new JLabel("Password");
private JButton submitButton = new JButton("Submit");
private JButton cancelButton = new JButton("Cancel");
private JPanel optionalPanel = new JPanel();
private Vector checkBoxes;
private SwoopModel myModel;
private OWLRule myRule;
public ExternalRuleSubmitter( SwoopModel model, OWLRule rule )
{
super();
myModel = model;
myRule = rule;
setupUI();
setVisible( true );
}
private void setupUI()
{
this.setLocation( 200, 300 );
this.setTitle("Submitting Rule to External Portals");
this.setSize( 300, 100 );
//this.setResizable( false );
destinationCombo.addItem( PIT );
destinationCombo.addItem( PP );
JPanel top = new JPanel( new GridLayout(3, 1) );
JPanel p1 = new JPanel( new GridLayout(1, 2));
p1.add( submitTo );
p1.add( destinationCombo );
JPanel p2 = new JPanel( new GridLayout(1, 2));
p2.add( userID );
p2.add( userIDField );
JPanel p3 = new JPanel( new GridLayout(1, 2));
p3.add( password );
p3.add( passwordField );
top.add( p1 );
top.add( p2 );
top.add( p3 );
JPanel bot = new JPanel( new GridLayout(1, 2) );
bot.add( submitButton );
bot.add( cancelButton );
Container contentPane = this.getContentPane();
contentPane.setLayout( new BoxLayout( contentPane, BoxLayout.Y_AXIS ) );
contentPane.add( top );
contentPane.add( optionalPanel );
contentPane.add( bot );
submitButton.addActionListener( this );
cancelButton.addActionListener( this );
destinationCombo.addItemListener( this );
}
public void submit( String uri, String user ) throws java.io.IOException, Exception
{
String n3 = myModel.getRuleExpr().toN3( myRule );
String label = myModel.getRuleExpr().getLabel( myRule );
String predicate = myModel.getRuleExpr().getPredicate( myRule );
SubmissionProfile profile = (SubmissionProfile)destinationCombo.getSelectedItem();
for ( Iterator iter = checkBoxes.iterator(); iter.hasNext(); )
{
JCheckBox box = (JCheckBox)iter.next();
if ( box.getModel().isSelected())
{
//System.out.println( box.getText() + " is enabled.");
String predObjAssertion = (String)profile.optionToAsserts.get( box.getText() );
n3 = n3 + "\n<"+predicate + "> " +predObjAssertion + " .";
}
}
//System.out.println("n3 = " + n3);
String encodedrdf = URLEncoder.encode(n3, "UTF-8");
try {
URL url = new URL(uri);
URLConnection connection = url.openConnection();
connection.setDoOutput(true);
PrintWriter out = new PrintWriter(connection.getOutputStream());
out.println("n3blob=" + encodedrdf);
out.println("&inputtype=1");
out.println("&op=Submit");
out.println("&label=" + label);
out.println("&creator=" + user);
out.flush();
out.close();
connection.connect();
// mConn.connect();
InputStream is = connection.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(is));
String output = "";
String line;
while ( (line = in.readLine()) != null) {
output += line;
if (DEBUG)
System.err.println(line);
}
}
catch (Exception e) {
System.out.println("ERROR!");
System.out.println(e.getMessage());
}
}
public void actionPerformed(ActionEvent e)
{
Object src = e.getSource();
if ( src == submitButton )
{
SubmissionProfile profile = (SubmissionProfile)destinationCombo.getSelectedItem();
String uri = profile.endpoint;
String authPoint = profile.authenticationPoint;
String user = userIDField.getText();
String passwd = new String( passwordField.getPassword());
try
{
URL url = new URL( authPoint + "?username=" + user + "&password=" + passwd );
BufferedReader reader = new BufferedReader( new InputStreamReader(url.openStream()) );
String line = "";
String text = "";
while ( ( line = reader.readLine() ) != null )
{ text = text + line; }
reader.close();
submit( uri, user );
JOptionPane.showMessageDialog(null, "Submission accepted", "Success", JOptionPane.INFORMATION_MESSAGE);
this.setVisible( false );
this.dispose();
}
catch ( Exception ex )
{
ex.printStackTrace();
if ( ex instanceof java.io.IOException )
{
String msg = ex.getMessage();
if ( msg.indexOf( "HTTP response code: 401") != -1 )
JOptionPane.showMessageDialog(null, "Invalid Username/Password", "Invalid Username/Password", JOptionPane.ERROR_MESSAGE);
// if site does not support authentication, allow submission
else if ( msg.indexOf( "HTTP response code: 404") !=-1 )
{
try
{
submit( uri, user );
JOptionPane.showMessageDialog(null, "Submission accepted", "Success", JOptionPane.INFORMATION_MESSAGE);
}
catch ( Exception exc )
{ exc.printStackTrace(); }
}
}
}
}
else if (src == cancelButton )
{
this.setVisible( false );
this.dispose();
}
}
public void itemStateChanged(ItemEvent e)
{
if ( e.getStateChange() == ItemEvent.SELECTED )
{
SubmissionProfile profile = (SubmissionProfile)e.getItem();
optionalPanel.removeAll();
String [] opts = profile.options ;
JPanel panel = new JPanel();
checkBoxes = new Vector();
panel.setLayout( new GridLayout(opts.length, 2) );
for (int i = 0; i < opts.length; i++ )
{
String name = opts[i];
JCheckBox check = new JCheckBox( name );
panel.add( check );
checkBoxes.add( check );
}
optionalPanel.add( panel );
optionalPanel.revalidate();
this.pack();
}
}
}