361 Lotus blogs updated hourly. Who will post next? Home | Downloads | Events | Pods | Blogs | Search | myPL | About 
 
Latest 7 Posts
Anemic IT Growth or Budgeting Shift?
Mon, Nov 17th 2014 63
Digital Transformation is All Around Us…Again.
Tue, Nov 11th 2014 110
Drug or Drug Device Portals
Thu, Oct 23rd 2014 124
IBM, Microsoft to Let Each Other Use More Software in The Cloud
Wed, Oct 22nd 2014 168
Dreamforce: Community Cloud for Healthcare
Tue, Oct 14th 2014 86
Salesforce Community Cloud Roadmap for 2015
Tue, Oct 14th 2014 114
Successful Partner Communities with Salesforce
Tue, Oct 14th 2014 108
Top 10
IBM Digital Experience v8.5 – What’s Been Removed or Deprecated
Mon, May 12th 2014 363
IBM, Microsoft to Let Each Other Use More Software in The Cloud
Wed, Oct 22nd 2014 168
Drug or Drug Device Portals
Thu, Oct 23rd 2014 124
Salesforce Community Cloud Roadmap for 2015
Tue, Oct 14th 2014 114
Digital Transformation is All Around Us…Again.
Tue, Nov 11th 2014 110
Successful Partner Communities with Salesforce
Tue, Oct 14th 2014 108
Adobe Summit: The Convergence of Search and Social
Thu, Mar 27th 2014 106
Gartner Magic Quadrant for Horizontal Portals 2014: Seeing Shifts
Mon, Oct 6th 2014 99
Creating Customer Happiness with Salesforce Communities
Mon, Oct 13th 2014 95
Adobe Summit: Top new features in Adobe Experience Manager WCM
Wed, Mar 26th 2014 90


Using WPS style Resource Environment Providers with Spring
Michael Porter    

Lee Burch, one of our extremely talented architects, gave me a writeup on “Using WPS style Resource Environment Providers with Spring”  He wanted to know where to post something like this and of course, my first thought is this blog.  His justification for posting this is that while it’s a common use case in the WebSphere Portal world, many developers get it wrong.  So thanks to Lee for the post.

Generally a problem most projects face is how to handle configuration information that varies between environments.  Many times you can handle this by using one of WAS built in resources such as a SMTP server or a JDBC connection pool.  However many times the configuration data won’t fit one of these existing WAS resource types, such as an e-mail address, a server name or a URL.  To solve this a lot of approaches are available some use build tools such as Maven to build different EAR files, others use properties files located outside of the EAR.  Unfortunately both of these solutions have their issues and can be difficult to manage.

To solve this problem WAS provides and WPS leverages the resource environment providers. These allow you to specify your settings as a part of the WAS console at the Cell, Node or Server level.  This provides an easy way to maintain values across many servers while also doing away with the need to have special EARs built for each environment.

The following IBM article discusses this

http://www.ibm.com/developerworks/websphere/library/techarticles/0611_totapally/0611_totapally.html

Unfortunately it requires deployment to the App Server lib/ext directory, something that is not always so easily done particularly in a shared enterprise environment.

However WPS uses Resource Environment Providers but does so differently than the above article specifies, it uses the “Custom Properties” of the resource environment provider and requires no deployment to the App Server, an ideal solution.

While it is possible to bind your code directly to the fetches to the Resource Environment Provider I find a more flexible and much more modern way of addressing the problem is to use Spring and its facility for PropertyPlaceholderConfigurer.

This allows for a Spring config something like this

<bean id=”MyBean” class=”com.perficient.sample.MyBean”>
<property name=”${administratorsEmailAddress}” />
</bean>

And the property administratorsEmailAddress will be replaced with the value from the Resource Environment Provider before the context is initialized.

The whole thing would look something like this

<?xml version=”1.0″ encoding=”UTF-8″?>

<beans xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

xmlns=”http://www.springframework.org/schema/beans”

xmlns:util=”http://www.springframework.org/schema/util”

xsi:schemaLocation=”http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd”>

<bean>

<property name=”resourceProviderName” value=”NameOfMyResourceEnvironmentProvider” />

</bean>
<bean id=”MyBean” class=”com.perficient.sample.MyBean”>
<property name=”${administratorsEmailAddress}” />
</bean>

