Online IATA Telex Processor

I launched a first version of a Telex processor with a web frontend. It is a beta version and currently only processes MVT standard messages.

Some words about the requirements for a flexible interface processor

  • Though IATA Telexes are defined by a standard, variations are common because some are produced automatically by other systems and some are created manually, which causes more errors. The processing of telexes, the pattern recognition, must be flexible enough to be able to handle extra inline whitespaces and dots, as well extra lines with free text or extra headers and trailer, eg. now it is more common to receive telexes via email and often some extra email information is added as header before it reaches your system. Customers also might create their own telex standards, meaning the whole message is transported as free text message, but inside the message the customer uses his own syntax for data transmission.
    This requires a message interpreter that can be configured for new or non-standard formats on the fly, without the need to change any sourcecode and to redeploy a system.
    (I saw a project at one airport where the change of LDM format interpretation would have cost the customer around 10.000 Euro because one of the cargo airlines send messages with an extra header line)
  • Other standard messages, such as AFTN, NOTAM or CFMU should be processed by the same engine using the same approach. One interface engine with the flexibility of the scripts covers the various aspects of the different types.

A few words about concept and architecture

  • ESB
    Certainly the word ESB sometimes might appear bloated like other IT buzzwords, but it hardly makes sense today to implement distinct own interface systems for every protocol or subsystem type you come across. In a heterogeneous IT landscape like an airport an ESB allows you to easily connect inbound and outbound to a number of other systems via TCPIP, Email, FTP,.. or even talk to other standard systems like SAP, Salesforce.com and so on. We use one connector to talk to the ESB, the rest we orchestrate in the ESB itself. With MULE ESB we have the freedom of an opensource product as well the power of enterprise support. The learning curve for MULE is not too steep.
    For the sample of telexes: Sometimes you ‘receive’ telexes by using the auto export function of the Sitatex application and retrieve the files with the messages via FTP, or you receive the messages as email or via a queuing server from a central corporate entrypoint. We can swing over to another source or run in parallel without touching the main system.
  • Script Engine
    Instead of hardcoding the various formats, we use a Java Script engine executing Groovy Scripts. These scripts, one for each message type, are stored in the DB and can be adjusted or customized easily. The scripts produce an internal XML formatted standard output which easily can be un-marshalled during the downstream processing using proper XSD.
  • Data Processing
    Whatever requirements you have how to handle the received data. In our sample system here, receive from the web frontend and make it human readable.

Please feel free to drop by http://tools.airtilus.net:8080/AirtilusTelexR and try by yourself. Please note: Do not process confidential as the data is transmitted unsecured and might be stored (to improve the quality). This is NOT a commercial offering but a technology showcase. There is no warranty that the server is available or the processor correct. You can use the example message and modify it, otherwise copy and paste your own message.

The service is currently running on a Amazon EC2 micro instance, performance might decrease with a lot of traffic.

Online Telex Processor

Outlook

  • Summary for errors and rejected messages.
  • For the next versions I will add some of the other available telex types will follow such as LDM and CPM.
  • Add AFTN message interpretation.
  • Email Reply (send an email to the service and the human readable version is emailed back to the user).

TED Talks

TED is always a source of inspiration and shows that not all people are putting monetary value upfront in what they do, but still doing research or look at complex dependencies from a different viewing angle. I dislike the way a lot of companies are hoarding data about me, my trails and patterns in the virtual world as well the attempt to track me down in the physical world too. Jer Thorp giving a talk at TEDx about visualisation which is quite interesting.

IATA Telex Types Definition

Working in the airport IT industry you are always challenged with integration tasks at each airport. Usually you face a heterogeneous landscape of home-brew or taylored solutions and standard software running on anything from mainframe to virtual instances in a private clouds. Using an ESB we can tackle a lot of interfacing work and focus on the data integration part. One interface that you will find on all airports that operate commercial flights, is a link to the SITA network to send and receive IATA Telexes.

It is hard to find any information online, so I summarised the available message types here. Btw, these telex types are often referred to as SITA Telex types, which is not correct, IATA (Air Transport Association) defines the available telex types and SITA is operating the network to distribute the messages between airlines, airports, ATC, groundhandling agents and other relevant members of the airport community.

