Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di cerza
    Registrato dal
    Oct 2009
    Messaggi
    310

    [java]problemi con le mappe e tipi

    Ciao, ho un problema con le mappe, in quanto sto cambiando il codice di un'applicazione che simula una rete peer to peer, dovrei modificarla in modo da poterla eseguire su macchine reali, per passare dalla simulazione all'emulazione. Il codice originale crea dei nodi sulla stessa macchina virtuale e li aggiunge in una mappa, io invece vorrei aggiungere in questa mappa l'identificatore delle macchine reali a cui invio un messaggio e quando ricevo la risposta ho il loro ID, ma la mappa non prende il tipo che dico io .

    La riga di codice originale è questa:
    codice:
      nodes.put(node.getPastryNode().getId() + "", node);
    il valore node è di tipo Pacnode una classe del codice, mentre io vorrei immettere un valore di tipo rice.pastry.NodeHandle e quindi scrivendo
    codice:
    NodeHandle nh = leafSet.get(i);
    nodes.put(nh.getNodeId()+ "",nh.getNodeId());
    in questo modo mi lancia l'eccezione java.lang.ClassCastException appunto.

    Vorrei riuscire a inserire questi nodi reali nella mappa .. qualcuno gentilmente può darmi una mano?
    Grazie in anticipo.
    Maria

  2. #2

    Re: [java]problemi con le mappe e tipi

    Se la mappa accetta come valori nodi di uno specifico tipo (perché è stata dichiarata così) non puoi inserire al suo interno valori di altro tipo in nessun caso. La domanda è quindi ad esempio , non puoi cambiare il tipo di quella mappa? Quale impedimento hai? Capisci bene che il contesto in cui stai operando è abbastanza oscuro, hai postato due misere righe di codice .
    Una cosa strana che noto è che nella tua idea di utilizzo della mappa chiave e valore praticamente coincidono a meno del fatto che la chiave è stata convertita in stringa con + "", sei sicura che ti serva veramente ridondare l'informazione a questo modo?
    In ogni modo perché si possa provare ad aiutarti devi essere più generosa con il codice e le informazioni a supporto.
    Ciao
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  3. #3
    Utente di HTML.it L'avatar di cerza
    Registrato dal
    Oct 2009
    Messaggi
    310
    ok grazie hai ragione, provo a postare più codice allora la classe Pacnode è la seguente

    codice:
    package p2pac.model;
    
    import java.net.InetSocketAddress;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import p2pac.model.AcRule;
    import rice.environment.Environment;
    import rice.p2p.commonapi.NodeHandle;
    import rice.pastry.Id;
    import rice.pastry.PastryNode;
    
    
    public class PacNode {
    
        public Id pid;
        private PastryNode pastryNode;
        private String database;
        private int acCount;    //counter of AC Rule
        private List acrules = new ArrayList();
        private List SecretShares = new ArrayList();
    
        public PacNode(PastryNode pastryNode, String dirFile) {
            this.pid = pastryNode.getNodeId();
            this.pastryNode = pastryNode;
            this.database = pastryNode.getId().toString();
            this.acCount = 0;
            
         }
    
        public void addAcRule(String sql, List peers, Map networkMap, int recoveryThreshold, int shareSize, Environment env) throws InterruptedException {
            // create the AC rule
            AcRule myAcr = new AcRule(pid, acCount++, sql, peers);
            acrules.add(myAcr);
    
            // encrypt the database block and get the key
            String key = "5";
    
            // enforce the AC rule   far rispettare le regole AC
            myAcr.enforceAcRule(recoveryThreshold, shareSize, key, networkMap, env);
        }
    
        public void addSecretShare(SecretShare share) {
            SecretShares.add(share);
        }
    
        public int getSecretSharesSize() {
            return SecretShares.size();
        }
    
        public SecretShare getSecretShare(int index) {
            return (SecretShare) SecretShares.get(index);
        }
    
        public PastryNode getPastryNode() {
            return pastryNode;
        }
    
        public boolean isAcRulesEmpty() {
            return acrules.isEmpty();
        }
    
        public int getAcRulesSize() {
            return acrules.size();
        }
    
        public AcRule getAcRule(int index) {
            return (AcRule) acrules.get(index);
        }
    
     }

    mentre nella classe del controllo dove viene creata la mappa una parte del codice è la seguente

    codice:
    BootHandle bootHandle = ((SocketPastryNodeFactory) factory).getNodeHandle(bootaddress);
    
    
    Pastrynode   =    pastryNode = factory.newNode(bootHandle);
    
    PacNode node = new PacNode(pastryNode, dirFile);
    MyApp app = new MyApp(node.getPastryNode());
     NodeIdFactory nidFactory = new RandomNodeIdFactory(env);
    
      synchronized (node.getPastryNode()) {
                    while (!node.getPastryNode().isReady() && !node.getPastryNode().joinFailed()) {
    
                        node.getPastryNode().wait(5000);
    
                       // node.wait(500);
                        if (node.getPastryNode().joinFailed()) {
                            throw new IOException("Unable to connect to the ring. Reason: " +      node.getPastryNode().joinFailedReason());
                        }
                    }
                }
    
      // route 10 messages
        for (int i = 0; i < 1; i++) {
    
          // pick a key at random
          Id randId = nidFactory.generateNodeId();
    
          // send to that key
          app.routeMyMsg(randId);
    
          // wait a sec
          env.getTimeSource().sleep(1000);
        }
    
        // wait 10 seconds
        env.getTimeSource().sleep(10000);
    
        // send directly to my leafset
        LeafSet leafSet = node.getPastryNode().getLeafSet();
    
        // this is a typical loop to cover your leafset.  Note that if the leafset
        // overlaps, then duplicate nodes will be sent to twice
    
        for (int i=-leafSet.ccwSize(); i<=leafSet.cwSize(); i++) {
    
          if (i != 0) { // don't send to self
             
            // select the item
            NodeHandle nh = leafSet.get(i);
            // send the message directly to the node
            app.routeMyMsgDirect(nh);
    
               nodesKeys.add(nh.getNodeId());
     
               nodes.put(nh.getNodeId()+ "",node);
    dove nella mappa dovrebbe esserci un valore di tipo "node" Della classe PAcnode, sul fatto della ridondanza hai ragione, ma stavo facendo delle prove. Cmq non posso cambiare il tipo della mappa.. in quanto su quella ci sono altre classi a molti altri metodi che ci lavorano sopra.. e non posso cambiare il tutto!!!dovrei capire come fa diventare il mio ID del tipo giusto da immettere nella mappa.
    Non so se sono stata abbastanza chiara.
    Grazie in anticipo

  4. #4
    Si ma non vedo dove viene istanziata la mappa...proprio quello non l'hai postato
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  5. #5
    Utente di HTML.it L'avatar di cerza
    Registrato dal
    Oct 2009
    Messaggi
    310
    Si hai ragione scusa, è che in questi giorni sono troppo stressata, non riesco più a ragionare
    Cmq nel secondo codice che ho postato prima,
    il quale si trova tutto in una classe in cui si trova il main,
    c'è :

    codice:
      Map nodes = new HashMap();
    e poi viene usata direttamente nel codice in cui vengono immessi i nodi. che appunto ho postato prima.

    Sono abbastanza disperata, devo risolvere questa cosa.

    Grazie ancora per l'immensa pazienza.

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    3,660
    il metodo put della classe HashMap accetta come parametri di input(chiave e valore) duo oggetti di tipo Object.... visto che tutte le classi derivano dalla Object mi sembra impossibile che ti lancia l'eccezzione ClassCastException... hai verificato che sia effettivamente quella la riga di codice che va in errore?

  7. #7
    Originariamente inviato da Vindav
    il metodo put della classe HashMap accetta come parametri di input(chiave e valore) duo oggetti di tipo Object.... visto che tutte le classi derivano dalla Object mi sembra impossibile che ti lancia l'eccezzione ClassCastException... hai verificato che sia effettivamente quella la riga di codice che va in errore?
    Esatto...se il codice che dichiara ed istanzia la tua mappa è proprio quello (e quindi questa non è tipizzata usando i generics) ci puoi inserire chiavi e valori anche di tipo eterogeneo e non è plausibile un a class cast exception. Mi sorge il dubbio che il class cast te lo dia in qualche altro punto a causa di un cast esplicito. Non ti nascondo la difficoltà nel cercare di aiutarti, è come muoversi in un magazzino buio pesto con una pila che illumina solo una zona per volta, capire il quadro d'insieme è un problema ed è possibile che non si riesca ad aiutarti. Ma il debugger lo usi? Stai tracciando il codice passo passo per capire dove sta esattamente il problema?
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  8. #8
    Originariamente inviato da unomichisiada
    Mi sorge il dubbio che il class cast te lo dia in qualche altro punto a causa di un cast esplicito.
    E' molto plausibile. Deve controllare le get e le remove sottoposte a cast.

  9. #9
    Utente di HTML.it L'avatar di cerza
    Registrato dal
    Oct 2009
    Messaggi
    310
    Ciao ragazzi, grazie cmq ma ho già risolto, ma siete stati gentilissimi. @ Vindav, hai ragione L'eccezzione la dava riferita alla mappa ma da un'altra parte.
    @ unomichisiada. si il debug è la prima cosa, lo uso, senza sarebbe impossibile

    ciao ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.