Dear Wiki user, You have subscribed to a wiki page or wiki category on "Tapestry Wiki" for change notification.
The "Tapestry5HowToCreateAConfigureableService" page has been changed by DanielCaldeweyher. http://wiki.apache.org/tapestry/Tapestry5HowToCreateAConfigureableService -------------------------------------------------- New page: Although his example describes how to create a sandbox and production version of a service using symbols, this method can be used for various other scenarios. Scenario: you are developing a shopping cart and want to test your app against the sandbox PayPal NVPServer, without having to hard-code the variables into your implementation: Note: This examples assumes you can read symbols from properties files (see Tapestry5HowToReadSymbolsFromPropertiesFile). Also it uses the [[http://paypal-nvp.sourceforge.net|PayPal NVP library]] {{{ public class AppModule { public PropertiesFileSymbolProvider buildClasspathPropertiesFileSymbolProvider(Logger logger) { return new PropertiesFileSymbolProvider(logger, "paypal.properties", true); } } }}} we have a properties file that stores our credentials for the different services ({{{src/main/resources/paypal.properties}}}): {{{ #paypal.api.endpoint=live paypal.api.endpoint=sandbox [email protected] [email protected] paypal.api.sandbox.signature=SANDBOX_SIGNATURE [email protected] [email protected] paypal.api.live.signature=LIVE_SIGNATURE }}} Our PayPalNVPService Implementation looks something like this: {{{ public class PayPalNVPService { /* set user - these are your credentials from paypal */ private Profile user; private Environment environment; public PayPalNVPService(Environment environment, String apiUsername, String apiPassword, String signature) { this.environment = environment; user = new BaseProfile.Builder(apiUsername, apiPassword).signature(signature).build(); } public boolean SetExpressCheckout(String returnURL, String cancelURL, ... ) { /* create new instance of paypal nvp */ PayPal pp = new PayPal(user, environment); ... } } }}} Ideally we want to be able to do something like {...@inject @Symbol("paypal.api.${paypal.api.endpoint}.username") String userName}}}. However this doesn't work, as only @Value and @InjectService allow Symbol substitution. Thus, we will have to to create a new symbol: {{{ public class AppModule { public static void contributeApplicationDefaults(MappedConfiguration<String, String> configuration) { configuration.add("PayPalNVPService", "paypal.nvp.${paypal.api.endpoint}"); } } }}} And now we'll just need to create two different services, based on the different credentials: {{{ # Java code public class AppModule { @ServiceId("paypal.nvp.sandbox") public static PayPalNVPService buildPayPalNVPSandboxService( @Inject @Symbol(value="paypal.api.sandbox.username") String apiUsername, @Inject @Symbol(value="paypal.api.sandbox.password") String apiPassword, @Inject @Symbol(value="paypal.api.sandbox.signature") String signature) { return new PayPalNVPService(Environment.SANDBOX, apiUsername, apiPassword, signature); } @ServiceId("paypal.nvp.live") public static PayPalNVPService buildPayPalNVPLiveService( @Inject @Symbol(value="paypal.api.live.username") String apiUsername, @Inject @Symbol(value="paypal.api.live.password") String apiPassword, @Inject @Symbol(value="paypal.api.live.signature") String signature) { return new PayPalNVPService(Environment.LIVE, apiUsername, apiPassword, signature); } } }}} And lastly inject the service into our page. Notice how we have to evaluate the PayPalNVPService symbol to get the actual service id: {{{ public class ViewCart { @InjectService("${PayPalNVPService}") private PayPalNVPService paypalService; public void onActionFromCheckoutWithPayPal() { boolean success = paypalService.SetExpressCheckout("http://localhost:8080/website/checkout/revieworder", "http://localhost:8080/website/viewcart", ...); ... } } }}} --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
