Highlight 2018

My highlight 2018.


Time flies and already another year passes. Today, I’d like to share with you my year 2018. Here’s the summary section:

  • Works at Nuxeo (long)
  • Stack Overflow
  • Chrome extension
  • Open source projects
  • Blog
  • Personal finance

In 2018, I handled 144 tickets for Nuxeo. They are very different and require many skills. Most of them are related to Nuxeo Online Services, including Nuxeo Studio, Nuxeo Connect Dashboard, Nuxeo Marketplace. There’s also Nuxeoctl, a command line tool for Nuxeo Server. It’s challenging to handle them as a Junior Software Engineer, but I’m grateful that my teammates trust me and that everything moves smoothly. Now, let’s take a look at Nuxeo Studio.

Nuxeo Studio

Nuxeo Studio lets you configure your Nuxeo platform easily. Nuxeo Studio is part of the product of Nuxeo Online Servies, hosted on the cloud. It provides a GUI to allow you customize your Nuxeo instances quickly, and create application without having to write a single line of code. Here’re some changes I brought this year.

Feature Configurations. Improve UI/UX experience by changing the CSS and the UI components written in GWT. Add supports for new features in generation and provide bug fixes for different editors.

  • Page Provider Editor. Various bug fixes on complex multi-valued field, for ElasticSearch, field resolution, field binding. Also adding support for new NXQL syntax ecm:isTrashed.
  • Workflow Editor. Add support for validation form. So that people can now cancel a workflow even if the validation fails.
  • Schemas Editor. Support generation for idOnly and pathOnly.
  • JavaScript Editors. Change editor settings for users, to provide better user experience for writing code.

Branch Management. Display Maven coordinates in branch listing view. Always display the current branch as the first result. Improve feedback when tag name already exists. Show user workspace state on the top of commit history (a.k.a work-in-progress commits). For more detail about Branch Management, check the documentation page and our tutorials.

Quick Switcher is a new feature of Nuxeo Studio. It allows you to quick switch between feature: jump into any Nuxeo Studio feature or menu option by typing its name, or just a few characters. The action can be triggered by clicking the button, or using shortcut « CTRL + K » in Windows/Linux or « CMD + K » in Mac. I was responsible for most part of the implementation on the UI part using Polymer 2, and part of the REST API on the backend. For more detail, check my blog How Quick Switcher is implemented?

QuickSwitcher Demo

Internal changes. Every feature configured in Studio will be generated as XML and be able to downloaded as JAR or ZIP. This year, I contributed to builder factoring, to inverse builder / platform relationship, refactor the builder resolver, and create new builder extension points (Java) and contributions (XML).

Nuxeo Connect Dashboard

REST API. Create REST API resources for different purposes: project management, client / organization management, and administration. The goal is to deprecate and remove FreeMarker, and use REST APIs to communicate between client and server.

Security and Authentication. On the security side, I contributed to some Content Security Policy (CSP) changes and fix several XSS vulnerabilities. On the authentication side, I upgraded our Central Authentication Service (CAS) and did some improvements on post filtering when after user login.

Performance. Improve the performance of applications listing, time reduced from 1.3 min to 1.83 second. This is done by reducing time complexity from O(N^2) to O(N). Also, another improvement on files by using Guava Loading Cache.

Nuxeo Marketplace

There’re relatively fewer tasks in Marketplace compared to other components. My contributions are around registries management (migrated from Studio) and REST API creation for platform / package management. Also some task for UI / UX improvement.

Other Topics in Nuxeo

Git logo

Git Server in NOS has been changed this year. We usually used GitLab Server to store customer projects. But we realized that this solution does not completely fit to our needs: we don’t need metadata (issues, PRs) provided by GitLab and we don’t want users to access our GitLab website directly. Therefore, a series of security measures need to be developped and maintained. It’s a pain. The only need we have is to store the Git repositories. By consequence, we swtiched to our own Git Server « Gitty », an implementation based on JGit Server and Jersey. My contributions are principally around:

  • Migration from GitLab to Gitty
  • RESTful API for repository CRUD
  • RESTful API served as “template” for other REST applications
  • Git restriction on different Git operations and user roles
  • Improve testability by adding Gitty into functional tests

