Example usage for org.apache.commons.jci.listeners CompilingListener CompilingListener

List of usage examples for org.apache.commons.jci.listeners CompilingListener CompilingListener

Introduction

In this page you can find the example usage for org.apache.commons.jci.listeners CompilingListener CompilingListener.

Prototype

public CompilingListener(final JavaCompiler pCompiler, final TransactionalResourceStore pTransactionalStore) 

Source Link

Usage

From source file:org.apache.commons.jci.examples.serverpages.ServerPageServlet.java

public void init() throws ServletException {
    super.init();

    final File serverpagesDir = new File(
            getServletContext().getRealPath("/") + getInitParameter("serverpagesDir"));

    log("Monitoring serverpages in " + serverpagesDir);

    final TransactionalResourceStore store = new TransactionalResourceStore(new MemoryResourceStore()) {

        private Set<String> newClasses;
        private Map<String, HttpServlet> newServletsByClassname;

        public void onStart() {
            super.onStart();

            newClasses = new HashSet<String>();
            newServletsByClassname = new HashMap<String, HttpServlet>(servletsByClassname);
        }/*from  w w  w.j av a  2 s.  co m*/

        public void onStop() {
            super.onStop();

            boolean reload = false;
            for (String clazzName : newClasses) {
                try {
                    final Class clazz = classloader.loadClass(clazzName);

                    if (!HttpServlet.class.isAssignableFrom(clazz)) {
                        log(clazzName + " is not a servlet");
                        continue;
                    }

                    // create new instance of jsp page
                    final HttpServlet servlet = (HttpServlet) clazz.newInstance();
                    newServletsByClassname.put(clazzName, servlet);

                    reload = true;
                } catch (Exception e) {
                    log("", e);
                }
            }

            if (reload) {
                log("Activating new map of servlets " + newServletsByClassname);
                servletsByClassname = newServletsByClassname;
            }
        }

        public void write(String pResourceName, byte[] pResourceData) {
            super.write(pResourceName, pResourceData);

            if (pResourceName.endsWith(".class")) {

                // compiler writes a new class, remember the classes to reload
                newClasses.add(pResourceName.replace('/', '.').substring(0,
                        pResourceName.length() - ".class".length()));
            }
        }

    };

    // listener that generates the java code from the jsp page and provides that to the compiler
    jspListener = new CompilingListener(new JavaCompilerFactory().createCompiler("eclipse"), store) {

        private final JspGenerator transformer = new JspGenerator();
        private final Map<String, byte[]> sources = new HashMap<String, byte[]>();
        private final Set<String> resourceToCompile = new HashSet<String>();

        public void onStart(FilesystemAlterationObserver pObserver) {
            super.onStart(pObserver);

            resourceToCompile.clear();
        }

        public void onFileChange(File pFile) {
            if (pFile.getName().endsWith(".jsp")) {
                final String resourceName = ConversionUtils
                        .stripExtension(getSourceNameFromFile(observer, pFile)) + ".java";

                log("Updating " + resourceName);

                sources.put(resourceName, transformer.generateJavaSource(resourceName, pFile));

                resourceToCompile.add(resourceName);
            }
            super.onFileChange(pFile);
        }

        public void onFileCreate(File pFile) {
            if (pFile.getName().endsWith(".jsp")) {
                final String resourceName = ConversionUtils
                        .stripExtension(getSourceNameFromFile(observer, pFile)) + ".java";

                log("Creating " + resourceName);

                sources.put(resourceName, transformer.generateJavaSource(resourceName, pFile));

                resourceToCompile.add(resourceName);
            }
            super.onFileCreate(pFile);
        }

        public String[] getResourcesToCompile(FilesystemAlterationObserver pObserver) {
            // we only want to compile the jsp pages
            final String[] resourceNames = new String[resourceToCompile.size()];
            resourceToCompile.toArray(resourceNames);
            return resourceNames;
        }

        public ResourceReader getReader(final FilesystemAlterationObserver pObserver) {
            return new JspReader(sources, super.getReader(pObserver));
        }
    };
    jspListener.addReloadNotificationListener(classloader);

    fam = new FilesystemAlterationMonitor();
    fam.addListener(serverpagesDir, jspListener);
    fam.start();
}