Hans G. K. Hummel

43 papers A 1B 3Journal 27Unranked 7
YearRankTypeTitle / Venue / Authors
2023 conf
CSEDU (2)
Hugo C. Huurdeman, Hans G. K. Hummel, Rob Nadolski, Giel van Lankveld, Konstantinos Georgiadis, Johan van den Boomen, Hub Kurvers, Petra Neessen, Ron Pat-El, Aad Slootmaker
2023 J jnl
Interact. Learn. Environ.
Hans G. K. Hummel, Aad Slootmaker, Jeroen Storm
2021 J jnl
Br. J. Educ. Technol.
Hans G. K. Hummel, Rob Nadolski, Jannes Eshuis, Aad Slootmaker, Jeroen Storm
2018 J jnl
Interact. Learn. Environ.
Hans G. K. Hummel, Elizabeth A. Boyle, Sif Einarsdóttir, Arna Pétursdóttir, Aurel Graur
2018 conf
GALA
Elizabeth A. Boyle, Jannicke Baalsrud Hauge, Murray Leith, Duncan Sim, Hans G. K. Hummel, Petar Jandric, Athanassios Jimoyiannis
2018 conf
TECH-EDU
Elizabeth A. Boyle, Gavin Baxter, Athanassios Jimoyiannis, Murray Leith, Duncan Sim, Arno van der Zwet, Graham G. Scott, Melody M. Terras, Panagiotis Tsiotakis, Hans G. K. Hummel, Jannicke Baalsrud Hauge, Petar Jandric
2017 J jnl
Br. J. Educ. Technol.
Rob Nadolski, Hans G. K. Hummel
2015 J jnl
Interact. Learn. Environ.
Hans G. K. Hummel, Walter Geerts, Aad Slootmaker, Derek Kuipers, Wim Westera
2014 J jnl
J. Univers. Comput. Sci.
Aad Slootmaker, Hub Kurvers, Hans G. K. Hummel, Rob Koper
2014 J jnl
Int. J. Serious Games
Wim Westera, Rob Nadolski, Hans G. K. Hummel
2014 conf
CSEDU (3)
Hans G. K. Hummel, Walter Geerts, Aad Slootmaker, Derek Kuipers, Wim Westera
2014 conf
CSEDU (Selected Papers)
Hans G. K. Hummel, Walter Geerts, Aad Slootmaker, Derek Kuipers, Wim Westera
2013 conf
GALA
Wim Westera, Rob Nadolski, Hans G. K. Hummel
2011 ch.
Recommender Systems Handbook
Nikos Manouselis, Hendrik Drachsler, Riina Vuorikari, Hans G. K. Hummel, Rob Koper
2011 J jnl
Br. J. Educ. Technol.
Hans G. K. Hummel, Jasper van Houcke, Rob Nadolski, Tony van der Hiele, Hub Kurvers, Ansje Löhr
2010 J jnl
Int. J. Emerg. Technol. Learn.
Hendrik Drachsler, Lloyd Rutledge, Peter van Rosmalen, Hans G. K. Hummel, Dries Pecceu, Tanja Arts, Edwin Hutten, Rob Koper
2010 J jnl
Int. J. Emerg. Technol. Learn.
Susanne Neumann, Michael Klebl, Dai Griffiths, Davinia Hernández Leo, Luis de la Fuente Valentín, Hans G. K. Hummel, Francis Brouns, Michael Derntl, Petra Oberhuemer
2009 ch.
Learning Network Services for Professional Development
Rob Koper, Peter B. Sloep, Hans G. K. Hummel, Hubert Vogten, Jan van Bruggen, Marcus Specht, Wolfgang Greller
2009 J jnl
J. Educ. Technol. Soc.
Hendrik Drachsler, Hans G. K. Hummel, Bert van den Berg, Jannes Eshuis, Wim Waterink, Rob Nadolski, Adriana J. Berlanga, Nanda Boers, Rob Koper
2009 ch.
Learning Network Services for Professional Development
Hendrik Drachsler, Hans G. K. Hummel, Bert van den Berg, Jannes Eshuis, Wim Waterink, Rob Nadolski, Adriana J. Berlanga, Nanda Boers, Rob Koper
2009 ch.
Learning Network Services for Professional Development
Rob Nadolski, Bert van den Berg, Adriana J. Berlanga, Hans G. K. Hummel, Hendrik Drachsler, Rob Koper, Peter B. Sloep
2009 J jnl
J. Digit. Inf.
Hendrik Drachsler, Hans G. K. Hummel, Rob Koper
2009 ch.
Learning Network Services for Professional Development
Hans G. K. Hummel, Bert van den Berg, Adriana J. Berlanga, Hendrik Drachsler, José Janssen, Rob Nadolski, Rob Koper
2009 conf
MUPPLE@EC-TEL
Hendrik Drachsler, Dries Pecceu, Tanja Arts, Peter van Rosmalen, Hans G. K. Hummel, Rob Koper, Edwin Hutten, Lloyd Rutledge
2009 B conf
EC-TEL
Hendrik Drachsler, Dries Pecceu, Tanja Arts, Edwin Hutten, Lloyd Rutledge, Peter van Rosmalen, Hans G. K. Hummel, Rob Koper
2009 J jnl
J. Artif. Soc. Soc. Simul.
Rob Nadolski, Bert van den Berg, Adriana J. Berlanga, Hendrik Drachsler, Hans G. K. Hummel, Rob Koper, Peter B. Sloep
2008 J jnl
J. Educ. Technol. Soc.
Frans J. Prins, Rob Nadolski, Adriana J. Berlanga, Hendrik Drachsler, Hans G. K. Hummel, Rob Koper
2008 A conf
RecSys
Hendrik Drachsler, Hans G. K. Hummel, Rob Koper
2008 J jnl
Int. J. Learn. Technol.
Hendrik Drachsler, Hans G. K. Hummel, Rob Koper
2008 J jnl
J. Comput. Assist. Learn.
Wim Westera, Rob Nadolski, Hans G. K. Hummel, Iwan G. J. H. Wopereis
2008 J jnl
Int. J. Emerg. Technol. Learn.
Marco Kalz, Hendrik Drachsler, Jan van Bruggen, Hans G. K. Hummel, Rob Koper
2007 J jnl
Int. J. Learn. Technol.
Hans G. K. Hummel, Bert van den Berg, Adriana J. Berlanga, Hendrik Drachsler, José Janssen, Rob Nadolski, Rob Koper
2007 J jnl
Interact. Learn. Environ.
José Janssen, Bert van den Berg, Colin Tattersall, Hans G. K. Hummel, Rob Koper
2007 J jnl
J. Educ. Technol. Soc.
Ralf Klamma, Mohamed Amine Chatti, Erik Duval, Hans G. K. Hummel, Ebba Thora Hvannberg, Milos Kravcik, Effie Law, Ambjörn Naeve, Peter Scott
2007 J jnl
Interact. Learn. Environ.
Colin Tattersall, José Janssen, Bert van den Berg, Hans G. K. Hummel, Rob Koper
2006 J jnl
Int. J. Web Based Communities
Hans G. K. Hummel, Colin Tattersall, Daniel Burgos, Francis Brouns, Hub Kurvers, Rob Koper
2006 B conf
ICALT
Hans G. K. Hummel, Colin Tattersall, Daniel Burgos, Francis Brouns, Rob Koper
2006 B conf
ICALT
Ralf Klamma, Mohamed Amine Chatti, Erik Duval, Sebastian Fiedler, Hans G. K. Hummel, Ebba Thora Hvannberg, Andreas Kaibel, Barbara Kieslinger, Milos Kravcik, Effie Lai-Chong Law, Ambjörn Naeve, Peter Scott, Marcus Specht, Colin Tattersall, Riina Vuorikari
2006 J jnl
Comput. Hum. Behav.
Hans G. K. Hummel, Fred Paas, E. J. R. Koper
2005 J jnl
J. Comput. Assist. Learn.
Hans G. K. Hummel, Daniel Burgos, Colin Tattersall, Francis Brouns, Hub Kurvers, Rob Koper
2005 J jnl
Interact. Learn. Environ.
Hans G. K. Hummel, Colin Tattersall, Daniel Burgos, Francis Brouns, Hub Kurvers, Rob Koper
2004 J jnl
J. Comput. Assist. Learn.
Hans G. K. Hummel, Fred Paas, E. J. R. Koper
2004 J jnl
Int. J. Learn. Technol.
Hans G. K. Hummel, Jocelyn Manderveld, Colin Tattersall, Rob Koper
redb/extractors/decompiler/apk/jadx_wrapper.py
← Index redb/extractors/decompiler/apk/jadx_wrapper.py python
"""JADX decompiler subprocess wrapper.

Manages JADX subprocess execution for Java decompilation,
following the CAPA extractor subprocess pattern.
"""

