Home > Blockchain >  Freemarker Debugger framework usage example
Freemarker Debugger framework usage example

Time:01-06

I have started working on a Freemarker Debugger using breakpoints etc. The supplied framework is based on java RMI. So far I get it to suspend at one breakpoint but then ... nothing.

Is there a very basic example setup for the serverpart and the client part other then the debug/imp classes supplied with the sources. That would be of great help.

this is my server class:

class DebuggerServer {
    private final int port;
    private final String templateName1;
    private final Environment templateEnv;
    private boolean stop = false;

    public DebuggerServer(String templateName) throws IOException {
        System.setProperty("freemarker.debug.password", "hello");
        port = SecurityUtilities.getSystemProperty("freemarker.debug.port", Debugger.DEFAULT_PORT).intValue();
        System.setProperty("freemarker.debug.password", "hello");
        Configuration cfg = new Configuration();
        // Some other recommended settings:
        cfg.setIncompatibleImprovements(new Version(2, 3, 20));
        cfg.setDefaultEncoding("UTF-8");
        cfg.setLocale(Locale.US);
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
        Template template = cfg.getTemplate(templateName);
        templateName1 = template.getName();
        System.out.println("Debugging "   templateName1);

        Map<String, Object> root = new HashMap();
        Writer consoleWriter = new OutputStreamWriter(System.out);

        templateEnv = new Environment(template, null, consoleWriter);
        DebuggerService.registerTemplate(template);
    }

    public void start() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                startInternal();
            }
        }, "FreeMarker Debugger Server Acceptor").start();
    }

    private void startInternal() {
        boolean handled = false;

        while (!stop) {
            List breakPoints = DebuggerService.getBreakpoints(templateName1);
            for (int i = 0; i < breakPoints.size(); i  ) {
                try {
                    Breakpoint bp = (Breakpoint) breakPoints.get(i);
                    handled = DebuggerService.suspendEnvironment(templateEnv, templateName1, bp.getLine());
                } catch (RemoteException e) {
                    System.err.println(e.getMessage());
                }
            }
        }
    }

    public void stop() {
        this.stop = true;
    }
}

This is the client class:

class DebuggerClientHandler {
    private final Debugger client;
    private boolean stop = false;

    public DebuggerClientHandler(String templateName) throws IOException {
//        System.setProperty("freemarker.debug.password", "hello");
//        System.setProperty("java.rmi.server.hostname", "192.168.2.160");

        client = DebuggerClient.getDebugger(InetAddress.getByName("localhost"), Debugger.DEFAULT_PORT, "hello");
        client.addDebuggerListener(environmentSuspendedEvent -> {
            System.out.println("Break "   environmentSuspendedEvent.getName()   " at line "   environmentSuspendedEvent.getLine());
//            environmentSuspendedEvent.getEnvironment().resume();
        });

    }

    public void start() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                startInternal();
            }
        }, "FreeMarker Debugger Server").start();
    }

    private void startInternal() {
        while (!stop) {
        }
    }

    public void stop() {
        this.stop = true;
    }

    public void addBreakPoint(String s, int i) throws RemoteException {
        Breakpoint bp = new Breakpoint(s, i);
        List breakpoints = client.getBreakpoints();
        client.addBreakpoint(bp);
    }
}

CodePudding user response:

Liferay IDE (https://github.com/liferay/liferay-ide) has FreeMarker template debug support (https://issues.liferay.com/browse/IDE-976), so somehow they managed to use it. I have never seen it in action though. Other than that, I'm not aware of anything that uses the debug API.

CodePudding user response:

Maybe the developers of freemarker have a example project on how to use the debugger api in the correct way.

  •  Tags:  
  • Related