This list should be almost complete, giving you the type, the description and the AHM (Airport Handling Manual) or RP (Recommended Practice) reference. The AHM that you can purchase from IATA gives you all the syntax and details for most of the available types.

 MVT  AIRCRAFT MOVEMENT MESSAGE IATA AHM 780
 LDM  LOAD MESSAGE IATA AHM 583
 PTM  PASSENGER TRANSFER MESSAGE IATA RP 1718
 PSM  PASSENGER SERVICE MESSAGE IATA RP 1715
 DIV  AIRCRAFT DIVERSION MESSAGE IATA AHM 781
 BSM  BAGGAGE SERVICE MESSAGES IATA RP 1745
 CPM  CONTAINER/PALLET DISTRIBUTION MESSAGE IATA AHM 587
 UCM  ULD CONTROL MESSAGE IATA AHM 388
 SCM  ULD STOCK CHECK MESSAGE IATA AHM 385
 SLS  STATISTICAL LOAD SUMMARY IATA AHM 588
 ASM  ADHOC SCHEDULED MESSAGE IATA AHM 785
 PAL  PASSENGER ASSISTANCE LIST IATA RP1707b, 1708
 LPM  LOAD PLANNING MESSAGE IATA AHM 580
 ALI  ABBREVIATED LOAD INFORMATION MESSAGE IATA AHM 584
 SOM  SEATS OCCUPIED MESSAGE IATA RP 1712
 TPM  TELETYPE PASSENGER MANIFEST IATA RP 1717
 RQL  REQUEST LIST MESSAGE IATA RP 1709
 PNL  PASSENGER NAME LIST IATA RP 1708
 PFS  PASSENGER FINAL SALES MESSAGE IATA RP 1719
 IDM  INDUSTRY DISCOUNT MESSAGE IATA RP 1714
 ASL  ADDITIONS AND DELETIONS LIST IATA RP 1708
 SAL  SEATS AVAILABLE LIST IATA RP 1713
 RQM  REQUEST INFORMATION MESSAGE IATA AHM 783
 UWS  ULD/BULK LOAD WEIGHT SIGNAL IATA AHM 581
 FMM  FUEL MONITORING MESSAGE IATA AHM 782

Disclaimer: The list might not be correct or complete. It is for educational purpose only. For reliable information please refer to the IATA manuals.

MVT, LDM, PTM, TPM, CPM, PSM, UCM are among the most common telexes from my experience. If you implement a telex interpreter you definitely need to implement these types first.

I am working on an online telex processor, a demo version I will put online soon.

Virtualbox again

One of my favorite tools for evaluation, debugging and testing is virtualbox (link). I run it both Windows XP and Ubuntu as host and use it for Ubuntu, OpenSolaris, Fedorea, Suse and now with the latest Windows7 release candidate. We will start now testing our client applications on this release, which should be only servicepacks away from the final release version. Also check Netbeans and Glassfish.

Links:

  • Microsoft Windows7 RC (link) Runs fully until March (June 2010 with restrictions)
  • VirtualBox (link)

On Abstraction and High-Level Stuff

This is a maybe slight philosophical excursion into todays world of abstraction and the good old days when one could see the pins of a CPU.
I am into computing since the 1980′s. I never used 80-column-punchcards though (but I saw them in real). I was using early versions of Basic to program little applications on a ZX81 (wikipedia link). An ugly box with 1KB RAM connected to a TV set showing a simple monochrome screen with 32×24 char which I actually borrowed from a friend. I was soldering stuff on the motherboard on some ancient 8086 (wikiepdia link). I also learned to do programming in the heart of a CPU with assembler. Life was not convenient but simple. Something crashed you would know what happened pretty fast. Some snippet for the post-assembler generation:

cpu_type       PROC
pushf
xor    DX,DX
xor    AX,AX
push   AX
popf

Moving on (fast forward >>) to DOS machines with Turbo Pascal and C, the world of compiler and linker. You would know most of the commands and its syntax in short time. You still knew what is going on.
Some Pascal Code (not far away from todays syntax):

if c = (1+n)*(1+n)+1 then
begin
sound( 1000 ); delay( 1000 ); nosound;
repeat until keypressed;
kn := true;
goto done;
end;

And then (fast forward>>) we were hit by Windows 3.0 and we tried to understand code templates to show a little dialog with a button using C++ 1.0 and MFC.  A simple HELLO WORLD became a nightmare, at least when you started debugging it.

