Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java.util.prefs.Preferences.put() works, but Preferences.nodeExists() always returns false

I have some simple code I am using to learn OAuth authentication using the signpost library. I am trying to save the request token, the token secret and the pin as Java preferences, using java.util.prefs.Preferences. Putting the data into the preferences works fine (I check that the file is created and the information stored). However, immediatelly after I put() the data into the Preferences file, I try to check if the node exists, and I always get false.

I also tried just re-running the code, and checking for the node's existence before I try to save the data again, and I still get false.

What am I doing incorrectly?

Here is the code:

package com.example;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.prefs.Preferences;

import oauth.signpost.OAuth;
import oauth.signpost.OAuthConsumer;
import oauth.signpost.OAuthProvider;
import oauth.signpost.basic.DefaultOAuthConsumer;
import oauth.signpost.basic.DefaultOAuthProvider;

public class ReadMain {

    public static void main(String[] args) throws Exception {

        OAuthConsumer consumer = 
        new DefaultOAuthConsumer(
                "??",
                        "??");

        OAuthProvider provider = 
        new DefaultOAuthProvider(
            "https://www.readability.com/api/rest/v1/oauth/request_token/",
                    "https://www.readability.com/api/rest/v1/oauth/access_token/", 
                    "https://www.readability.com/api/rest/v1/oauth/authorize/");

        System.out.println("Fetching request token from Readability...");

        Preferences prefs = Preferences.userNodeForPackage(ReadMain.class);

        final String PREF_TokenSecret    = "com/example/TS";
        final String PREF_RequestToken   = "com/example/RT";
        final String PREF_ReadabilityPin = "com/example/RP";

        boolean exists = 
            prefs.nodeExists( PREF_TokenSecret ) &&
        prefs.nodeExists( PREF_RequestToken ) &&
        prefs.nodeExists( PREF_ReadabilityPin );

        if ( prefs.nodeExists( PREF_TokenSecret ) )
        {
        System.out.println("Token secret exists!");
        }

        if ( prefs.nodeExists( PREF_RequestToken ) )
        {
        System.out.println("Request token exists!");
        }

        if ( prefs.nodeExists( PREF_ReadabilityPin ) )
        {
        System.out.println("Readability pin exists!");
        }

        String pin;

        if ( exists )
        {
        consumer.setTokenWithSecret( 
                prefs.get(PREF_RequestToken,""), 
                prefs.get(PREF_TokenSecret,"") );
            pin = prefs.get(PREF_ReadabilityPin,"");
        }
        else
        {
        // we do not support callbacks, thus pass OOB
        String authUrl = provider.retrieveRequestToken(consumer, OAuth.OUT_OF_BAND);

        System.out.println( "Request token: " + consumer.getToken() );
        System.out.println( "Token secret: " + consumer.getTokenSecret() );

        prefs.put( PREF_RequestToken, consumer.getToken() );
        prefs.put( PREF_TokenSecret,  consumer.getTokenSecret() );

        System.out.println( "Now visit:\n" + authUrl + "\n... and grant this app authorization" );
        System.out.println( "Enter the PIN code and hit ENTER when you're done:" );

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        pin = br.readLine();

        prefs.put(PREF_ReadabilityPin, pin);

        if ( prefs.nodeExists( PREF_TokenSecret ) )
        {
            System.out.println("Token secret exists!");
        }

        if ( prefs.nodeExists( PREF_RequestToken ) )
        {
            System.out.println("Request token exists!");
        }

        if ( prefs.nodeExists( PREF_ReadabilityPin ) )
        {
            System.out.println("Readability pin exists!");
        }
        }

        System.out.println("Fetching access token from Readability...");
        provider.retrieveAccessToken(consumer, pin);

        System.out.println("Access token: " + consumer.getToken());
        System.out.println("Token secret: " + consumer.getTokenSecret());

        URL url = new URL("https://www.readability.com/api/rest/v1/bookmarks?user=marcusps&archive=1");
        HttpURLConnection request = (HttpURLConnection) url.openConnection();

        consumer.sign(request);

        System.out.println("Sending request to Readability...");
        request.connect();

        System.out.println("Response: " + request.getResponseCode() + " "
            + request.getResponseMessage());
    }
}
like image 939
Marcus P S Avatar asked Dec 09 '22 08:12

Marcus P S


1 Answers

The opposite operation of put(..) is get(..). So:

boolean exists = prefs.get(key, null) != null;

the get(..) method returns the 2nd argument if there is nothing found under the specified key.

the nodeExists() is related to the hierarchical structure of preferences, and can be used when you've used prefs.node(..) to create a node. But you seem to need a flat structure, so you don't need hierarchies, I think.

like image 73
Bozho Avatar answered Dec 11 '22 22:12

Bozho