Skip to content

Refactorings for optimizing Java 8 stream client code for greater parallelism and efficiency.

License

Notifications You must be signed in to change notification settings

ponder-lab/Optimize-Java-8-Streams-Refactoring

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Optimize Java 8 Streams Refactoring

Build Status Coverage Status GitHub license DOI Java profiler

Introduction

Icon The Java 8 Stream API sets forth a promising new programming model that incorporates functional-like, MapReduce-style features into a mainstream programming language. However, using streams efficiently may involve subtle considerations.

This tool consists of automated refactoring research prototype plug-ins for Eclipse that assists developers in writing optimal stream client code in a semantics-preserving fashion. Refactoring preconditions and transformations for automatically determining when it is safe and possibly advantageous to convert a sequential stream to parallel and improve upon already parallel streams are included. The approach utilizes both WALA and SAFE.

Screenshot

Screenshot

Demonstration

(click to view)

Video demo of refactoring tool

Usage

The refactoring can be run in two different ways:

  1. As a command.
    1. Select a project.
    2. Select "Optimize Streams..." from the "Quick Access" dialog (CTRL-3).
  2. As a menu item.
    1. Right-click on a project.
    2. Under "Refactor," choose "Optimize Streams..."

Currently, the refactoring works only via the package explorer and the outline views. You can either select a single project to optimize or select multiple projects. In each case, the tool will find streams in the enclosing projects to refactor.

Installation

The latest release is v0.18.0. It has been tested on Eclipse IDE for RCP and RAP Developers Version: 2019-03 (4.11.0), Build id: 20190314-1200 under OpenJDK Runtime Environment (build 1.8.0_212-8u212-b03-0ubuntu1.19.04.2-b03) and OpenJDK 64-Bit Server VM (build 25.212-b03, mixed mode) on Ubuntu 19.04.

This video demonstrates the different ways that this tool can be installed.

Update Site

An alpha version of our tool is available via an Eclipse update site at: https://raw.githubusercontent.com/ponder-lab/Optimize-Java-8-Streams-Refactoring/master/edu.cuny.hunter.streamrefactoring.updatesite. Please choose the latest version of the "Optimize Stream Refactoring."

Eclipse Marketplace

You may also install the tool via the Eclipse Marketplace by dragging this icon to your running Eclipse workspace: Drag to your running Eclipse* workspace. *Requires Eclipse Marketplace Client

Dependencies

The refactoring has several dependencies as listed below. If you experience any trouble installing the plug-in using the above update site, you can manually install the dependencies. The latest version of the plug-ins should be installed. If installing SAFE, note that WALA must be installed first:

Dependency Update Site
WALA https://raw.githubusercontent.com/ponder-lab/WALA/streams/com.ibm.wala.updatesite
SAFE https://raw.githubusercontent.com/tech-srl/safe/master/com.ibm.safe.updatesite
Common Eclipse Java Refactoring Framework https://raw.githubusercontent.com/ponder-lab/Common-Eclipse-Java-Refactoring-Framework/master/edu.cuny.citytech.refactoring.common.updatesite

WALA

Please note that there is a special dependency on WALA. Currently, our refactoring requires WALA version 1.3.10. Although the version from the official WALA site would theoretically work, the plug-in has been tested with the WALA version whose update site is listed above. We highly recommend that this version of WALA be used with the plug-in, which may require uninstalling other WALA features from your current Eclipse installation. Issue #192 has been opened to track the future integration.

Marking Entry Points

Explicit entry points may be marked using the appropriate annotation found in the corresponding annotation library. They can also be marked using a text file named entry_points.txt. The processing of this file is recursive; it will search for this file in the same directory as the source code and will traverse up the directory structure until one is found. As such, the file may be placed in, for example, package directories, subproject directories, and project roots. The format of the file is simply a list of method signatures on each line.

This video explains more details on how entry points can be specified.

Limitations

There are currently some limitations with embedded streams (i.e., streams declared as part of lambda expressions sent as arguments to intermediate stream operations). This is due to model differences between the Eclipse JDT and WALA. See #155 for details.

In general, there is an issue with the mapping between the Eclipse DOM and WALA DOM, particularly when using Anonymous Inner Classes (AICs). We are currently working with the WALA developers to resolve this issue.

Contributing

For information on contributing, see CONTRIBUTING.md.

Engineering Challenges and Solutions

This wiki page highlights the locations in our code that solve several engineering challenges outlined in our SCAM 2018 paper.

Further Information

See the wiki for further information.

Publications

Raffi Khatchadourian, Yiming Tang, Mehdi Bagherzadeh, and Syed Ahmed. Safe automated refactoring for intelligent parallelization of Java 8 streams. In International Conference on Software Engineering, ICSE '19, pages 619--630, Piscataway, NJ, USA, May 2019. ACM/IEEE, IEEE Press. [ bib | DOI | slides | http ]

Raffi Khatchadourian, Yiming Tang, Mehdi Bagherzadeh, and Syed Ahmed. A tool for optimizing Java 8 stream software via automated refactoring. In International Working Conference on Source Code Analysis and Manipulation, SCAM '18, pages 34--39. IEEE, IEEE Press, September 2018. Engineering Track. [ bib | DOI | slides | http ]

Citation

Please cite this work as follows:

@InProceedings{Khatchadourian2019,
  author       = {Raffi Khatchadourian and Yiming Tang and Mehdi Bagherzadeh and Syed Ahmed},
  booktitle    = {International Conference on Software Engineering},
  title        = {Safe Automated Refactoring for Intelligent Parallelization of {Java} 8 Streams},
  year         = {2019},
  address      = {Piscataway, NJ, USA},
  month        = may,
  organization = {ACM/IEEE},
  pages        = {619--630},
  publisher    = {{IEEE}},
  series       = {ICSE '19},
  acmid        = {3339586},
  doi          = {10.1109/icse.2019.00072},
  keywords     = {Java 8, automatic parallelization, refactoring, static analysis, streams, typestate analysis},
  location     = {Montr\'eal, QC, Canada},
  numpages     = {12},
  url          = {http://academicworks.cuny.edu/hc_pubs/489},
}

@InProceedings{Khatchadourian2018,
  author       = {Raffi Khatchadourian and Yiming Tang and Mehdi Bagherzadeh and Syed Ahmed},
  booktitle    = {International Working Conference on Source Code Analysis and Manipulation},
  title        = {A Tool for Optimizing {Java} 8 Stream Software via Automated Refactoring},
  year         = {2018},
  month        = sep,
  note         = {Engineering Track.},
  organization = {IEEE},
  pages        = {34--39},
  publisher    = {IEEE Press},
  series       = {IEEE SCAM '18},
  doi          = {10.1109/SCAM.2018.00011},
  issn         = {2470-6892},
  keywords     = {refactoring, automatic parallelization, typestate analysis, ordering, Java 8, streams, eclipse, WALA, SAFE},
  location     = {Madrid, Spain},
  numpages     = {6},
  url          = {http://academicworks.cuny.edu/hc_pubs/429},
}