You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by dd...@apache.org on 2017/03/01 18:39:08 UTC

[4/5] incubator-freemarker git commit: Moved debug feature into a single package.

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/6939fd07/src/main/java/org/apache/freemarker/core/debug/impl/RmiDebuggerListenerImpl.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/freemarker/core/debug/impl/RmiDebuggerListenerImpl.java b/src/main/java/org/apache/freemarker/core/debug/impl/RmiDebuggerListenerImpl.java
deleted file mode 100644
index 4d7b8a7..0000000
--- a/src/main/java/org/apache/freemarker/core/debug/impl/RmiDebuggerListenerImpl.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.freemarker.core.debug.impl;
-
-import java.rmi.NoSuchObjectException;
-import java.rmi.RemoteException;
-import java.rmi.server.UnicastRemoteObject;
-import java.rmi.server.Unreferenced;
-
-import org.apache.freemarker.core._CoreLogs;
-import org.apache.freemarker.core.debug.DebuggerClient;
-import org.apache.freemarker.core.debug.DebuggerListener;
-import org.apache.freemarker.core.debug.EnvironmentSuspendedEvent;
-import org.slf4j.Logger;
-
-/**
- * Used by the {@link DebuggerClient} to create local 
- */
-public class RmiDebuggerListenerImpl
-extends
-    UnicastRemoteObject
-implements
-    DebuggerListener, Unreferenced {
-    
-    private static final Logger LOG = _CoreLogs.DEBUG_CLIENT;
-    
-    private static final long serialVersionUID = 1L;
-
-    private final DebuggerListener listener;
-
-    @Override
-    public void unreferenced() {
-        try {
-            UnicastRemoteObject.unexportObject(this, false);
-        } catch (NoSuchObjectException e) {
-            LOG.warn("Failed to unexport RMI debugger listener", e);
-        }
-    }
-    
-    public RmiDebuggerListenerImpl(DebuggerListener listener) 
-    throws RemoteException {
-        this.listener = listener;
-    }
-
-    @Override
-    public void environmentSuspended(EnvironmentSuspendedEvent e) 
-    throws RemoteException {
-        listener.environmentSuspended(e);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/6939fd07/src/main/java/org/apache/freemarker/core/debug/impl/RmiDebuggerService.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/freemarker/core/debug/impl/RmiDebuggerService.java b/src/main/java/org/apache/freemarker/core/debug/impl/RmiDebuggerService.java
deleted file mode 100644
index 555fc4e..0000000
--- a/src/main/java/org/apache/freemarker/core/debug/impl/RmiDebuggerService.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.freemarker.core.debug.impl;
-
-import java.io.Serializable;
-import java.lang.ref.ReferenceQueue;
-import java.lang.ref.WeakReference;
-import java.rmi.RemoteException;
-import java.rmi.server.RemoteObject;
-import java.rmi.server.UnicastRemoteObject;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.freemarker.core.Environment;
-import org.apache.freemarker.core.Template;
-import org.apache.freemarker.core._Debug;
-import org.apache.freemarker.core.debug.Breakpoint;
-import org.apache.freemarker.core.debug.DebuggerListener;
-import org.apache.freemarker.core.debug.EnvironmentSuspendedEvent;
-import org.apache.freemarker.core.util.UndeclaredThrowableException;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-
-/**
- * @version $Id
- */
-class RmiDebuggerService
-extends
-    DebuggerService {
-    private final Map templateDebugInfos = new HashMap();
-    private final HashSet suspendedEnvironments = new HashSet();
-    private final Map listeners = new HashMap();
-    private final ReferenceQueue refQueue = new ReferenceQueue();
-     
-
-    private final RmiDebuggerImpl debugger;
-    private DebuggerServer server;
-
-    RmiDebuggerService() {
-        try {
-            debugger = new RmiDebuggerImpl(this);
-            server = new DebuggerServer((Serializable) RemoteObject.toStub(debugger));
-            server.start();
-        } catch (RemoteException e) {
-            e.printStackTrace();
-            throw new UndeclaredThrowableException(e);
-        }
-    }
-    
-    @Override
-    List getBreakpointsSpi(String templateName) {
-        synchronized (templateDebugInfos) {
-            TemplateDebugInfo tdi = findTemplateDebugInfo(templateName);
-            return tdi == null ? Collections.EMPTY_LIST : tdi.breakpoints;
-        }
-    }
-
-    List getBreakpointsSpi() {
-        List sumlist = new ArrayList();
-        synchronized (templateDebugInfos) {
-            for (Iterator iter = templateDebugInfos.values().iterator(); iter.hasNext(); ) {
-                sumlist.addAll(((TemplateDebugInfo) iter.next()).breakpoints);
-            }
-        }
-        Collections.sort(sumlist);
-        return sumlist;
-    }
-
-    // TODO See in SuppressFBWarnings
-    @Override
-    @SuppressFBWarnings(value={ "UW_UNCOND_WAIT", "WA_NOT_IN_LOOP" }, justification="Will have to be re-desigend; postponed.")
-    boolean suspendEnvironmentSpi(Environment env, String templateName, int line)
-    throws RemoteException {
-        RmiDebuggedEnvironmentImpl denv = 
-            (RmiDebuggedEnvironmentImpl)
-                RmiDebuggedEnvironmentImpl.getCachedWrapperFor(env);
-                
-        synchronized (suspendedEnvironments) {
-            suspendedEnvironments.add(denv);
-        }
-        try {
-            EnvironmentSuspendedEvent breakpointEvent = 
-                new EnvironmentSuspendedEvent(this, templateName, line, denv);
-    
-            synchronized (listeners) {
-                for (Iterator iter = listeners.values().iterator(); iter.hasNext(); ) {
-                    DebuggerListener listener = (DebuggerListener) iter.next();
-                    listener.environmentSuspended(breakpointEvent);
-                }
-            }
-            synchronized (denv) {
-                try {
-                    denv.wait();
-                } catch (InterruptedException e) {
-                    // Intentionally ignored
-                }
-            }
-            return denv.isStopped();
-        } finally {
-            synchronized (suspendedEnvironments) {
-                suspendedEnvironments.remove(denv);
-            }
-        }
-    }
-    
-    @Override
-    void registerTemplateSpi(Template template) {
-        String templateName = template.getName();
-        synchronized (templateDebugInfos) {
-            TemplateDebugInfo tdi = createTemplateDebugInfo(templateName);
-            tdi.templates.add(new TemplateReference(templateName, template, refQueue));
-            // Inject already defined breakpoints into the template
-            for (Iterator iter = tdi.breakpoints.iterator(); iter.hasNext(); ) {
-                Breakpoint breakpoint = (Breakpoint) iter.next();
-                _Debug.insertDebugBreak(template, breakpoint.getLine());
-            }
-        }
-    }
-    
-    Collection getSuspendedEnvironments() {
-        return (Collection) suspendedEnvironments.clone();
-    }
-
-    Object addDebuggerListener(DebuggerListener listener) {
-        Object id; 
-        synchronized (listeners) {
-            id = Long.valueOf(System.currentTimeMillis());
-            listeners.put(id, listener);
-        }
-        return id;
-    }
-    
-    void removeDebuggerListener(Object id) {
-        synchronized (listeners) {
-            listeners.remove(id);
-        }
-    }
-
-    void addBreakpoint(Breakpoint breakpoint) {
-        String templateName = breakpoint.getTemplateName();
-        synchronized (templateDebugInfos) {
-            TemplateDebugInfo tdi = createTemplateDebugInfo(templateName);
-            List breakpoints = tdi.breakpoints;
-            int pos = Collections.binarySearch(breakpoints, breakpoint);
-            if (pos < 0) {
-                // Add to the list of breakpoints
-                breakpoints.add(-pos - 1, breakpoint);
-                // Inject the breakpoint into all templates with this name
-                for (Iterator iter = tdi.templates.iterator(); iter.hasNext(); ) {
-                    TemplateReference ref = (TemplateReference) iter.next();
-                    Template t = ref.getTemplate();
-                    if (t == null) {
-                        iter.remove();
-                    } else {
-                        _Debug.insertDebugBreak(t, breakpoint.getLine());
-                    }
-                }
-            }
-        }
-    }
-
-    private TemplateDebugInfo findTemplateDebugInfo(String templateName) {
-        processRefQueue();
-        return (TemplateDebugInfo) templateDebugInfos.get(templateName); 
-    }
-    
-    private TemplateDebugInfo createTemplateDebugInfo(String templateName) {
-        TemplateDebugInfo tdi = findTemplateDebugInfo(templateName);
-        if (tdi == null) {
-            tdi = new TemplateDebugInfo();
-            templateDebugInfos.put(templateName, tdi);
-        }
-        return tdi;
-    }
-    
-    void removeBreakpoint(Breakpoint breakpoint) {
-        String templateName = breakpoint.getTemplateName();
-        synchronized (templateDebugInfos) {
-            TemplateDebugInfo tdi = findTemplateDebugInfo(templateName);
-            if (tdi != null) {
-                List breakpoints = tdi.breakpoints;
-                int pos = Collections.binarySearch(breakpoints, breakpoint);
-                if (pos >= 0) { 
-                    breakpoints.remove(pos);
-                    for (Iterator iter = tdi.templates.iterator(); iter.hasNext(); ) {
-                        TemplateReference ref = (TemplateReference) iter.next();
-                        Template t = ref.getTemplate();
-                        if (t == null) {
-                            iter.remove();
-                        } else {
-                            _Debug.removeDebugBreak(t, breakpoint.getLine());
-                        }
-                    }
-                }
-                if (tdi.isEmpty()) {
-                    templateDebugInfos.remove(templateName);
-                }
-            }
-        }
-    }
-
-    void removeBreakpoints(String templateName) {
-        synchronized (templateDebugInfos) {
-            TemplateDebugInfo tdi = findTemplateDebugInfo(templateName);
-            if (tdi != null) {
-                removeBreakpoints(tdi);
-                if (tdi.isEmpty()) {
-                    templateDebugInfos.remove(templateName);
-                }
-            }
-        }
-    }
-
-    void removeBreakpoints() {
-        synchronized (templateDebugInfos) {
-            for (Iterator iter = templateDebugInfos.values().iterator(); iter.hasNext(); ) {
-                TemplateDebugInfo tdi = (TemplateDebugInfo) iter.next(); 
-                removeBreakpoints(tdi);
-                if (tdi.isEmpty()) {
-                    iter.remove();
-                }
-            }
-        }
-    }
-
-    private void removeBreakpoints(TemplateDebugInfo tdi) {
-        tdi.breakpoints.clear();
-        for (Iterator iter = tdi.templates.iterator(); iter.hasNext(); ) {
-            TemplateReference ref = (TemplateReference) iter.next();
-            Template t = ref.getTemplate();
-            if (t == null) {
-                iter.remove();
-            } else {
-                _Debug.removeDebugBreaks(t);
-            }
-        }
-    }
-
-    private static final class TemplateDebugInfo {
-        final List templates = new ArrayList();
-        final List breakpoints = new ArrayList();
-        
-        boolean isEmpty() {
-            return templates.isEmpty() && breakpoints.isEmpty();
-        }
-    }
-    
-    private static final class TemplateReference extends WeakReference {
-        final String templateName;
-         
-        TemplateReference(String templateName, Template template, ReferenceQueue queue) {
-            super(template, queue);
-            this.templateName = templateName;
-        }
-        
-        Template getTemplate() {
-            return (Template) get();
-        }
-    }
-    
-    private void processRefQueue() {
-        for (; ; ) {
-            TemplateReference ref = (TemplateReference) refQueue.poll();
-            if (ref == null) {
-                break;
-            }
-            TemplateDebugInfo tdi = findTemplateDebugInfo(ref.templateName);
-            if (tdi != null) {
-                tdi.templates.remove(ref);
-                if (tdi.isEmpty()) {
-                    templateDebugInfos.remove(ref.templateName);
-                }
-            }
-        }
-    }
-
-    @Override
-    void shutdownSpi() {
-        server.stop();
-        try {
-            UnicastRemoteObject.unexportObject(debugger, true);
-        } catch (Exception e) {
-        }
-
-        RmiDebuggedEnvironmentImpl.cleanup();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/6939fd07/src/main/java/org/apache/freemarker/core/debug/impl/SoftCache.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/freemarker/core/debug/impl/SoftCache.java b/src/main/java/org/apache/freemarker/core/debug/impl/SoftCache.java
deleted file mode 100644
index bbc1423..0000000
--- a/src/main/java/org/apache/freemarker/core/debug/impl/SoftCache.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.freemarker.core.debug.impl;
-
-import java.lang.ref.Reference;
-import java.lang.ref.ReferenceQueue;
-import java.lang.ref.SoftReference;
-import java.util.Map;
-
-class SoftCache {
-    
-    private final ReferenceQueue queue = new ReferenceQueue();
-    private final Map map;
-    
-    public SoftCache(Map backingMap) {
-        map = backingMap;
-    }
-    
-    public Object get(Object key) {
-        processQueue();
-        Reference ref = (Reference) map.get(key);
-        return ref == null ? null : ref.get();
-    }
-
-    public void put(Object key, Object value) {
-        processQueue();
-        map.put(key, new SoftValueReference(key, value, queue));
-    }
-
-    public void remove(Object key) {
-        processQueue();
-        map.remove(key);
-    }
-
-    public void clear() {
-        map.clear();
-        processQueue();
-    }
-    
-    /**
-     * Returns a close approximation of the number of cache entries.
-     */
-    public int getSize() {
-        processQueue();
-        return map.size();
-    }
-
-    private void processQueue() {
-        for (; ; ) {
-            SoftValueReference ref = (SoftValueReference) queue.poll();
-            if (ref == null) {
-                return;
-            }
-            Object key = ref.getKey();
-            map.remove(key);
-        }
-    }
-
-    private static final class SoftValueReference extends SoftReference {
-        private final Object key;
-
-        SoftValueReference(Object key, Object value, ReferenceQueue queue) {
-            super(value, queue);
-            this.key = key;
-        }
-
-        Object getKey() {
-            return key;
-        }
-    }
-    
-}
\ No newline at end of file