#include <afxwin.h>
class HelloApplication : public CWinApp
{
public:
virtual BOOL InitInstance();
};

HelloApplication HelloApp;

class HelloWindow : public CFrameWnd
{
CButton* m_pHelloButton;
public:
HelloWindow();
};

BOOL HelloApplication::InitInstance()
{
m_pMainWnd = new HelloWindow();
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
HelloWindow::HelloWindow()
{
Create(NULL,
“Hello World!”,
WS_OVERLAPPEDWINDOW|WS_HSCROLL,
CRect(0,0,140,80));
m_pHelloButton = new CButton();
m_pHelloButton->Create(“Hello World!”,WS_CHILD|WS_VISIBLE,CRect(20,20,120,40),this,1);

}

Lets move on to todays world of high-level (GL4,5?) languages, frameworks and nanotechnology hardware. It is amazing how easy you can create a full fledge web application with JSF and WS* but do one understand what is going on under the hood ? Most of us, NO. We are guessing.

I am staring up Glassfish Application Server and get more log info then the worst crashing debugging session of my early Turbo Pascal applications.

Jan 3, 2009 4:23:10 PM com.sun.enterprise.admin.servermgmt.launch.ASLauncher buildCommand
INFO:
E:/Program Files/Java/jdk1.6.0_10\bin\java
-Dcom.sun.aas.instanceRoot=E:/Program Files/glassfish-v2ur2/domains/domain1
-Dcom.sun.aas.ClassPathPrefix=
-Dcom.sun.aas.ClassPathSuffix=
-Dcom.sun.aas.ServerClassPath=
-Dcom.sun.aas.classloader.appserverChainJars.ee=
-Dcom.sun.aas.classloader.appserverChainJars=admin-cli.jar,admin-cli-ee.jar,j2ee-svc.jar
-Dcom.sun.aas.classloader.excludesList=admin-cli.jar,appserv-upgrade.jar,sun-appserv-ant.jar
-Dcom.sun.aas.classloader.optionalOverrideableChain.ee=
-Dcom.sun.aas.classloader.optionalOverrideableChain=webservices-rt.jar,webservices-tools.jar
-Dcom.sun.aas.classloader.serverClassPath.ee=/lib/hadbjdbc4.jar,E:/Program Files/glassfish-v2ur2/lib/SUNWjdmk/5.1/lib/jdmkrt.jar,/lib/dbstate.jar,/lib/hadbm.jar,/lib/hadbmgt.jar,E:/Program Files/glassfish-v2ur2/lib/SUNWmfwk/lib/mfwk_instrum_tk.jar
-Dcom.sun.aas.classloader.serverClassPath=E:/Program Files/glassfish-v2ur2/lib/install/applications/jmsra/imqjmsra.jar,E:/Program Files/glassfish-v2ur2/imq/lib/jaxm-api.jar,E:/Program Files/glassfish-v2ur2/imq/lib/fscontext.jar,E:/Program Files/glassfish-v2ur2/imq/lib/imqbroker.jar,E:/Program Files/glassfish-v2ur2/imq/lib/imqjmx.jar,E:/Program Files/glassfish-v2ur2/lib/ant/lib/ant.jar,E:/Program Files/glassfish-v2ur2/lib/SUNWjdmk/5.1/lib/jdmkrt.jar
-Dcom.sun.aas.classloader.sharedChainJars.ee=appserv-se.jar,appserv-ee.jar,jesmf-plugin.jar,/lib/dbstate.jar,/lib/hadbjdbc4.jar,jgroups-all.jar,E:/Program Files/glassfish-v2ur2/lib/SUNWmfwk/lib/mfwk_instrum_tk.jar
-Dcom.sun.aas.classloader.sharedChainJars=javaee.jar,E:/Program Files/Java/jdk1.6.0_10/lib/tools.jar,install/applications/jmsra/imqjmsra.jar,com-sun-commons-launcher.jar,com-sun-commons-logging.jar,E:/Program Files/glassfish-v2ur2/imq/lib/jaxm-api.jar,E:/Program Files/glassfish-v2ur2/imq/lib/fscontext.jar,E:/Program Files/glassfish-v2ur2/imq/lib/imqbroker.jar,E:/Program Files/glassfish-v2ur2/imq/lib/imqjmx.jar,E:/Program Files/glassfish-v2ur2/imq/lib/imqxm.jar,webservices-rt.jar,webservices-tools.jar,mail.jar,appserv-jstl.jar,jmxremote_optional.jar,E:/Program Files/glassfish-v2ur2/lib/SUNWjdmk/5.1/lib/jdmkrt.jar,activation.jar,appserv-rt.jar,appserv-admin.jar,appserv-cmp.jar,E:/Program Files/glassfish-v2ur2/updatecenter/lib/updatecenter.jar,E:/Program Files/glassfish-v2ur2/jbi/lib/jbi.jar,E:/Program Files/glassfish-v2ur2/imq/lib/imqjmx.jar,E:/Program Files/glassfish-v2ur2/lib/ant/lib/ant.jar,dbschema.jar
-Dcom.sun.aas.configName=server-config
-Dcom.sun.aas.configRoot=E:/Program Files/glassfish-v2ur2/config
-Dcom.sun.aas.defaultLogFile=E:/Program Files/glassfish-v2ur2/domains/domain1/logs/server.log
-Dcom.sun.aas.domainName=domain1
-Dcom.sun.aas.installRoot=E:/Program Files/glassfish-v2ur2
-Dcom.sun.aas.instanceName=server
-Dcom.sun.aas.processLauncher=SE
-Dcom.sun.aas.promptForIdentity=true
-Dcom.sun.enterprise.config.config_environment_factory_class=com.sun.enterprise.config.serverbeans.AppserverConfigEnvironmentFactory
-Dcom.sun.enterprise.overrideablejavaxpackages=javax.help,javax.portlet
-Dcom.sun.enterprise.taglibs=appserv-jstl.jar,jsf-impl.jar
-Dcom.sun.enterprise.taglisteners=jsf-impl.jar
-Dcom.sun.updatecenter.home=E:/Program Files/glassfish-v2ur2/updatecenter
-Ddomain.name=domain1
-Djava.endorsed.dirs=E:/Program Files/glassfish-v2ur2/lib/endorsed
-Djava.ext.dirs=E:/Program Files/Java/jdk1.6.0_10/lib/ext;E:/Program Files/Java/jdk1.6.0_10/jre/lib/ext;E:/Program Files/glassfish-v2ur2/domains/domain1/lib/ext;E:/Program Files/glassfish-v2ur2/javadb/lib
-Djava.library.path=E:\Program Files\glassfish-v2ur2\lib;E:\Program Files\glassfish-v2ur2\lib;E:\Program Files\glassfish-v2ur2\bin;E:\Program Files\glassfish-v2ur2\lib
-Djava.security.auth.login.config=E:/Program Files/glassfish-v2ur2/domains/domain1/config/login.conf
-Djava.security.policy=E:/Program Files/glassfish-v2ur2/domains/domain1/config/server.policy
-Djava.util.logging.manager=com.sun.enterprise.server.logging.ServerLogManager
-Djavax.management.builder.initial=com.sun.enterprise.admin.server.core.jmx.AppServerMBeanServerBuilder
-Djavax.net.ssl.keyStore=E:/Program Files/glassfish-v2ur2/domains/domain1/config/keystore.jks
-Djavax.net.ssl.trustStore=E:/Program Files/glassfish-v2ur2/domains/domain1/config/cacerts.jks
-Djdbc.drivers=org.apache.derby.jdbc.ClientDriver
-Djmx.invoke.getters=true
-Dsun.rmi.dgc.client.gcInterval=3600000
-Dsun.rmi.dgc.server.gcInterval=3600000
-client
-XX:+UnlockDiagnosticVMOptions
-XX:MaxPermSize=192m
-Xmx512m
-XX:NewRatio=2
-XX:+LogVMOutput
-XX:LogFile=E:/Program Files/glassfish-v2ur2/domains/domain1/logs/jvm.log
-cp
E:/Program Files/glassfish-v2ur2/lib/jhall.jar;E:\Program Files\glassfish-v2ur2\lib\appserv-launch.jar
com.sun.enterprise.server.PELaunch
start
Starting Sun Java System Application Server 9.1_02 (build b04-fcs) …
MBeanServer started: com.sun.enterprise.interceptor.DynamicInterceptor
CORE5098: AS Socket Service Initialization has been completed.
CORE5076: Using [Java HotSpot(TM) Client VM, Version 1.6.0_10] from [Sun Microsystems Inc.]
SEC1002: Security Manager is OFF.
E:/Program Files/glassfish-v2ur2/domains/domain1/config/.__com_sun_appserv_pid
ADM0001:SunoneInterceptor is now enabled
SEC1143: Loading policy provider com.sun.enterprise.security.provider.PolicyWrapper.
WEB0114: SSO is disabled in virtual server [server]
WEB0114: SSO is disabled in virtual server [__asadmin]
ADM1079: Initialization of AMX MBeans started
ADM1504: Here is the JMXServiceURL for the Standard JMXConnectorServer: [service:jmx:rmi:///jndi/rmi://bluff:8686/jmxrmi].  This is where the remote administrative clients should connect using the standard JMX connectors
ADM1506: Status of Standard JMX Connector: Active = [true]
WEB0302: Starting Sun-Java-System/Application-Server.
JBIFW0010: JBI framework ready to accept requests.
WEB0712: Starting Sun-Java-System/Application-Server HTTP/1.1 on 8080
WEB0712: Starting Sun-Java-System/Application-Server HTTP/1.1 on 8181
WEB0712: Starting Sun-Java-System/Application-Server HTTP/1.1 on 4848
SMGT0007: Self Management Rules service is enabled
Application server startup complete.

Conclusion: I enjoy the ride, I could experience early 8bit CPU’s and still draw on these hands-on exercises. It is hard to stay up-to-date today and be able to explain tech stuff to customers. It is hard to find experienced people to hire. Better try to know what you do and sell to your customers.

Life became convenient but not simple anymore.

Basic Security and Safety

On an almost daily base I see the most basic security breached or ignored. I am not talking about sophisticated security and access controls that more and more companies provide, but about personal user security.

  1. Where one store id’s and passwords ? Either you use always the same password since years or you write them down in your diary or (paper)notebook, in a textfile or stick them on stickies beside the screen. No need to ellaborate on the potential problems here.
  2. You carry your documents (your companies ?)  or sourcecode around on a portable USB harddisk or USB Stick. Ever thought what happens if you loose it. I dont mention the people who dont even make backups of the same devices. You loose it, you have 2 problems, right ?

My recommendation for today:

  1. Use an device-encrypting programm like TrueCrypt (link). It encrypt on the fly and even comes with bogus drives in case you are forced to reveal the passwword.
  2. Use a passwordsafe like KeePass (link). One encrypted password database for all your id’s and passwords. Just make sure you have one very good master password !

Both products use a variation of standard encryption algorithm and are opensource.

Talk back and Feedback

As an IT company you know feedback is vital and can be crucial to maintain a level of quality. Either you collect feedback a) directly from your users (person to person, email, phone, ticket system,..) or b) let the deployed software talk to you directly.  How many time some piece of software crashed or did something wrong and you – as in case a) – dont bother to do anything and just restart the application and continue your work ? Many times I guess, only if the software really does not wok anymore, we would feedback and complain. So all these valuable small (and lost) incidents that appear isolated to a enduser would help to increase the quality of the software if we just would feedback (manually).

But most of us are also not happy if the software talks back to its vendor directly because we either fear it would transfer personal data or just would tell the vendor that you are using some pirated version of its application.

My recommendation/wish:

Producer: Display it clearly and ask for approval to transmit bug data to a central server. Show what you going to transmit. Make it optional.

Consumer: Let the software talk back. It will not help you this time, but with truckloads of bug reports flowing back the software, it will ultimately gets better and benefits everyone.

Sample (what Thunderbird sends back after crashing)

Application Launch Time
9/6/2008 2:33 PM
Build Identifier
2008070808
Deployment Identifier
MozillaOrgThunderbird2Win322008070808
Interface Version
8 (0×00000008)
Monitor Configuration Version
3 (0×00000003)
Platform Identifier
Win32
Product Identifier
Thunderbird2
Talkback Configuration Version
3 (0×00000003)

[..]

Event Description
32-bit Windows exception
Event Type
1 (0×00000001)
Information Collection Time
9/6/2008 2:47 PM
Memory Status
[   0] 20 00 00 00 2B 00 00 00 00 C0 5F 5F 00 B0 44 36 [ ...+.....__..D6]
[  10] 00 80 2A D6 00 A0 0C B5 00 00 FE 7F 00 C0 6B 79 [..*...........ky]

[..]