úterý 13. prosince 2016

WebSphere Applcation Server - how to get J2C authentication alias in Java code



Sometimes I need securely connect to external system from WebSphere Application server application. The secure connection usualy requires password as a credential. The WebSphere Application Server allows store the username and password inside its configuration as so called J2C Authentication Alias. If I need use the cofigured J2C Auth Alias I can use the following Java code fragment:

 public static final String USERNAME = "username";
 public static final String PASSWORD = "password";

 /** Return username and pasword for specific J2C authentication alias
  *
  * @param authenticationAlias
  * @return Map with "username" and "password" keys
  * @throws NotImplementedException
  * @throws LoginException
  */
      public Map<String,String> getCredentials(String authenticationAlias) throws NotImplementedException, LoginException {
     Map<String,String> map = new HashMap<String,String>();
     map.put(Constants.MAPPING_ALIAS, authenticationAlias);
     CallbackHandler callbackHandler = WSMappingCallbackHandlerFactory.getInstance().getCallbackHandler(map, null);
     LoginContext loginContext = new LoginContext("DefaultPrincipalMapping", callbackHandler);
     loginContext.login();
     Subject subject = loginContext.getSubject();
     Set credentials = subject.getPrivateCredentials();
     PasswordCredential passwordCredential = (PasswordCredential) credentials.iterator().next();
     String user = passwordCredential.getUserName();
     String password = new String(passwordCredential.getPassword());
     Map<String,String> result = new HashMap<String,String>();
     result.put(USERNAME, user);
     result.put(PASSWORD, password);
     return result;
      }

středa 29. června 2016

Datasource a default izolační level


Transakční izolační level a WebSphere Application Server data source


Během nedávného řešení problému se zámky v databázi jsem narazil to, že pro většinu JDBC driverů je nastavený isolační  level REPEATABLE READ. Pro většinu aplikací přitom postačuje isolační level READ COMMITED, který zaručí, že nebudu číst nepotvrzená data jiných transakcí, ale není tak striktní například k opakovanému selectu - při READ COMMITED během mé transakce mohou do výsledku stejného selectu přibýt nebo naopak ubýt některé řádky - to ale v drtivé většině řešení nevadí.

Pokud chci tedy mít aplikaci, která se chová šetrně k uzamykání záznamů v databázi, pak je vhodné nepoužívat implicitně nastvený isolační level REPEATABLE READ, ale změnit jej na READ COMMITED.

To lze zajistit následujícími způsoby:

Nastavení na rozšířené konfiguraci resource reference v aplikaci

Pro tento účel je potřeba do WEB-INF přidat soubor  ibm-web-ext.xmi, který obsahuje konfiguraci s explicitním nastavení izolačního levelu:
 
<resourceRefExtensions xmi:id="ResourceRefExtension_1" isolationLevel="TRANSACTION_REPEATABLE_READ">
    <resourceRef href="WEB-INF/web.xml#ResourceRef_1102108961944"/>
  </resourceRefExtensions>
  <resourceRefExtensions xmi:id="ResourceRefExtension_2" isolationLevel="TRANSACTION_READ_COMMITTED">
    <resourceRef href="WEB-INF/web.xml#ResourceRef_1102108961964"/>
  </resourceRefExtensions>

 Nstavení na konfiguraci data source:

WebSphere Application Server umožňuje na úrovni datového zdroje nastavit isolační level , který datový zdroj bude používat. Pro tento účel je potřeba použít custom property

webSphereDefaultIsolationLevel

povolené hodnoty:



Hodnota
JDBC isolation level
8
TRANSACTION_SERIALIZABLE
4 (default)
TRANSACTION_REPEATABLE_READ
2
TRANSACTION_READ_COMMITTED
1
TRANSACTION_READ_UNCOMMITTED
0
TRANSACTION_NONE
 





středa 18. května 2016

How to get fully qualified name of Java class from .class file

I was creating a utility that uploads java classes using web browser to runtime environment. The problem was how to get fully qualified name of class when I obtain just the .class file without information about path of packages. For example imagine we have com.company.MyCustom class, the class is uploaded via web browser to application server as a MyCustom.class file without any information about packages. But the server has to know the packaging directory structure to store the .class file properly to classpath.

I studied the .class file internal structure to obtain the class name including packages from the content of the .class file. The structure is very well documented is the specification here: https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html , but it shows little bit troublesome to parse the file in pure Java. 

