CharlesO

CharlesO

Reading files / data structures from other platforms into Elixir/Erlang

I’ve built and Elixir application that needs to read files produced by a Legacy Java platform.

Looking at the Java source shows clearly how the files are being constructed:

    HashMap localHashMap = null;
    List localList1 = null;
    ...
    ByteArrayOutputStream localByteArrayOutputStream = null;
    ObjectOutputStream localObjectOutputStream = null;

      localByteArrayOutputStream = new ByteArrayOutputStream();
      localObjectOutputStream = new ObjectOutputStream(localByteArrayOutputStream);
      localObjectOutputStream.flush();
      localHashMap = new HashMap();
      localHashMap.put("SecretKey", someBytes);
      localHashMap.put("EncryptedData", localList1);
      localHashMap.put("IVSpec", someMoreBytes);
      localObjectOutputStream.writeObject(localHashMap);
      arrayOfByte3 = localByteArrayOutputStream.toByteArray();

At the end of the day it’s really just a Java HashMap with known string keys that’s being written to file…

I tried to grok this link below, but i feel there’s got to be a much simpler way to interop common data structures from other platforms

https://medium.com/@mr.anmolsehgal/java-hashmap-internal-implementation-21597e1efec3

Any suggestions please?

Samples:
http://paperlesssolutionsltd.com.ng/sample1.zip
http://paperlesssolutionsltd.com.ng/sample2.zip

Marked As Solved

dimitarvp

dimitarvp

Let’s see if actual code and working tool will help. I made a quick repo:

https://github.com/dimitarvp/java_serialized_hashmap_to_json

Compile and run instructions are in the README file.

After compilation I ran this:

java -cp gson-2.8.5.jar:. MapToJson ~/Downloads/sample1.zip

And voila, minified JSON on the standard output.

Also Liked

tcoopman

tcoopman

Also, by googling a bit I found: InfoWorld | Technology insight for the enterprise and this indeed matches the binary format of the sample1.zip file provided.

You could have a look at this site to check how to reverse engineer the binary format. But I still think it would be simpler to write a basic java utility that reads the sample1.zip file and writes it to json/…

tcoopman

tcoopman

Wouldn’t it be easier to read them back in a java application and save them as json or an other interop format?

There is no magical solution to read files from an internal java binary format. You could always try to understand and parse the java binary format but that sounds like something that will be a lot of work and possible error prone.

NobbZ

NobbZ

And I never told you to change that. I have understood that you can not change the legacy system.

What we are suggesting is that you write a “third” program in Java, that does the conversion, depending on the type of the value in the map, either write out JSON or XML or BERT (aka Erlang External Term Format).

You have already Java code that shows you how to load the dump. Therefore loading and converting from there is probably the easiest thing to do.

Trying to load the unknown encoding in elixir/erlang code will be a lot of pain. We are just suggesting the easier ways. The BEAM is good in letting other programs work. Use it!

Where Next?

Popular in Questions Top

PeterCarter
There are pre-rolled solutions for other frameworks that do work. However, Phoenix does not seem to have these. Have people had good expe...
New
Lily
In templates/appointment/index.html.eex: <%= for appointment <- @appointments do %> <tr> <td><%= appoi...
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New

Other popular topics Top

jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
dogweather
I wrote this comment on r/haskell, and it’s not popular there. :wink: But I think I’m on to something… Haskell reminds me of Java, and e...
New
AstonJ
Seen any cool LiveView demos, sample apps or examples? Please post them here! :003:
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
sergio
Kind of like when jquery came out, it was super necessary. Existing drag and drop libraries have a bunch of baggage to support old browse...
New

We're in Beta

About us Mission Statement