čtvrtek 12. srpna 2021

Get the Service Integration Bus Messagin Engine State

# get list of Service Integration Buses
buses=AdminTask.listSIBuses();

# get list of SIB Engines
for bus in buses.split(lineseparator):
 AdminTask.listSIBEngines('[-bus '+bus.split('(')[0]+']').split('(')[0]

# get SIB the status of engine
sibengines=AdminControl.queryNames('WebSphere:type=SIBMessagingEngine,*').split(lineseparator)
for sibengine in sibengines:
 print sibengine.split('name=')[1].split(',')[0]+" "+AdminControl.invoke(sibengine,'state');
 

Obtain the SystemOut.log, SystemErr.log, native_stdout, native_stderr location using wsadmin

server=AdminConfig.getid('/Node: Custom01Node /Server: server1');
systemoutlog=AdminConfig.showAttribute(server, 'outputStreamRedirect');
systemerrorlog=AdminConfig.showAttribute(server, 'errorStreamRedirect');
processDef = AdminConfig.list( 'JavaProcessDef', server )
nativelog=AdminConfig.showAttribute(processDef, 'ioRedirect');
adminOperations = AdminControl.queryNames('WebSphere:*,type=AdminOperations,process=server1')
print AdminControl.invoke(adminOperations, 'expandVariable', [AdminConfig.showAttribute(systemoutlog, 'fileName')])
print AdminControl.invoke(adminOperations, 'expandVariable', [AdminConfig.showAttribute(systemerrorlog, 'fileName')])
print AdminControl.invoke(adminOperations, 'expandVariable', [AdminConfig.showAttribute(nativelog, 'stdoutFilename')])
print AdminControl.invoke(adminOperations, 'expandVariable', [AdminConfig.showAttribute(nativelog, 'stderrFilename')])

čtvrtek 6. června 2019

SOAP UI Java API - jak zavolat web service request z Javy


import com.eviware.soapui.impl.wsdl.WsdlInterface;
import com.eviware.soapui.impl.wsdl.WsdlOperation;
import com.eviware.soapui.impl.wsdl.WsdlProject;
import com.eviware.soapui.impl.wsdl.WsdlRequest;
import com.eviware.soapui.impl.wsdl.WsdlSubmit;
import com.eviware.soapui.impl.wsdl.WsdlSubmitContext;
import com.eviware.soapui.model.iface.Response;

public class App
{
    public static void main( String[] args )
    {
        try {
   WsdlProject soapUiProject = new WsdlProject("/tmp/SOAP_UI_PROJECT.xml" );
   WsdlInterface wsdlInterface = (WsdlInterface)soapUiProject.getInterfaceAt(0);
   WsdlOperation searchPersonMultiOperation = wsdlInterface.getOperationByName("searchName");
   WsdlRequest request = searchPersonMultiOperation.getRequestByName("001_Ian_Flemming");
   WsdlSubmitContext wsdlSubmitContext = new WsdlSubmitContext( request );
   WsdlSubmit<WsdlRequest> submit = (WsdlSubmit<WsdlRequest>) request.submit( wsdlSubmitContext, false );
   Response response = submit.getResponse();
   System.out.println(request.getRequestContent());
   System.out.println("-------------------");
   System.out.println(response.getContentAsString());
  } catch (Exception e) {
   e.printStackTrace();
  }
       
    }
}

úterý 2. ledna 2018

JDBC připojení do SQLite databáze

Pro JDBC  připojení do SWQLite jsem použil následující JDBC driver:


https://bitbucket.org/xerial/sqlite-jdbc/downloads/

Nastavení Squirrel pro připojení do SQLite

Ve Squirrel je potřeba přidat nový driver viz následující obrázek.

Name: SQLite
Example URL: jdbc:sqlite:sqlite_databsase_file_path
Website URL: https://bitbucket.org/xerial/sqlite-jdbc
Extra Class Path: přidat cestu k jar jdbc driveru (sqlite-jdbc-3.21.0.jar)
Class Name: org.sqlite.JDBC



 Připojení do databáze potřebuje pouzte jeden parametr a to URL pro připojení jdbc:sqlite:<cesta k databázovému souboru> například jdbc:sqlite:C:/temp/home-assistant-v2.db. Tento typ připojení nepodporuje víceuživatelský přístup, proto může být k databázi připojení pouze jeden klient. Pokud tedy databázi používá nějaká aplikace, musíte aplikaci před připojení Squirrel vypnout.


