Leer fichero de configuracion mediante java.util.properties

Iniciado por alzehimer_cerebral, 11 Abril 2010, 23:58 PM

0 Miembros y 1 Visitante están viendo este tema.

alzehimer_cerebral

Hola a todos,

estoy teniendo problemas para acceder a los values de un properties mediante una clase que sigue el patron Singleton...

La clase es la siguiente:

Código (java) [Seleccionar]

public class ApplicationDirectories {

    static private ApplicationDirectories singleton = new ApplicationDirectories();

    Properties prop = new Properties();

    public ApplicationDirectories() {

    }
    /**
     * Default constructor
     */
    public ApplicationDirectories(File configFile) {


        InputStream is = null;

        try {
          System.out.println(configFile.getPath());
          is=new FileInputStream(configFile.getPath());
          prop.load(is);
        } catch(IOException ioe) {}



    } //end RepositoryManagement()

    /**
     * **GETTERS**
     */

    /**
     * Returns the singleton attribute which is used to access the methods of this class from other packages
     * @return  a RepositoryManagement object
     */

    static public ApplicationDirectories getSingleton() {
         return singleton;
     }

    public Properties getProperties(){
        return prop;
    }

    /**
     * **SETTERS**
     */

    public void setProperties(Properties prope){
        this.prop=prope;
    }


}



Cuando arranca la aplicacion quiero cargar el fichero de configuracion, pero cuando intento recuperar una de las propiedades me da como null, el codigo que empleo es el siguiente:

Código (java) [Seleccionar]

File configFile = new File (System.getProperty("user.home").concat(pathSeparator + ".Jsignalworkbench" + pathSeparator + "Config" + pathSeparator + "config.txt"));
ApplicationDirectories app = new ApplicationDirectories(configFile);
System.out.println(prope.getProperty("defaultRemotePath"));


Tambien he probado las siguientes dos lineas de codigo y ambas me devuelven null:

Código (java) [Seleccionar]

System.out.println(global.ApplicationDirectories.getSingleton().getProperties().containsKey("defaultRemotePath"));
        System.out.println(global.ApplicationDirectories.getSingleton().getProperties().containsValue("defaultRemotePath"));



Si pruebo los accesos a properties sin la clase con el patron Singleton si que me devuelve los valores correctos contenidos en el fichero de configuracion, por lo tanto deduzco que el error viene de la clase ApplicationDirectories....

Alguien me puede hechar una mano en corregir el error que tiene la clase???

Espero vuestras respuestas y gracias de antemano.

alzehimer_cerebral

Servicios Informaticos Valencia - www.ag-solutions.es
Mi blog - www.alvarogarciasolano.com

Casidiablo

En esta línea:

System.out.println(prope.getProperty("defaultRemotePath"));

De donde sacas el objeto "prope"??

Un saludo

Debci

Cita de: Casidiablo en 12 Abril 2010, 03:01 AM
En esta línea:

System.out.println(prope.getProperty("defaultRemotePath"));

De donde sacas el objeto "prope"??

Un saludo


Código (java) [Seleccionar]
Properties prop = new Properties();

Esta declarado como variable de instancia, creo...

Saludos

alzehimer_cerebral

Haber al final la clase ha quedado asi:

Código (java) [Seleccionar]

public class ApplicationDirectories {

    static private ApplicationDirectories singleton = new ApplicationDirectories();

    Properties prop = new Properties();

    public ApplicationDirectories() {

    }
   
    public void crearApplicationDirectories(File configFile) {


        InputStream is = null;

        try {
          System.out.println(configFile.getPath());
          is=new FileInputStream(configFile.getPath());
          prop.load(is);
        } catch(IOException ioe) {}



    } //end RepositoryManagement()

    /**
     * **GETTERS**
     */

    /**
     * Returns the singleton attribute which is used to access the methods of this class from other packages
     * @return  a RepositoryManagement object
     */

    static public ApplicationDirectories getSingleton() {
         return singleton;
     }

    public Properties getProperties(){
        return prop;
    }

    /**
     * **SETTERS**
     */