Finally I found the Apache Common BCEL (http://commons.apache.org/proper/commons-bcel/manual.html) project. It is much wider that I need and contains also ability to obtain the full class name from class using 3 lines of code:

FileInputStream input = new FileInputStream(new File("MyCustom.class")); ClassParser parser = new ClassParser(input,classname);
JavaClass javaClass = parser.parse();
String fullClassname = javaClass.getClassName();

Really easy isn't it?




čtvrtek 14. ledna 2016

WebSphere Maven Repository

Pokud potřebujete použít závislosti na WebSphere kinhovny, je možné se odkázat na Maven repository:

http://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/wasdev/maven/repository/



 <repositories>
    <repository>
      <id>IBM</id>
      <name>IBM Maven2 Repository</name>
      <url>http://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/wasdev/maven/repository/</url>
    </repository>
  </repositories>



com.ibm.tools.target:was-liberty:pom:8.5.x.3:provided




\- com.ibm.tools.target:was-liberty:pom:8.5.x.3:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.basics:jar:1.2.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.clusterMember:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.collectiveController:jar:1.1.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.config:jar:1.1.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.connectionpool:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.distributedMap:jar:2.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.dynamicRouting:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.ejbcontainer:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.endpoint:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.hpel:jar:2.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.j2eemanagement:jar:1.1.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.jaxrs20:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.json:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.kernel.service:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.messaging:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.monitor:jar:1.1.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.oauth:jar:1.1.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.restConnector:jar:1.1.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.scalingMember:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.scriptMetric:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.security:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.security.authorization.saf:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.security.registry.saf:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.servlet:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.sessionstats:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.transaction:jar:1.1.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.webCache:jar:1.1.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.webcontainer.security.app:jar:1.1.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.zosLocalAdapters:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.anno:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.application:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.artifact:jar:1.2.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.classloading:jar:1.2.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.collectiveMember:jar:1.1.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.containerServices:jar:1.2.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.globalhandler:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.httptransport:jar:1.1.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.javaeedd:jar:1.1.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.jsp:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.kernel.embeddable:jar:1.1.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.kernel.filemonitor:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.kernel.metatype:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.kernel.service:jar:1.3.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.logging:jar:1.1.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.restHandler:jar:1.1.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.servlet:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.ssl:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.threading:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.timedOperations:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.webCache:jar:1.0.9:provided
   +- com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.spi.zosConnect:jar:1.0.9:provided
   +- javax.annotation:javax.annotation-api:jar:1.2:provided
   +- javax.batch:javax.batch-api:jar:1.0:provided
   +- javax.enterprise:cdi-api:jar:1.2:provided
   |  \- javax.inject:javax.inject:jar:1:provided
   +- javax.enterprise.concurrent:javax.enterprise.concurrent-api:jar:1.0:provided
   +- javax.resource:javax.resource-api:jar:1.7:provided
   +- javax.ejb:javax.ejb-api:jar:3.2:provided
   +- javax.el:javax.el-api:jar:3.0.0:provided
   +- javax.interceptor:javax.interceptor-api:jar:1.2:provided
   +- javax.security.jacc:javax.security.jacc-api:jar:1.5:provided
   +- javax.security.auth.message:javax.security.auth.message-api:jar:1.1:provided
   +- javax.mail:javax.mail-api:jar:1.5.0:provided
   |  \- javax.activation:activation:jar:1.1:provided
   +- javax.xml.bind:jaxb-api:jar:2.2.10:provided
   +- javax.ws.rs:javax.ws.rs-api:jar:2.0:provided
   +- javax.xml.ws:jaxws-api:jar:2.2.11:provided
   |  +- javax.xml.soap:javax.xml.soap-api:jar:1.3.5:provided
   |  \- javax.jws:jsr181-api:jar:1.0-MR1:provided
   +- javax.jms:javax.jms-api:jar:2.0:provided
   +- javax.faces:javax.faces-api:jar:2.2:provided
   +- javax.json:javax.json-api:jar:1.0:provided
   +- javax.servlet.jsp:javax.servlet.jsp-api:jar:2.3.1:provided
   +- org.apache.taglibs:taglibs-standard-spec:jar:1.2.5:provided
   +- javax.management.j2ee:javax.management.j2ee-api:jar:1.1.1:provided
   +- org.eclipse.persistence:javax.persistence:jar:2.1.0:provided
   +- javax.servlet:javax.servlet-api:jar:3.1.0:provided
   +- javax.transaction:javax.transaction-api:jar:1.2:provided
   +- javax.validation:validation-api:jar:1.1.0.Final:provided
   +- javax.websocket:javax.websocket-api:jar:1.1:provided
   +- wsdl4j:wsdl4j:jar:1.6.3:provided
   +- org.osgi:org.osgi.compendium:jar:4.2.0:provided
   \- org.osgi:org.osgi.core:jar:4.3.1:provided

úterý 5. ledna 2016

Spring Initializr

Zajímavý koncept přípravy nového Spring Boot projektu, který stojí za pozornost. Tvůrci původně zamýšleli vyrobit jednoduchou aplikaci pro interní účely, ale Initializr se stal často používanou aplikací celé Spring komunity. Initializr lze použít buď z prohlížeče http://start.spring.io, přímo z vývojového prostředí Eclipse STS nebo IntelliJ Idea anebo dokonce z příkazové řádky (příkaz curl http;//start.spring.io).


Ve formuláři Initializr vývojář zaškrtne potřebné technologie, které chce mít v základu projektu předpřipraveny. Tlačítko Generate projekt pak připraví zip soubor s projektem. V současné verzi lze vybrat Maven nebo Gradle projekt.