2011-08-14 7 views
2

javaで作成したインターフェイスでインスタンスのデータ型プロパティの値を削除しようとしていますが、動作しません。それは私に与えますJenaでデータ型のプロパティの値を削除できません

Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException. 

なぜ私は理解できません。何が間違っているのか教えていただけますか?ここで

は、ボタン削除のために私のコードです:

//Button Remove 
public class ActionRemove implements ActionListener 
{ 

    public void actionPerformed(ActionEvent evt) 
    { 

     StmtIterator iter = onto.model.listStatements(); 

     while (iter.hasNext()) 
     { 
      Statement stmt = iter.nextStatement(); 

      Resource subject = stmt.getSubject(); 
      Property predicate = stmt.getPredicate(); 
      RDFNode object = stmt.getObject(); 
      if(subject.toString().equals (onto.uriBase+"#"+tabTF[0].getText())) 
      { 

       onto.model.remove(stmt); 

      } 

    } 
} 
} 

私の完全なコード:

import java.util.*; 
import com.hp.hpl.jena.rdf.model.*; 
import com.hp.hpl.jena.ontology.*; 
import com.hp.hpl.jena.ontology.impl.*; 
import com.hp.hpl.jena.util.*; 
import java.io.*; 
import java.awt.*; 
import java.awt.event.*; 
import com.hp.hpl.jena.vocabulary.RDF; 
import com.hp.hpl.jena.vocabulary.XSD; 
import com.hp.hpl.jena.util.iterator.ExtendedIterator; 




public class FamilyModel extends Frame 
{ 
TextField[]tabTF=new TextField[4]; 
Button bAjout, bModifier, bSupprimer, bPrecedent, bSuivant, bRemove; //buttons Add, Remove, Previous, Next 
OntModel model; 
Onto onto; 
int indice=0; 
int p=0; 
Resource p1; 


Button creerBouton(String S, int x, int y) 
{ 
    Button b=new Button(S); 
    add(b);   
    b.setBounds(x,y,120,30); 
    return b; 
} 

void creerLabel(String etiquette, int x, int y) 
{ 
    Label la=new Label(etiquette); 
    la.setBounds(x,y,100,25); 
    add(la); 
} 


public FamilyModel() 
{ 
     setLayout (null); 
     setBackground (Color.pink); 
     setBounds (100,200,900,450); 
     addWindowListener(new FermerFenetre()); 

     creerLabel("Prenom : ",10,50); 
     creerLabel("Nom : ",10,100); 
     creerLabel("Date de Naissance: ",10,145); 
     creerLabel("Genre (H ou F): ",10,190); 

     //TextFields 
     for(int i=0;i<4;i++) 
     { 
      tabTF[i]=new TextField(""); 
      tabTF[i].setBackground(Color.white); 
      add(tabTF[i]); 
     } 
     tabTF[0].setBounds(120,45,150,25); 
     tabTF[1].setBounds(120,100,150,25); 
     tabTF[2].setBounds(120,145, 100,25); 
     tabTF[3].setBounds(120,190, 45,25); 

     bAjout=creerBouton("Ajouter",20,250); 
     setVisible(true); 

     bModifier=creerBouton("Modifier",138,250); 
     setVisible(true); 

     bSupprimer=creerBouton("Supprimer",250,250); 
     setVisible(true); 

     bPrecedent=creerBouton("Precedent",360,250); 

     bSuivant=creerBouton("Suivant",450,250); 

     bRemove=creerBouton("Supprimer",600,250); 

     setVisible(true); 

     onto = new Onto(); 

     readRDFfile(); 

     traitement(this); 

} 



void traitement(Frame fenetre) 
{ 

    bAjout.addActionListener(new ActionAjoutPersonne()); 
    bModifier.addActionListener(new ActionRemove()); 
    bSuivant.addActionListener(new ActionSuivant()); 
    bPrecedent.addActionListener(new ActionPrecedent()); 
    bRemove.addActionListener(new ActionRemove()); 

} 


//Button Add 
public class ActionAjoutPersonne implements ActionListener 
{ 