    public void setProperties(Properties prope){
        this.prop=prope;
    }


}



Y al inicio del programa hago lo siguiente:

Código (java) [Seleccionar]

String pathSeparator = System.getProperty("file.separator");


        File configDir = new File(System.getProperty("user.home").concat(pathSeparator + ".Jsignalworkbench" + pathSeparator + "Config"));
        File configFile = new File (System.getProperty("user.home").concat(pathSeparator + ".Jsignalworkbench" + pathSeparator + "Config" + pathSeparator + "config.txt"));
        File appDir = new File (System.getProperty("user.home").concat(pathSeparator + ".Jsignalworkbench"));

        if(configFile.exists()){
            global.ApplicationDirectories.getSingleton().crearApplicationDirectories(configFile);
        }

        else{
            if(!appDir.exists()){
                //File aux = new File(global.ApplicationDirectories.getSingleton().getProperties().getProperty("appDir"));
                //global.ApplicationDirectories.getSingleton().ApplicationDirectories(configFile);

                //if (!aux.exists()){
                //File dir = new File(System.getProperty("user.home").concat(pathSeparator + ".Jsignalworkbench"));
                if(!appDir.mkdir()){
                    JOptionPane.showMessageDialog(null, "Error in the creation of a directory needed for the program to run","Error", JOptionPane.ERROR_MESSAGE);
                    System.exit(-1);

                }
            }

            if(!configDir.exists()){
                if(!configDir.mkdir()){
                    JOptionPane.showMessageDialog(null, "Error in the creation of a directory needed for the program to run 1","Error", JOptionPane.ERROR_MESSAGE);
                    System.exit(-1);

                }
           

                //Creation of the configFile file

                try {
                // A partir del objeto File creamos el fichero físicamente
                if (!configFile.createNewFile()){
                    JOptionPane.showMessageDialog(null, "Error in the creation of a file needed for the program to run","Error", JOptionPane.ERROR_MESSAGE);
                    System.exit(-1);
                }
                else
                    System.out.println("Fichero de configuracion creado correctamente");

                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
                System.out.println("fichero de config creado");
                System.out.println(configFile.getPath());
                //Write configFile data to the configFile file
                BufferedWriter bw = new BufferedWriter(new FileWriter(configFile.getPath()));

                String lineSeparator = System.getProperty("line.separator");

                bw.write("***CONFIG FILE***" + lineSeparator);

                String homeDir = System.getProperty("user.home");
                //bw.write("homeDir =" + homeDir + lineSeparator);

                //String tmpDir = System.getProperty("java.io.tmpdir");
                //bw.write("tmpDir =" + tmpDir + lineSeparator);

                String defaultRepositoriesPath = homeDir + pathSeparator + ".Jsignalworkbench" + pathSeparator + "Repositories";
                bw.write("defaultRepositoriesPath =" + defaultRepositoriesPath + lineSeparator);

                String defaultRemotePath = "http://arregla-tu-pc.no-ip.biz/pruebas_proyecto/gasuco.xml";
                bw.write("defaultRemotePath =" + defaultRemotePath + lineSeparator);

                //String appDir = homeDir + pathSeparator + ".Jsignalworkbench";
                //bw.write("appDir =" + appDir + lineSeparator);

                String localPlugins = appDir + pathSeparator +  "Local_plugins";
                bw.write("localPlugins =" + localPlugins + lineSeparator);

                bw.close();

                global.ApplicationDirectories.getSingleton().crearApplicationDirectories(configFile);
            }
        }

             System.out.println(global.ApplicationDirectories.getSingleton().getProperties().size());
             System.out.println(global.ApplicationDirectories.getSingleton().getProperties().getProperty("localPlugins"));

            File repoDir = new File(global.ApplicationDirectories.getSingleton().getProperties().getProperty("defaultRepositoriesPath"));
            if(!repoDir.exists()){
                System.out.println("No esxiste defaultRep path");
                if(!repoDir.mkdir()){
                    JOptionPane.showMessageDialog(null, "Error in the creation of a directory needed for the program to run","Error", JOptionPane.ERROR_MESSAGE);
                    System.exit(-1);

                }
            }

            File plugDir = new File(global.ApplicationDirectories.getSingleton().getProperties().getProperty("localPlugins"));
            if(!plugDir.exists()){
                if(!plugDir.mkdir()){
                    JOptionPane.showMessageDialog(null, "Error in the creation of a directory needed for the program to run","Error", JOptionPane.ERROR_MESSAGE);
                    System.exit(-1);

                }
            }

}       




