Warehouse for various notes, scripts, code samples, tips/tricks, etc. relating to different technologies like WebSphere Application Server (WAS), WebSphere Portal, Java, Java EE, DB2, etc.
Friday, October 21, 2011
New Supported Clients for Mobile Portal Accelerator (MPA)
xdime
pdaview
Apple
Apple iPhone
.*Android.*
xdime
pdaview
.*BlackBerry.*
xdime
pdaview
RIM
RIM
.*iemobile.*
xdime
pdaview
Microsoft
Internet Explorer
User Agent String for iPad 2
How to midy Supported Client List using XML Access
1. Take export of the entire portal using the following command and input file:
Command
xmlaccess -in Export.xml -user userid -password password -url portal.example.com:10039/wps/config -out Result_File.xml
Export File
<request
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="PortalConfig_1.4.xsd"
type="export"
export-users="false">
<portal action="export"/>
</request>
2. Create Update_SupportedClients.xml file as follows:
Import File
<request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="PortalConfig_1.4.xsd" type="update">
<portal action="locate">
<client action="update" domain="rel" markup="html" name="Default HTML Client" objectid="M_0000000000000000000000C010" ordinal="75">
<useragent-pattern>.*</useragent-pattern>
</client>
<client action="update" domain="rel" markup="xdime" name="Default XDIME Client" objectid="M_VBL70VO20G0000I1D5CPPM3043" ordinal="50" uniquename="mwp.default.xdime.client">
<useragent-pattern>.*</useragent-pattern>
</client>
</portal>
</request>
Change the values of the "objectid" from the file (Result_File.xml) exported in the step 1 above. Change the "ordinal" and any other value as per your requirements.
3. Import the changes into Portal using following command:
Command
xmlaccess -in Update_SupportedClients.xml -user userid -password password -url portal.example.com:10039/wps/config -out Result_File.xml If everything went well then you will see success message at the end.
Wednesday, October 19, 2011
Redirecting all users using Mobile devices to a specific URL
Enable user redirection in IBM HTTP Server 7.0
Wednesday, August 10, 2011
WCM Contect Access Error using API - WCM_Workspace W IWKCW1005X: The Member: UserX Could not be found in the User Repository. Reason: UserX
[8/10/11 13:48:23:753 CDT] 0000006e SystemOut O exception is- com.ibm.workplace.wcm.api.exceptions.AuthorizationException: IWKPY1015X: Unauthorized access by {PrincipalInformation: {dn: anonymous_user, memberId: anonymous_user_id, displayName: , name: , locale (thread): en_US, isValidUser: true, isUser: Type: User, isUserLazyLoaded: false}, 1, {false, {userAccess={}}, {editorAccess={}}, {managerAccess={}}, [anonymous_user%anonymous_user_id, all_users%all_users_group_id, anonymous_user%anonymous_user_id]}} - IWKPY1016X: Unauthorized access on Company Overview by [anonymous portal user]
Encountered above exception when I was trying to access WCM content using API calls from my portlet. After researching for long and spending multiple nights figuring the reason behind this exception I found that I need to give proper access rights to all the users under "Contributor" tab of the Portal Content > Web Content Libraries > Library Name.
Click on the button with "key" to open the resource permissions for the library. Then click on the button with "key" against "Contributor". Add "All authenticated Portal Users" and "Anonymous Portal Users" to the permissions.
This will resolve the above problem.
More information is available on the below link:
PM42031: REFERENCE PROBLEM IN INLINE EDITING WITH THE JSR-286 WEB CONTENT VIEWER
Wednesday, July 6, 2011
Datasource Isolation Levels in WebSphere Application Server (WAS)
a) 8 -> TRANSACTION_SERIALIZABLE -> Repeatable Read (RR)
b) 4(default) -? TRANSACTION_REPEATABLE_READ -> Read Stability (RS)
c) 2 -> TRANSACTION_READ_COMMITTED -> Cursor Stability (CS)
d) 1 -> TRANSACTION_READ_UNCOMMITTED -> Uncommitted Read (UR)
Wednesday, June 8, 2011
Profile Management on 64 bit WebSphere Application Server (WAS) 7.0.x
Below command creates Deployment Manager Profile on the same server on which WebSphere Portal is installed.
manageprofiles -create -profileName DmgrDev01 -profilePath E:/IBM/WebSphere/DmgrDev01 -templatePath E:/IBM/WebSphere/AppServer/profileTemplates/management -serverType DEPLOYMENT_MANAGER -nodeName nodeo1 -cellName cello1 -hostName portal.pankaj.com -validatePorts -defaultPorts
This command has to be executed from
Custom Authentication Filter
package com.pankaj.filters;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ibm.portal.auth.ExplicitLoginFilter;
import com.ibm.portal.auth.ExplicitLoginFilterChain;
import com.ibm.portal.auth.FilterChainContext;
import com.ibm.portal.auth.exceptions.AuthenticationException;
import com.ibm.portal.auth.exceptions.AuthenticationFailedException;
import com.ibm.portal.auth.exceptions.PasswordInvalidException;
import com.ibm.portal.auth.exceptions.SystemLoginException;
import com.ibm.portal.auth.exceptions.UserIDInvalidException;
/**
* @author Pankaj Gupta
* build path dependency
* 1. C:/IBM/WebSphere/PortalServer/base/wp.auth.base/shared/app/wp.auth.base.jar
* 2. C:/IBM/WebSphere/PortalServer/base/wp.auth.cmd/shared/app/wp.auth.cmd.jar
*
*/
public class CustomExplicitLoginFilter implements ExplicitLoginFilter {
Context context = null;
PumaHome pumaHome = null;
public CustomExplicitLoginFilter() {
super();
}
public void init(SecurityFilterConfig filterConfig) throws SecurityFilterInitException {
System.out.println("Entering com.pankaj.filters.CustomExplicitLoginFilter.init(...)");
try{
context = new InitialContext();
pumaHome = (PumaHome) context.lookup(com.ibm.portal.um.PumaHome.JNDI_NAME);
} catch (Exception exp){
exp.printStackTrace();
}
System.out.println("Exiting com.pankaj.filters.CustomExplicitLoginFilter.init(...)");
}
public void login(HttpServletRequest req, HttpServletResponse resp, String userID, char password[],
FilterChainContext portalLoginContext, Subject subject, String realm, ExplicitLoginFilterChain chain)
throws LoginException, WSSecurityException, PasswordInvalidException, UserIDInvalidException,
AuthenticationFailedException, AuthenticationException, SystemLoginException,
com.ibm.portal.auth.exceptions.LoginException {
long startTime = System.currentTimeMillis();
long subTaskTime = startTime;
System.out.println("Entering CustomExplicitLoginFilter.login() ... Time Taken : " + (System.currentTimeMillis() - startTime) + " milli seconds");
chain.login(req, resp, userID, password, portalLoginContext, subject, realm);
System.out.println("User Authenticated ... Time Taken : " + (System.currentTimeMillis() - subTaskTime) + " milli seconds");
subTaskTime = System.currentTimeMillis();
List groupList = this.getUserGroups(req);
System.out.println("User groups retrieved ... Time Taken : " + (System.currentTimeMillis() - subTaskTime) + " milli seconds");
subTaskTime = System.currentTimeMillis();
if(this.isUserGroupAvailable(req, groupList, "wpsadmins") || this.isUserGroupAvailable(req, groupList, "wpadmins")){
System.out.println("Group Checked ... Time Taken : " + (System.currentTimeMillis() - subTaskTime) + " milli seconds");
subTaskTime = System.currentTimeMillis();
portalLoginContext.setRedirectURL("/wps/myportal/Administration");
System.out.println("URL created ... Time Taken : " + (System.currentTimeMillis() - subTaskTime) + " milli seconds");
subTaskTime = System.currentTimeMillis();
}
System.out.println("Exiting CustomExplicitLoginFilter.login(...) ... Time Took : "
+ (System.currentTimeMillis() - startTime) + " milli seconds");
}
public void destroy() {
// This is an empty implementation. No code required!!!
}
private List getUserGroups(HttpServletRequest request) {
List groupList = null;
try {
PumaProfile pumaProfile = pumaHome.getProfile(request);
com.ibm.portal.um.User user = pumaProfile.getCurrentUser();
PumaLocator pl = pumaHome.getLocator(request);
groupList = pl.findGroupsByPrincipal(user, false);
} catch(Exception exp){
exp.printStackTrace();
}
return groupList;
}
private boolean isUserGroupAvailable(HttpServletRequest request, List groupList, String userGroup) {
boolean groupFlag = false;
try {
List attribs = new ArrayList();
attribs.add("cn");
PumaProfile pumaProfile = pumaHome.getProfile(request);
for(Iterator group_itr = groupList.iterator();group_itr.hasNext();){
Group group = (Group) group_itr.next();
Map group_attribs = pumaProfile.getAttributes(group, attribs );
String group_cn = (String) group_attribs.get((Object)"cn");
System.out.println("group cn: " + group_cn);
if(group_cn.equals(userGroup)){
groupFlag = true;
break;
}
}
}
catch (Exception exp) {
exp.printStackTrace();
}
return groupFlag;
}
}
Step-by-step guide to Portal clustering
Below are the major steps required to perform for Installing and clustering WebSphere Application Server and WebSphere Portal:
1. Install WebSphere Application Server Network Deployment 7.0.0.0 on the machine.
a. Select "None" during the step of creating a profile. WebSphere Portal will create its own WebSphere Application Server Profile later.
2. Update WebSphere Application Server to 7.0.0.5 level by installing respective fix pack. You can go to a higher version as well if available. Apply all available fixes as well. This is the minimum required. Apply both WAS and SDK fix packs.
3. Install Portal. Select "Full" install to install everything or "Administrative install" to install blank portal with only Administration Portlets. Apply any fix packs and fixes available to make sure that portal version is current and update with all the fixes.
4. Install Deployment Manager or create a new profile using "Profile Management Tool". Select "Management" and "Deployment Manager" in the profile sections. Install all fix packs and fixes as have been applied to WebSphere Application Server in the previous section to make sure that Deployment Manager and Application Server are on the same level if you are installing a fresh copy of Application Server for deployment manager.
5. Configure Deployment Manager, create a group called "wpsadmins", create exactly the same user as you have provided during the Portal installation and add this user to "wpsadmins" group.
6. Configure Portal for federation.
Following link provides a step-by-step guide to Portal clustering.
https://www-304.ibm.com/support/docview.wss?uid=swg21413946
Thursday, May 26, 2011
Fixpack and Fix download location for IBM Products
IBM Products Fixcentral
Version Details of WebSphere Portal, WebSphere Application Server (WAS) and Java SDK
On Windows : run %WPS_HOME%\bin\WPVersionInfo.bat (e.g) c:\IBM\WebSphere\PortalServer\bin\WPVersionInfo.bat
On Unix : run $WPS_HOME/bin/versionInfo.sh (e.g) /opt/IBM/WebSphere/PortalServer/bin/WPVersionInfo.sh
To find the version of WebSphere Application Server use the following command:
On Windows : run %WAS_HOME%\bin\versionInfo.bat (e.g) c:\IBM\WebSphere\AppServer\versionInfo.bat
On Unix : run $WAS_HOME/bin/versionInfo.sh (e.g) /opt/IBM/WebSphere/AppServer/bin/versionInfo.sh
To find the version of Java SDK installed with WebSphere Application Server use the following command:
On Windows : run %WAS_HOME%\java\bin\java -fullversion (e.g) c:\IBM\WebSphere\AppServer\java\bin\java -fullversion
On Unix : run $WAS_HOME/java/bin/java -fullversion (e.g) /opt/IBM/WebSphere/AppServer/java/bin/java -fullversion
Removing Windows Service for WebSphere Application Server (WAS)
WASService.exe -remove service_name
Here service name is the name which you see when you look at the properties of a service. The name is the last part of the service name. Complete name will be something like "IBMWAS70Service - HostNameNode01". Here the service name is "HostNameNode01". You should issue the command as:
WASService.exe -remove HostNameNode01
Note: You need to be logged in as Administrator and with a user having administrator rights. Also right click on the command console window and from the context menu choose "Run as Administrator".
Monday, January 31, 2011
Custom TAI Interceptor for WAS 6.1.x and upwards
import java.util.Properties;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ibm.websphere.security.WebTrustAssociationException;
import com.ibm.websphere.security.WebTrustAssociationFailedException;
import com.ibm.wsspi.security.tai.TAIResult;
import com.ibm.wsspi.security.tai.TrustAssociationInterceptor;
public class PortalCustomTAI implements TrustAssociationInterceptor {
public void cleanup() {
//TODO ... Perform any cleanup here.
}
public String getType() {
return "Custom TAI ... " + this.getClass().getName();
}
public String getVersion() {
return "1.0";
}
public int initialize(Properties prop) throws WebTrustAssociationFailedException {
System.out.println("Portal Custom TAI Initialized ... ");
//TODO Perform any initialization operations here.
return 0;
}
public boolean isTargetInterceptor(HttpServletRequest req) throws WebTrustAssociationException {
System.out.println("Portal Custom TAI isTargetInterceptor ... sessionId : " + req.getRequestedSessionId());
boolean isTAIHandlingRequired = false;
// isTAIHandlingRequired = .... ; //Perform the appropriate operation here to check if this is the right TAI to invoke.
System.out.println("Portal Custom TAI isTargetInterceptor ... : " + isTAIHandlingRequired);
return isTAIHandlingRequired;
}
public TAIResult negotiateValidateandEstablishTrust(HttpServletRequest req, HttpServletResponse res) throws WebTrustAssociationFailedException {
TAIResult taiResult = null;
System.out.println("1. Portal Custom TAI negotiateValidateandEstablishTrust ... sessionId : " + req.getRequestedSessionId());
String userId = "testUser"; //Perform the appropriate operation here to obtain the user id which needs to be authenticated without password.
if(userId != null && !userId.trim().equals("")){
taiResult = TAIResult.create(HttpServletResponse.SC_OK, userId);
}
System.out.println("2. Portal Custom TAI negotiateValidateandEstablishTrust userId: " + userId);
return taiResult;
}
}
Reuse the old session ID in WAS 6.1.x
Application servers > WebSphere_Portal > Process Definition > Java Virtual Machine > Custom Properties
Add a "New" custom property
Name: HttpSessionIdReuse
Value: true
Description: It instructs JVM to reuse the session ID when user session changes from unauthenticated to authenticated.
Enable anonymous session in WAS 6.1.x
Resource environment providers > WP NavigatorService > Custom properties
Add a "New" custom property:
Name: public.session
Value: true
Description: This property is used to enable anonymous user session.
Saturday, October 30, 2010
How to add a new base entry to VMM DB?
insert into dbentity (entity_id, entity_type, unique_id, unique_name, unique_name_key) values (-3000, 'OrgContainer', 'a9e5a980-3cec-11da-a833-828d43500d21', 'o=testOrg2', 'o=testOrg2');
wimconfig.xml file changes:
<config:repositories xsi:type="config:DatabaseRepositoryType" adapterClassName="com.ibm.ws.wim.adapter.db.DBAdapter"
id="DB2MemberRepos" isExtIdUnique="true" supportExternalName="false" supportPaging="false"
.......
.......
entityRetrievalLimit="50" JDBCDriverClass="com.ibm.db2.jcc.DB2Driver" saltLength="12">
<config:baseEntries name="o=testOrg1" nameInRepository="o=testOrg1"/>
<config:baseEntries name="o=testOrg2" nameInRepository="o=testOrg2"/>
</config:repositories>
<config:realms delimiter="/" name="defaultWIMFileBasedRealm" securityUse="active"
allowOperationIfReposDown="false">
<config:participatingBaseEntries name="o=defaultWIMFileBasedRealm"/>
<config:participatingBaseEntries name="o=testOrg"/>
<config:participatingBaseEntries name="o=testOrg1"/>
<config:participatingBaseEntries name="o=testOrg2"/>
<config:defaultParents entityTypeName="OrgContainer" parentUniqueName="o=testOrg"/>
<config:defaultParents entityTypeName="PersonAccount" parentUniqueName="o=testOrg"/>
<config:defaultParents entityTypeName="Group" parentUniqueName="o=testOrg"/>
<config:uniqueUserIdMapping propertyForInput="uniqueName" propertyForOutput="uniqueName"/>
<config:userSecurityNameMapping propertyForInput="principalName" propertyForOutput="principalName"/>
<config:userDisplayNameMapping propertyForInput="principalName" propertyForOutput="principalName"/>
<config:uniqueGroupIdMapping propertyForInput="uniqueName" propertyForOutput="uniqueName"/>
<config:groupSecurityNameMapping propertyForInput="cn" propertyForOutput="cn"/>
<config:groupDisplayNameMapping propertyForInput="cn" propertyForOutput="cn"/>
</config:realms>
<config:realms delimiter="/" name="dbdir.testOrg" securityUse="active" allowOperationIfReposDown="true">
<config:participatingBaseEntries name="o=defaultWIMFileBasedRealm"/>
<config:participatingBaseEntries name="o=testOrg"/>
<config:participatingBaseEntries name="o=testOrg1"/>
<config:participatingBaseEntries name="o=testOrg2"/>
<config:defaultParents entityTypeName="OrgContainer" parentUniqueName="o=testOrg2"/>
<config:defaultParents entityTypeName="PersonAccount" parentUniqueName="o=testOrg2"/>
<config:defaultParents entityTypeName="Group" parentUniqueName="o=testOrg2"/>
<config:uniqueUserIdMapping propertyForInput="uniqueName" propertyForOutput="uniqueName"/>
<config:userSecurityNameMapping propertyForInput="principalName" propertyForOutput="externalName"/>
<config:userDisplayNameMapping propertyForInput="principalName" propertyForOutput="principalName"/>
<config:uniqueGroupIdMapping propertyForInput="uniqueName" propertyForOutput="uniqueName"/>
<config:groupSecurityNameMapping propertyForInput="cn" propertyForOutput="externalName"/>
<config:groupDisplayNameMapping propertyForInput="cn" propertyForOutput="cn"/>
</config:realms>
Friday, October 29, 2010
SECJ0369E: Authentication failed when using LTPA. The exception is
<config:supportedEntityTypes defaultParent="o=testOrg" name="PersonAccount">
<config:rdnProperties>uid</config:rdnProperties>
Check if defaultParent and config:rdnProperties have correct values.
Try cleaning up temporary folders :
wp_profile\temp
wp_profile\wstemp
wp_profile\tranlog
This might resolve the issue if all the configuration seems correct.
Friday, February 5, 2010
Scoped Classloading in WebSphere
There is only one class loader for application and all web module files are also loaded using the same application class loader. This makes web module level classes also visible to the application class loader. As per the hierarchy, parent class loader cannot see classes loaded by the child class loader. In this case all files are loaded by one class loader therefore all classes are visible to each other across the application. Moreover, we have asked it to load child classes first, therefore, it will loaded web module (.war) classes first and then will load the classes defined at application level. This way web module can load its own classes first and hide the classes provided by application.
Saturday, January 16, 2010
Transferring Portal Databases from default Derby Database to DB2 Databases
Portal is installed by default with Derby database to store portal information. Portal uses following 6 databases to store different kind of information:
1. Release
2. Community
3. Customization
4. JCR
5. Feedback
6. Likeminds
Portal provides following 3 options while creating and transferring the databases:
1. Create one database and transfer all the databases to this single database
2. Create separate databases on the same server and transfer the portal data to them
3. Create separate databases on different server (distributed environment) and transfer the portal data to them.
This post will demonstrate how to transfer the portal databases to separate databases on the same server, but you can use the same steps to transfer the database to one database or databases created on separate servers.
After configuring your database server(s) by installing DB2 (or Oracle/MS SQL Server) and creating databases using the DB2 creation script you need to run the following to transfer the databases:
<wp_profile_root>\PortalServer\wizard\configwizard.bat
Running the above batch command will open the following screen:
Click on “Next” to go to next screen.
Select “Transfer data to other databases” and click next to go to next step.
Provide WebSphere Application Server username and password to start WebSphere_Portal server. Click “Next” to go to next screen.
Wizard will check if server is started or not. If server is not started then it will start the server before moving to next screen.
Select “IBM Derby” from the options to select the source database. Click “Next” to go to next screen.
Select “IBM DB2 Universal Database” to select the target database. Click “Next” to go to next screen
Specify database server name or provide IP address in “DbHostName” and “DbPort”. Also specify complete path for “DbLibrary” files. You need to specify the location for the jar files “db2jcc.jar” and “db2jcc_license_cu.jar”. Click “Next” to go to next screen.
Specify “DbName”, “DbUser” (having admin access) and “DbPassword” for “community” database. You can specify other custom information as well according to your need. Click “Next” to go to next screen.
Wizard will validate the information provided by you before moving to next screen. You just have to wait for it to finish verification to go to next screen.
Specify “DbName”, “DbUser” (having admin access) and “DbPassword” for “customization” database. You can specify other custom information as well according to your need. Click “Next” to go to next screen.
Specify “DbName”, “DbUser” (having admin access) and “DbPassword” for “FEEDBACK” database. You can specify other custom information as well according to your need. Click “Next” to go to next screen.
Specify “DbName”, “DbUser” (having admin access) and “DbPassword” for “jcr” database. You can specify other custom information as well according to your need. Click “Next” to go to next screen.
Specify “DbName”, “DbUser” (having admin access) and “DbPassword” for “likeminds” database. You can specify other custom information as well according to your need. Click “Next” to go to next screen.
Specify “DbName”, “DbUser” (having admin access) and “DbPassword” for “release” database. You can specify other custom information as well according to your need. Click “Next” to go to next screen.
Check all the information in that you specified in this screen. If everything is correct then click “Next” to start the transfer of the databases. You will get successful message if everything goes well without any error.
You can now start and stop the servers to propagate the changes. If servers start without any errors and you are able to login successfully using GUI then you have successfully transferred the databases.