    public void actionPerformed(ActionEvent evt) 
    { 


     p1=onto.model.createResource(onto.uriBase+"#"+tabTF[0].getText()); 
     p1.addProperty(onto.aPourPrenom, tabTF[0].getText());   
     p1.addProperty(onto.aPourNom, tabTF[1].getText());   
     p1.addProperty(onto.aDateNaiss, tabTF[2].getText()); 

     if (tabTF[3].getText().equals("F")) 
     { 
      p1.addProperty(onto.aGenre, tabTF[3].getText()); 
      p1.addProperty(RDF.type, onto.femme); 

     } 
     else if (tabTF[3].getText().equals("H")) 
     { 
      p1.addProperty(onto.aGenre, tabTF[3].getText());  
      p1.addProperty(RDF.type, onto.homme); 
     } 

     StringWriter sw = new StringWriter(); 
     onto.model.write(sw, "RDF/XML-ABBREV"); 
     String owlCode = sw.toString(); 
     File file = new File("d:/Onto.rdf"); 
     try{ 
      FileWriter fw = new FileWriter(file); 
      fw.write(owlCode); 
      fw.close(); 
     } catch(FileNotFoundException fnfe){ 
      fnfe.printStackTrace();} 
     catch(IOException ioe){ 
       ioe.printStackTrace(); 
     } 

    } 
} 



//Button Remove 
public class ActionRemove implements ActionListener 
{ 

    public void actionPerformed(ActionEvent evt) 
    { 

     StmtIterator iter = onto.model.listStatements(); 

     while (iter.hasNext()) 
     { 
      Statement stmt = iter.nextStatement(); 

      Resource subject = stmt.getSubject(); 
      Property predicate = stmt.getPredicate(); 
      RDFNode object = stmt.getObject(); 
      if(subject.toString().equals (onto.uriBase+"#"+tabTF[0].getText())) 
      { 

       onto.model.remove(stmt); 

      } 

    } 
    } 
} 


//Read Onto.rdf 
public void readRDFfile() 
{ 
    String inputFile="D:/Onto.rdf"; 
    try 
    { 
    InputStream in =new FileInputStream(inputFile); 
     if (in == null) { 
     System.out.println("File not found"); 
    } 
     onto.model.read(in," "); 

    }catch(Exception e) { 
      System.out.println("model.read catched error: " + e); 
    } 
} 

//Button Next 
class ActionSuivant implements ActionListener 
{ 
    public void actionPerformed(ActionEvent evt) 
    { 

     ++indice; 
     ExtendedIterator instances = onto.personne.listInstances(); 
     Individual instance = null; 
     Individual firstInstance = null; 
     for (p = 0; p < indice && instances.hasNext(); p++) { 
      instance = (Individual) instances.next(); 
      if (firstInstance == null) { 
       firstInstance = instance; 
      } 
     }  
     if (p < indice) { 
      indice = 1; 
      instance = firstInstance; 
     } 
     tabTF[0].setText(instance.getPropertyValue(onto.aPourPrenom).toString()); 
     tabTF[1].setText(instance.getPropertyValue(onto.aPourNom).toString()); 
     tabTF[2].setText(instance.getPropertyValue(onto.aDateNaiss).toString()); 
     tabTF[3].setText(instance.getPropertyValue(onto.aGenre).toString()); 
    } 

} 

//Button Previous 
class ActionPrecedent implements ActionListener 
{ 
    public void actionPerformed(ActionEvent evt) 
    {  
     --indice; 
     //Instances de la Classe Personne   
     ExtendedIterator instances=onto.personne.listInstances(); 

     Individual instance = null; 
       for(p = 0; p < indice && instances.hasNext(); p++) 
       { 
        instance = (Individual) instances.next(); 

       } 
       tabTF[0].setText(instance.getPropertyValue(onto.aPourPrenom).toString()); 
       tabTF[1].setText(instance.getPropertyValue(onto.aPourNom).toString()); 
       tabTF[2].setText(instance.getPropertyValue(onto.aDateNaiss).toString()); 
       tabTF[3].setText(instance.getPropertyValue(onto.aGenre).toString()); 

      } 
} 


//Close window when X is pressed 
public class FermerFenetre extends WindowAdapter 
{ 