El problema viene que cuando saco por pantalla
Código (java) [Seleccionar]
System.out.println(global.ApplicationDirectories.getSingleton().getProperties().getProperty("localPlugins")); me sale sin los separadores de path, es decir asi: C:Usersgasuco.JsignalworkbenchLocal_plugins....

Si miro dentro del fichero si que sale con las \.  Que esta pasando???

Salu2

alzehimer_cerebral
Servicios Informaticos Valencia - www.ag-solutions.es
Mi blog - www.alvarogarciasolano.com

Perikles

veo que estas en un entorno windows.

El caracter '\' s un carácter de escape y por lo tanto espera otro carácter después de este.

¿Puedes probar a cambiar en el fichero properties la propiedad localPlugins lo que tengas con este caracter '\' aeste otro '/' o poner '\\'?

Un saludo.

alzehimer_cerebral

Okis lo puedo cambiar pero no en toda la cadena, me explico:

Código (java) [Seleccionar]

String homeDir = System.getProperty("user.home");
String defaultRepositoriesPath = homeDir + pathSeparator + pathSeparator + ".Jsignalworkbench" + pathSeparator + pathSeparator + "Repositories";



Puedo meter dos pathSeparator, pero como meto dos \ en el SystemProperty("user.home")...

Al sacar por pantalla
Código (java) [Seleccionar]

             System.out.println(global.ApplicationDirectories.getSingleton().getProperties().getProperty("defaultRepositoriesPath"));



Se queda asi: C:Usersgasuco\.Jsignalworkbench\Repositories

Tendria que haber otra \ despues de Users...

La cuestion es que antes de hacer esta implementacion estuve jugando con los metodos de la clase Propeties y esto no me pasaba, y tampoco usaba dos pathSeparator a la hora de crear el fichero...

Alguna sugerencia???

Salu2

alzehimer_cerebral
Servicios Informaticos Valencia - www.ag-solutions.es
Mi blog - www.alvarogarciasolano.com

Perikles

Mira esto que acabo de hacer:


String base = System.getProperty("user.home");
File c = new File (base);
File d = new File (c,"pruebas/hola.txt");
System.out.println(d.getAbsolutePath());

alzehimer_cerebral

El problema es que al guardar de esa forma al igual que la mia lo guarda en el fichero perfectamente, pero a la hora de recuperar dicho path no coge las \..., por lo tanto eso no va a resolver el problema.  Recuerda que el problema es al leer no al escribir, por lo tanto creo que en el fichero la ruta deberia tener \\ como separador de directorios.  Lo que no se es como meterle el \\ en el user.home...

Quien me ayuda, necesito urgentemente resolver esto para poder seguir con el programa.  Gracias por la colaboracion.

alzehimer_cerebral
Servicios Informaticos Valencia - www.ag-solutions.es
Mi blog - www.alvarogarciasolano.com

Perikles

String s = System.getProperty("user.home");
s = s.replace("\\", "/");

Trabaja con la barra del 7 (/), es mucho mejor

alzehimer_cerebral

Código (java) [Seleccionar]

String defaultRepositoriesPath = homeDir + pathSeparator + pathSeparator + ".Jsignalworkbench" + pathSeparator + pathSeparator + "Repositories";
                defaultRepositoriesPath = defaultRepositoriesPath.replace("\","\\");


No puedo trabajar con / ya que toda la aplicacion trabaja con \....

A la hora de hacer el replace me salta:
illegla character \92
unclosed string literal

Help please  :P

alzehimer_cerebral
Servicios Informaticos Valencia - www.ag-solutions.es
Mi blog - www.alvarogarciasolano.com