Design decisions

The library is divided into several packages:

  • core sends request and sets response
  • profile represents PayPal user.
  • request represents a single PayPal request.
  • fields represnts fields which are/can be used in a request.
  • util helper class (validation, formatting).

To add new request, implement Request interface. To create a new field, implement RequestFields interface. The same is with the rest - code to interface.

To use the library, we need to create user/profile first. We can use BaseProfile class, or if you need more complexity, you can implement Profile interface and create new class.
BaseProfile class uses Joshua's Bloch Builder pattern from his book Effective Java. This way it is thread safe and immutable.

Profile user = new BaseProfile.Builder("name", "password").signature("AfcWX...").build();
		

Then, instanciate PayPal class with the new profile/user

PayPal pp = new PayPal(user, Environment.SANDBOX);
		

Now, it is ready for sending requests and setting responses.

/* create new request */
GetBalance balance = new Balance();

/* send request and set response */
pp.setResponse(balance);
		

PayPal class does NOT have send method, but it HAS setResponse method, which sets response on supplied Request object. This way, the request and response are together in the appropriate object, in this case inside balance object.
Every Request instance has:
getNVPRequest method, which returns Map of Strings - name value pair request to be sent to PayPal;
setNVPResponse method, which is used by PayPal instance to set response from PayPal; and
getNVPResponse method, which returns empty Map if request has not been sent or no reponse has been returned. This way every request knows its request parameters and response paramenters.

/* response */
Map<String, String> response = balance.getNVPResponse();