2013-06-06 32 views
6

Sto provando a sviluppare un plug-in per Intellij IDEA, sto lavorando con l'SDK 129.451.Intellij IDEA plugin - PersistentStateComponent loadState non chiamato

Il problema che ho è che non riesco a persistere i dati degli utenti come alcuni elementi di una lista che possa ingresso nel plugin e avere i dati indietro dopo il riavvio IDE ..

Sto usando PersistentStateComponent a persistere della dati, il metodo getState() sembra essere chiamato ma il metodo loadState() no.

Ecco una lezione di prova che si estende PersistentStateComponent:

@State(name = "Test", storages = {@Storage(file = StoragePathMacros.APP_CONFIG+"/other.xml" 
)}) 
public class Test implements PersistentStateComponent<Element> { 

    String ceva; 

    public Test() { 
     ceva = "sad"; 
     System.out.println("constr"); 
    } 

    public String getCeva() { 
     return ceva; 
    } 

    public void setCeva(String ceva) { 
     this.ceva = ceva; 
    } 

    public void loadState(Element state) { 
     System.out.println("cstate load"); 

     ceva = (String) state.getContent().get(0); 

    } 

    public Element getState() { 
     System.out.println("cstate retu"); 
     Element configurationsElement = new Element("testtt"); 
     configurationsElement.addContent(ceva); 
     return configurationsElement; 

    } 
} 

Inoltre ho aggiunto questa classe in plugin.xml qui:

<extensions defaultExtensionNs="com.intellij"> 
    <applicationService serviceImplementation="ro.catalin.prata.testflightuploader.controller.Test"/> 
    <!-- Add your extensions here --> 
    <toolWindow id="TF Uploader" secondary="true" icon="/general/add.png" anchor="right" 
       factoryClass="ro.catalin.prata.testflightuploader.view.TFUploader"> 
    </toolWindow> 
</extensions> 

e ho anche una finestra degli strumenti classe:

public class TFUploader implements ToolWindowFactory { 

    private JButton buttonAction; 
    private ToolWindow myToolWindow; 

    final Test test = ServiceManager.getService(Test.class); 

    public TFUploader() { 

     // I assume it should print the saved string but it doesn't 
     System.out.println(test.getCeva()); 

     buttonAction.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       // if I click a button I am setting some new value to the string I want to save 
       test.setCeva(test.getCeva() + "-dddddd+"); 

      } 
     }); 

} 

Ok, se chiudo l'app o la minimizzo, il metodo getState viene chiamato come mi aspettavo .. ma quando apro l'app, il metodo loadState non viene chiamato .. qualcuno può aiutarmi come posso risolvere Questo?

Ho già letto this ma non sembra che mi aiuti molto. Inoltre voglio usare PersistentStateComponent perché voglio salvare oggetti più complessi di una semplice stringa.

Grazie in anticipo!

+0

Ho aggiunto la risposta a una domanda simile qui: http://stackoverflow.com/a/41201199/532541 In breve, questo è probabilmente dovuto all'inserimento del componente in

risposta

6

Ok, ce l'ho fatta! :)

non so esattamente che cosa il problema è stato, ma ho cambiato classe di test a questo:

@State(
     name = "Test", storages = { 
     @Storage(
       id = "other", 
       file = "$APP_CONFIG$/testpersist.xml") 
}) 
public class Test implements PersistentStateComponent<Test> { 

    String ceva; 

    public Test() { 
     ceva = "sad"; 
     System.out.println("constr"); 
    } 

    public String getCeva() { 
     return ceva; 
    } 

    public void setCeva(String ceva) { 
     this.ceva = ceva; 
    } 

    public void loadState(Test state) { 
     System.out.println("cstate load"); 

     XmlSerializerUtil.copyBean(state, this); 
    } 

    public Test getState() { 
     System.out.println("cstate retu"); 
     return this; 
    } 
} 

E nel TFUploader ho cambiato il modo in cui ho caricato la classe di test a questo:

final Test test = ServiceManager.getService(Test.class); 

spero che aiuta altri ..

1

ho già commentato here ma dirò ancora una volta che nel mio caso LoadState (MyService stato) non è stato chiamato a causa della mancanza o f getter e setter per stateValue da questo esempio:

class MyService implements PersistentStateComponent<MyService> { 
    public String stateValue; 

    public MyService getState() { 
    return this; 
    } 

    public void loadState(MyService state) { 
    XmlSerializerUtil.copyBean(state, this); 
    } 
} 
0

Nel mio caso mi è stato sempre un NullPointerException anche prima loadState è stato sempre chiamato. Simile al tuo codice sopra ho usato una classe Element come classe di stato. Avevo un costruttore con alcuni parametri nella classe Element. Questo era il problema in quanto il framework non poteva creare un'istanza della mia classe di stato. Ho provato ad aggiungere un costruttore vuoto senza parametri. Questo ha funzionato.