</beans>

 

This will lookup the custom property “administratorsEmailAddress” under the Resource Environment Provider named “NameOfMyResourceEnvironmentProvider” and do the substitution before initializing the context.  Of course it also follows the standard WAS rules allowing for the Node to trump the Cell setting and the Server to trump the Node and Cell settings allowing a lot of flexibility in how the property gets propagated to your configuration.

The code for the WebSphereResourceEnvironmentProviderPlaceHolderConfigurer follows

package com.perficient.spring;

 

import java.util.List;

import java.util.Properties;

 

import javax.management.AttributeList;

import javax.management.AttributeNotFoundException;

import javax.management.ObjectName;

 

import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

 

import com.ibm.websphere.management.AdminService;

import com.ibm.websphere.management.AdminServiceFactory;

import com.ibm.websphere.management.Session;

import com.ibm.websphere.management.configservice.ConfigService;

import com.ibm.websphere.management.configservice.ConfigServiceFactory;

import com.ibm.websphere.management.configservice.ConfigServiceHelper;

import com.ibm.websphere.management.exception.ConfigServiceException;

import com.ibm.websphere.management.exception.ConnectorException;

 

 

/**

* The Class WebSphereResourceEnvironmentProviderPlaceHolderConfigurer implements a placeholder that uses WebSphere Application Server

* Resource Environment Provider custom properties as a source.  These will work in the normal way with anythign declared at the server layer

* overriding anything at the node layer which in turns overrides anything at the cell layer.</p>

* For development you may find it useful to either get rid of this definition or use a standard properties file for the placeholders.  As this is

* inherited off the standard placeholder you can still use the normal properties file definition as a fallback.</p>

* To use it simply create a resource environment provider in WAS at whatever level pleases you, and then add the data you want as custom properties]

* to that.  Then in spring specify the name of the resource environment provider as the “resourceProviderName” in the spring configuration

* for this WebSphereResourceEnvironmentProviderPlaceHolderConfigurer.

*

*/