import os
import re
import signal
import subprocess
from typing import Dict, Optional


class JADXDecompiler:
    """Subprocess wrapper for JADX Java decompilation."""

    def __init__(self, jadx_path: str = None, timeout: int = None, log=None):
        self.jadx_path = jadx_path or os.getenv("JADX_PATH", "jadx")
        self.timeout = timeout or int(os.getenv("JADX_TIMEOUT", "300"))
        self.log = log

    def decompile(self, apk_path: str, output_dir: str) -> bool:
        """Run JADX decompilation on an APK file.

        Returns True on success, False on failure.
        """
        cmd = [
            self.jadx_path,
            "--no-res",
            "--no-imports",
            "--threads-count", "2",
            "--output-dir", output_dir,
            apk_path,
        ]

        try:
            process = subprocess.Popen(
                cmd,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                text=True,
                preexec_fn=os.setsid,
            )

            try:
                stdout, stderr = process.communicate(timeout=self.timeout)
                if process.returncode != 0:
                    if self.log:
                        self.log.warning(
                            f"JADX returned non-zero exit code {process.returncode}: "
                            f"{stderr[:500] if stderr else 'no stderr'}"
                        )
                    # JADX may still produce partial output on non-zero exit
                    return os.path.isdir(os.path.join(output_dir, "sources"))
                return True

            except subprocess.TimeoutExpired:
                if self.log:
                    self.log.error(
                        f"JADX timed out after {self.timeout}s"
                    )
                # Kill the process group
                try:
                    os.killpg(os.getpgid(process.pid), signal.SIGTERM)
                    process.wait(timeout=3)
                except (ProcessLookupError, subprocess.TimeoutExpired):
                    try:
                        os.killpg(os.getpgid(process.pid), signal.SIGKILL)
                    except ProcessLookupError:
                        pass
                return False

        except FileNotFoundError:
            if self.log:
                self.log.error(
                    f"JADX not found at '{self.jadx_path}'. "
                    "Install JADX or set JADX_PATH env var."
                )
            return False
        except Exception as e:
            if self.log:
                self.log.error(f"JADX execution error: {e}")
            return False

    def parse_java_methods(self, output_dir: str) -> Dict[str, str]:
        """Parse JADX output into per-method Java source.

        Returns dict keyed by 'package.ClassName.methodName(ParamType1, ParamType2)'.
        """
        sources_dir = os.path.join(output_dir, "sources")
        if not os.path.isdir(sources_dir):
            return {}

        methods = {}
        for root, _dirs, files in os.walk(sources_dir):
            for fname in files:
                if not fname.endswith(".java"):
                    continue
                fpath = os.path.join(root, fname)
                try:
                    with open(fpath, "r", encoding="utf-8", errors="replace") as f:
                        content = f.read()

                    # Derive the fully qualified class name from file path
                    rel_path = os.path.relpath(fpath, sources_dir)
                    class_fqn = rel_path.replace(os.sep, ".").replace("/", ".")
                    if class_fqn.endswith(".java"):
                        class_fqn = class_fqn[:-5]

                    file_methods = self._extract_methods_from_java(
                        content, class_fqn
                    )
                    methods.update(file_methods)

                except Exception:
                    continue

        return methods

    def _extract_methods_from_java(
        self, source: str, class_fqn: str
    ) -> Dict[str, str]:
        """Extract individual methods from a Java source file.

        Uses brace-depth tracking to find method boundaries.
        """
        methods = {}
        lines = source.split("\n")
        i = 0

        while i < len(lines):
            line = lines[i]
            match = self._is_method_declaration(line)
            if match:
                method_name, param_types = match
                # Track brace depth to find method end
                start_line = i
                brace_depth = 0
                found_open = False

                for j in range(i, len(lines)):
                    for ch in lines[j]:
                        if ch == "{":
                            brace_depth += 1
                            found_open = True
                        elif ch == "}":
                            brace_depth -= 1

                    if found_open and brace_depth == 0:
                        method_body = "\n".join(lines[start_line : j + 1])
                        key = f"{class_fqn}.{method_name}({param_types})"
                        methods[key] = method_body
                        i = j + 1
                        break
                else:
                    i += 1
            else:
                i += 1

        return methods

    # Regex for method declarations (not constructors, not class/interface decl)
    _METHOD_DECL_RE = re.compile(
        r"^\s*(?:(?:public|private|protected|static|final|synchronized|"
        r"native|abstract|strictfp)\s+)*"
        r"(?:[\w<>\[\]?.]+\s+)"  # return type
        r"(\w+)"  # method name
        r"\s*\(([^)]*)\)"  # parameters
        r"(?:\s*throws\s+[\w.,\s]+)?"
        r"\s*\{"
    )

    def _is_method_declaration(self, line: str) -> Optional[tuple]:
        """Check if a line is a method declaration.

        Returns (method_name, param_types_str) or None.
        """
        m = self._METHOD_DECL_RE.match(line)
        if not m:
            return None

        method_name = m.group(1)
        params_raw = m.group(2).strip()

        # Skip class-level blocks
        if method_name in ("if", "for", "while", "switch", "try", "catch"):
            return None

        # Extract just the type names from parameters
        if not params_raw:
            return (method_name, "")

        param_types = []
        for param in params_raw.split(","):
            param = param.strip()
            if not param:
                continue
            parts = param.split()
            # Last non-annotation token before the variable name is the type
            # Simple heuristic: type is second-to-last, name is last
            if len(parts) >= 2:
                param_types.append(parts[-2])
            elif len(parts) == 1:
                param_types.append(parts[0])

        return (method_name, ", ".join(param_types))