Google Analytics integration has been improved. Firstly, provide the opt-out option for user in regards to GDPR. Secondly, refactor the categorization for pages and events, so that they are meaningful and easy to maintain. I also added analytics for new features and some of the existing ones, so that we can better understand user behavior. Note that we have several frontend technologies: GWT / FreeMarker / Polymer. The analytics integration is handled in each of them.

Testing is might be the place where I spent most of the time. This part has been well improved this year. Some key changes:

  • Improve existing test logic
  • Upgrade functional tests: Selenium 2 to 3, Firefox 42 to 58
  • Test trial registration (with SMTP server started)
  • Test Polymer element using Web Component Tester (WCT)
  • Test GWT changes using GWT tests (GWT Maven Plugin)
  • Introduce a new Java annotation @Tester for integration tests

Build Tools have been well improved this year too. This year, I contributed to the Git repositories merge, Maven plugins refactoring, adding new Maven plugins for different purposes: license check, code-style check, code usage check, code quality etc. Also some changes on deployment, release, Jenkins job configuration, and docker image.


The nuxeoctl script is located in the bin folder of the Nuxeo Server. It enables various options and commands. For MS Windows users, its equivalent is the nuxeoctl.bat script. This year, I did not work much on this component, only 4 tickets:

  • NXP-24507 Remember changes when nuxeoctl restarted
  • NXP-24671 Install package using package id rather than package name
  • NXP-24121 Fix Strict mode in start background command startbg
  • NXP-24151 Add (nuxeoctl) status to systemd init script


I asked 39 questions on StackOverflow this year. This query shows how many up-votes do I have for each tag in 2018. The top 10 results are: java (34), git (11), datetime (7), jgit (6), xml (6), maven (5), mvn-repo (4), nio (4), apache (4), json (3). At the beginning of the year, I was very interested in answering questions on StackOverflow. But then I realized that the high-score users are not just “hard-worker”, they have first-move advantage (MFA) over others. Also, unlike JavaScript or Cloud technologies, Java is very mature: many questions have already been asked and answered. So I gave up more-or-less the game, and moved the focus on other fields.

My StackOverflow scores 2018

Chrome Extension

I created a Chrome extension Ads Eraser for erasing ads in one click:

Chrome Extension: Ads Eraser

Open Source Projects

Here’s a list of open source projects that I contributed to this year. All patches are actually very small ones. Actually, I would like to contribute more if there’s any opportunity, but it’s hard. Contribution requires expertise but it’s hard to have it in the daily work. Perhaps it will be easier when experience grows…

JGit: pure Java library implementing the Git version control system

Maven: a build automation tool used primarily for Java projects

GSoC (CN): Chinese community of Google Summer of Code

GWT: Google Web Toolkit


This year, many of you visited my blog. The traffic has increased 12 times compared to 2017. 49 articles have been created, for Java, Maven, Git, REST API, GWT and more. I’m really happy that you enjoyed them and hope that I can bring more values to you in the next year. If you’re curious about the secret behind the traffic growth, check my blog: Improve Blog Ranking in Google Search.

My blog analytics 1

My blog analytics 2

Next year, I plan to improve the blog style to let it more user friendly. For example, provide related resources in the post, so user can jump between posts easier; write more series about Java; provide some book recommendations for becoming a good software engineer; improve the feed settings to improve reading experience.

Personal Finance

I made a small application with my wife for better handling personal finance. It is based on Python / Google Sheet / Jupyter Notebook. It helps us to keep track of our expense by downloading transaction history from our bank and aggregate them into different files. For more information, you can see my blog Personal Finance: Data Collection.

Java Certification

I passed the certification of Oracle Certified Professional Java SE 8 Programmer this year. You can see my digital certification here.


Hope you enjoy this article, see you the next time!