public class WebSphereResourceEnvironmentProviderPlaceHolderConfigurer extends PropertyPlaceholderConfigurer {

 

/** The resource provider name. */

String resourceProviderName;

/** The server properties. */

Properties serverProperties = null;

/** The node properties. */

Properties nodeProperties = null;

/** The cell properties. */

Properties cellProperties = null;

/**

* Gets the resource provider name.

*

* @return the resource provider name

*/

public String getResourceProviderName() {

return resourceProviderName;

}

 

/**

* Sets the resource provider name.

*

* @param resourceProviderName the new resource provider name

*/

public void setResourceProviderName(String resourceProviderName) {

this.resourceProviderName = resourceProviderName;

}

 

/**

* Gets the properties.

*

* @param level the level

* @param providerName the provider name

* @param service the service

* @param session the session

* @return the properties

* @throws ConfigServiceException the config service exception

* @throws ConnectorException the connector exception

* @throws AttributeNotFoundException the attribute not found exception

*/

private Properties getProperties(ObjectName level, ObjectName providerName, ConfigService service, Session session) throws ConfigServiceException, ConnectorException, AttributeNotFoundException {

Properties rv = new Properties();

ObjectName sampleProviderName = null;

ObjectName[] matches;

try {

matches = service.queryConfigObjects(session, level, providerName, null);

} catch (Exception ex) {

ex.printStackTrace();

return rv;

}

if (matches.length > 0) {

sampleProviderName = matches[0]; // use the first provider found

}

if (sampleProviderName != null) {

// search for the repository provider attributes

AttributeList value = service.getAttributes(session, sampleProviderName, new String[] { “propertySet” }, false);

ObjectName propertySet = (ObjectName) ConfigServiceHelper.getAttributeValue(value, “propertySet”);

value = service.getAttributes(session, propertySet, new String[] { “resourceProperties” }, false);

List resourceProperties = (List) ConfigServiceHelper.getAttributeValue(value, “resourceProperties”);

for (int i = 0; i < resourceProperties.size(); i++) {

// load all custom properties

ObjectName on = (ObjectName) resourceProperties.get(i);

String customName = (String) service.getAttribute(session, on, “name”);

String customValue = (String)service.getAttribute(session, on, “value”);

// put it in the property set

rv.put(customName, customValue);

}

}

return rv;

}

 

/**

* Load environment provider properties.

*

* @throws ConfigServiceException the config service exception

* @throws ConnectorException the connector exception

* @throws AttributeNotFoundException the attribute not found exception

*/

private void loadEnvironmentProviderProperties() throws ConfigServiceException, ConnectorException, AttributeNotFoundException {

ConfigService service = ConfigServiceFactory.getConfigService();

Session session = new Session();

AdminService adminService = AdminServiceFactory.getAdminService();

// for some reason the ObjectName returned by the adminService throws a null exception if you try to query with it

// so this is just as well, server names are unique in a cell so this will always return just one server.

ObjectName server = ConfigServiceHelper.createObjectName(null, “Server”, adminService.getLocalServer().getKeyProperty(“name”) );

ObjectName[] matches = service.queryConfigObjects(session, null, server, null);

server = matches[0]; // will be exact match

 

ObjectName node = ConfigServiceHelper.createObjectName(null, “Node”, adminService.getNodeName());

matches = service.queryConfigObjects(session, null, node, null);

node = matches[0]; // will be exact match

 

ObjectName cell = ConfigServiceHelper.createObjectName(null, “Cell”, adminService.getCellName());

matches = service.queryConfigObjects(session, null, cell, null);

cell = matches[0]; // will be exact match

 

// direct search

ObjectName providerName = ConfigServiceHelper.createObjectName(null,  “ResourceEnvironmentProvider”, “SeedlistTransformer”);

 

serverProperties = getProperties(server, providerName, service, session);

nodeProperties = getProperties(node, providerName, service, session);

cellProperties = getProperties(cell, providerName, service, session);

}

 

/**

* Resolve provider value.

*

* @param name the name

* @return the string

*/

private String resolveProviderValue(String name) {

if (serverProperties.containsKey(name) ) {

return serverProperties.getProperty(name);

} else if (nodeProperties.containsKey(name)) {

return nodeProperties.getProperty(name);

} else if (cellProperties.containsKey(name) ) {

return cellProperties.getProperty(name);

} else {

return null;

}

}

 

/* (non-Javadoc)

* @see org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#resolvePlaceholder(java.lang.String, java.util.Properties)

*/

@Override

protected String resolvePlaceholder(String placeholder, Properties props) {

if (serverProperties == null) {

try {

loadEnvironmentProviderProperties();

} catch (ConfigServiceException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (AttributeNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (ConnectorException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

String value = resolveProviderValue(placeholder);

if (value == null) {

return super.resolvePlaceholder(placeholder, props);

} else {

return value;

}

}

 

 

}



---------------------
http://feedproxy.google.com/~r/PortalSolutionsBlog/~3/ZgaV8LmlQpo/
Mar 28, 2012
12 hits



Recent Blog Posts
63


Anemic IT Growth or Budgeting Shift?
Mon, Nov 17th 2014 3:18p   Michael Porter
ZDNet reports on a recent Gartner report of 2015 IT budgets.  They call it, “IT Spending for 2015 Anemic amid Digital Shift.”  Here’s the breakdown on who creates vs who approves the IT budget. I don’t interpret it quite this way. Yes, IT budget growth is anemic but there’s on telling piece of information in the ZDnet article The upshot: Spending on digital innovation will be funded outside of the IT budget. So yes, spending is anemic within [read] Keywords:
110


Digital Transformation is All Around Us…Again.
Tue, Nov 11th 2014 8:19a   Mark Polly
The phrase “Digital Transformation” has re-emerged as a new phenomenon.  Google tells me there are 49 million (49,000,000) search results for the words Digital Transformation. First, why do I say it is a phenomenon?  It seems that many of our leading think-tanks are talking about digital transformation.  Here are some examples: Earlier this year, MIT Sloan Management Review posted this article: The Nine Elements of Digital Transformation Forrester is predicting that in 2015 &# [read] Keywords: collaboration ibm enterprise google mobile network
124


Drug or Drug Device Portals
Thu, Oct 23rd 2014 10:12a   Michael Porter
Eugene Sefanov has a nice post on the value of a patient portal for those who use a specialty drug or drug device.  He goes into some detail on the possible use cases with that kind of portal.  I like the approach  he takes.  Just being prescribed a drug doesn’t mean you are going to get the right outcome.  Anything you can do to ensure the patient has all the support he or she needs will improve that outcome. An effective way to provide patient support is through a portal that is sp [read] Keywords: collaboration application mobile
168


IBM, Microsoft to Let Each Other Use More Software in The Cloud
Wed, Oct 22nd 2014 8:14p   Michael Porter
Interesting news came today.  Two software behemoths and sometime fierce competitors have decided that co-opetition may be the best model.  IBM and Microsoft today announced a partnership making it easier for cloud customers to access each other’s software. The News IBM cloud users will be able to get Microsoft products like Windows Server and SQL Server, while customers of Microsoft’s Azure service can use IBM’s WebSphere Liberty and DB2, the companies said today in a statement. Cl [read] Keywords: ibm db2 enterprise google java linux microsoft office oracle server sql virtualization websphere
86


Dreamforce: Community Cloud for Healthcare
Tue, Oct 14th 2014 10:15p   Mark Polly
All this week I’m at Dreamforce, the annual Salesforce conference.  Salesforce has come a long way with their platform and they’ve recently introduced Community Cloud.  Community Cloud is an evolution of their portal product and includes many features that we see in other enterprise-class, horizontal portals. We are seeing a lot of interest in portals from our healthcare clients.  At Dreamforce, I attended a session on using Salesforce Community Cloud in healthcare.  I blogged [read] Keywords: community enterprise
114


Salesforce Community Cloud Roadmap for 2015
Tue, Oct 14th 2014 2:15p   Mark Polly
Salesforce Community Cloud can be used for a variety of applications, including sales communities, customer self-service, marketing campaign management, or anywhere you need portal, content and social combined into one experience. At Dreamforce 2014, Salesforce has been having a lot of sessions related to communities and I’ve seen a lot of communities focused on partners.  That is if you are company that has sales partners, dealers, etc. a partner community would be relevant to you.   Th [read] Keywords: application applications community facebook linkedin mobile networking profile twitter
108


Successful Partner Communities with Salesforce
Tue, Oct 14th 2014 12:18p   Mark Polly
Zero Motorcycles needed a way to consolidate multiple partner facing systems into a simplified user interface, track sales and monitor participation programs and automate workflows. As we’ve seen from other customers, partners had to login to multiple systems.  Using Community Cloud, Zero was able to provide one interface for the partners to login into and get information and process leads and improve sales. Zero’s original model was B2C, thinking that consumers would order electri [read] Keywords: collaboration community exchange exchange interface mobile
95


Creating Customer Happiness with Salesforce Communities
Mon, Oct 13th 2014 3:12p   Mark Polly
Community Cloud is Salesforce’s newest and fastest growing cloud (until tomorrow).  IDC has seen a huge jump in using social media to communicate with customers and respond to customer inquiries.  The top 3 technologies that are planned to be used include discussion forums, public social networks, and online communities, which is where Community Cloud comes in. Constant Contact Constant Contact, an all-in-one marketing platform, has over 600,000 small business customers. Constant Contact us [read] Keywords: administration collaboration community




70


Content Marketing is Inherently Flawed?
Fri, Oct 10th 2014 11:12a   Michael Porter
In the past week I’ve either read or listened to two heads of global marketing for two well known brands.  Both had a similar story with different sides of the same coin.  Both had a message that dealt with Marketers having to forget about telling their brand story and go with what customers want to hear.  The first was a session about leveraging social data with Michelle Lapierre who is the Sr. Director of Customer Experience at Marriott Rewards. The second is an article at cmo.com dis [read] Keywords: facebook linkedin oracle twitter
61


Why Do Contextual Ads Fail
Tue, Oct 7th 2014 3:12p   Michael Porter
I’ve blogged about the personalization failure before.  Now it looks like others are catching on to the ultimate failure on their part………… even as they harvest huge amounts of private information about us.  This article in ComputerWorld outlines the issues.  The author Mike Elgan hits the topic of privacy quickly and never lets it go: Companies like Google, Facebook and Amazon violate our privacy in order to show us relevant ads. So why do their ads miss the mar [read] Keywords: facebook google




Created and Maintained by Yancy Lent - About - Blog Submission - Suggestions - Change Log - Blog Widget - Advertising - Mobile Edition