    public void windowClosing(WindowEvent evt) 
    { 
     if(evt.getWindow().getName().equals("frame0")) 
     { 
      System.exit(0); 
     } 
     else 
     { 
      evt.getWindow().dispose(); 
     } 
    } 
} 


//Ontology 
public class Onto 
{ 
    OntClass personne, genre, homme, femme, feminin, masculin, evenement, deces, mariage, divorce; 
    OntModel model; 
    String uriBase; 
    ObjectProperty aPourFils, aPourFille, aGenre; 
    DatatypeProperty aPourNom, aPourPrenom, aDateNaiss; 

    public Onto(){ 
    model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM_MICRO_RULE_INF); 
    uriBase = "http://www.something.com/FAM"; 
    model.createOntology(uriBase); 

    //Classes 
    personne = model.createClass(uriBase+"personne"); 
    femme = model.createClass(uriBase+"femme"); 
    homme = model.createClass(uriBase+"homme"); 
    genre = model.createClass(uriBase+"genre"); 
    feminin = model.createClass(uriBase+"feminin"); 
    masculin = model.createClass(uriBase+"masculin"); 
    evenement = model.createClass(uriBase+"evenement"); 
    deces = model.createClass(uriBase+"deces"); 
    mariage = model.createClass(uriBase+"mariage"); 
    divorce = model.createClass(uriBase+"divorce"); 


    //Sub-classes 
    genre.addSubClass(feminin); 
    genre.addSubClass(masculin); 
    personne.addSubClass(homme); 
    personne.addSubClass(femme); 
    evenement.addSubClass(deces); 
    evenement.addSubClass(mariage); 
    evenement.addSubClass(divorce); 

    aPourFils = model.createObjectProperty(uriBase+"aPourFils"); 
    aPourFils.setDomain(personne); 
    aPourFils.setRange(homme); 

    aPourFille = model.createObjectProperty(uriBase+"aPourFille"); 
    aPourFille.setDomain(personne); 
    aPourFille.setRange(femme); 

    aGenre = model.createObjectProperty(uriBase+"aGenre"); 
    aGenre.setDomain(personne); 
    aGenre.setRange(genre); 

    aPourNom = model.createDatatypeProperty(uriBase+"aPourNom"); 
    aPourNom.setDomain(personne); 
    aPourNom.setRange(XSD.xstring); 

    aPourPrenom = model.createDatatypeProperty(uriBase+"aPourPrenom"); 
    aPourPrenom.setDomain(personne); 
    aPourPrenom.setRange(XSD.xstring); 

    aDateNaiss = model.createDatatypeProperty(uriBase+"aDateNaiss"); 
    aDateNaiss.setDomain(personne); 
    aDateNaiss.setRange(XSD.xstring); 
    } 

} 

public static void main(String args[]) 
{ 

    new FamilyModel();  
} 
} 

答えて

5

あなたは、コレクションから項目を削除してから、前のイテレータを使用し続けていますその上に。

ほとんどのJavaコレクションイテレータには、「フェイルファースト」プロパティがあります。基になるコレクションが変更されたことを検出すると、ConcurrentModificationExceptionがスローされます。

あなたのソリューションは、2段階の除去工程を行うことです。

  1. 反復処理し、あなたが
  2. を削除する必要があるノードが実際にあなたが(最初のステップで見つかった)、削除するノードのリストを反復処理し、見つけますそれらを元のコレクションから削除します。 (Javaの5を想定)

コード:別の方法があり

//Button Remove 
public class ActionRemove implements ActionListener 
{ 

    public void actionPerformed(ActionEvent evt) 
    { 
     List<Statement> statementsToRemove = new ArrayList<Statement>(); 

     // step 1 
     StmtIterator iter = onto.model.listStatements(); 
     while (iter.hasNext()) 
     { 
      Statement stmt = iter.nextStatement(); 

      Resource subject = stmt.getSubject(); 
      Property predicate = stmt.getPredicate(); 
      RDFNode object = stmt.getObject(); 
      if(subject.toString().equals (onto.uriBase+"#"+tabTF[0].getText())) 
      { 
       statementsToRemove.add(stmt); 
      } 
     } 

     // step 2 
     for(Statement stmt : statementsToRemove) 
     { 
      onto.model.remove(stmt); 
     } 
    } 
} 

http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/CopyOnWriteArrayList.htmlクラスを参照してください)が、あなたのコレクションがイエナAPIの内側にあるので、あなたがそれを使用することはできません。)。

+0

ありがとうございました! :) – ARH

+0

あなたは大歓迎です:) –

関連する問題