pátek 25. srpna 2017

SOA a Microservices

Odkaz na článek porovnání konceptů SOA a microservices

https://www.ibm.com/developerworks/websphere/library/techarticles/1601_clark-trs/1601_clark.html

středa 21. června 2017

Jak použít automatické testování REST ve Fitnesse?

Fitnesse - nástroj pro testery, umožňuje psát testy ve formě wiki stránek, spouštět je, generovat reporty a zobrazovat historii provedených testů.

Fitnesse je rozšiřitelný ve formě tzv. fixture. Pro REST rozhraní jsou také možná fixture. Jedním z nich je RestFixture. Náved na přípravu prvního fixture je:

https://stackoverflow.com/questions/35753103/workflow-of-creating-tests-using-restfixture

Fixture je připravený jako Maven archetype. Postup podle návodu zafungoval napoprvé.

Drobné rozdíly:

1)

v dependency jsem použil novější verzi Fitnesse:

 <dependency>
    <groupId>org.fitnesse</groupId>
    <artifactId>fitnesse</artifactId>
    <version>20161106</version>
</dependency>
 2)

pro start jsem musel použít příkaz call start.bat,  samotný start.bat mi nezafungoval správně.



Postup - přesně podle https://stackoverflow.com/questions/35753103/workflow-of-creating-tests-using-restfixture :

1) Připravit mvn projekt se základem fixture z již hotového připraveného archetypu.

mvn archetype:generate -DgroupId=com.ibm.cz.fitnesse.rest
.sample -DartifactId=scratch -DarchetypeArtifactId=maven-archetype-quickstart -D
interactiveMode=false

2) Přidat dependency

<dependency>
        <groupId>smartrics.restfixture</groupId>
        <artifactId>smartrics-RestFixture</artifactId>
        <version>4.1</version>
</dependency>
 <dependency>
    <groupId>org.fitnesse</groupId>
    <artifactId>fitnesse</artifactId>
    <version>20161106</version>
</dependency>

a odmazat App.java ze src\main\java\com\ibm\cz\fitnesse\rest\sample

3) Přidat

  <plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <configuration>
                <outputDirectory>${project.build.directory}/dependencies</outputDirectory>
            </configuration>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
        </execution>
    </executions>
</plugin>

4) Spustit mvn clean package

5) Připravit start.bat s následujícím obsahem:

setLocal EnableDelayedExpansion
set CLASSPATH="
for /R target\dependencies %%a in (*.jar) do (
      set CLASSPATH=!CLASSPATH!;%%a
)
set CLASSPATH=!CLASSPATH!"
java -cp !CLASSPATH! fitnesseMain.FitNesseMain -p 9090 -d src\main\resources -e 0

6) Spustit start.bat: call start.bat

POZOR: pouze start.bat na WIN7 nezafunguje správně

7) Vyzkoušet http://localhost:9090


středa 18. ledna 2017

Vyhození fault Java komponenty v Integration Designer







/**
* Method generated to support implementation of operation "operation1" defined for WSDL port type
* named "SimpleIntf".
*
* The presence of commonj.sdo.DataObject as the return type and/or as a parameter
* type conveys that it is a complex type. Please refer to the WSDL Definition for more information
* on the type of input, output and fault(s).
*/
public DataObject operation1(DataObject input1) throws Throwable{
Service service = locateService_SimpleIntfPartner();
try {
service.invoke("operation1", input1);
} catch (Throwable t) {
System.out.println("Nastala chyba");
com.ibm.websphere.bo.BOFactory boFactory = (com.ibm.websphere.bo.BOFactory) ServiceManager.INSTANCE.locateService("com/ibm/websphere/bo/BOFactory");
DataObject fault = boFactory.create("http://JMSDemoModule", "ServiceFault");
fault.setString("error", t.getMessage());
throw new ServiceBusinessException(fault);
}

return input1;
}

ú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.

středa 30. prosince 2015

Vaadin 7

Na Vaadin (https://vaadin.com) mě upozornil můj kolega. Jsem mu neskonale vděčný, protože se jedná o hodně zajímavý framework. Jeho snadné použití a efektní výsledky mě mile překvapily. Rozhodně stojí za prozkoumání.

Instalace Vaadin plugin do Eclipse

https://vaadin.com/book/-/page/getting-started.eclipse.html