You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2016/07/16 18:05:19 UTC

tomee git commit: TOMEE-1870 avoid to scan when scan.xml gives all the info we need

Repository: tomee
Updated Branches:
  refs/heads/master 4e94dc8ae -> 1adec5221


TOMEE-1870 avoid to scan when scan.xml gives all the info we need


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/1adec522
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/1adec522
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/1adec522

Branch: refs/heads/master
Commit: 1adec5221c960b9447eb7d8d8666d234efffe225
Parents: 4e94dc8
Author: Romain manni-Bucau <rm...@gmail.com>
Authored: Sat Jul 16 20:04:50 2016 +0200
Committer: Romain manni-Bucau <rm...@gmail.com>
Committed: Sat Jul 16 20:04:50 2016 +0200

----------------------------------------------------------------------
 .../org/apache/openejb/config/ScanUtil.java     |  8 +++
 .../openejb/config/WebappAggregatedArchive.java | 32 ++++++++++-
 .../config/WebappAggregatedArchiveTest.java     | 58 ++++++++++++++++++++
 .../resources/WebappAggregatedArchiveTest.xml   | 23 ++++++++
 4 files changed, 118 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/1adec522/container/openejb-core/src/main/java/org/apache/openejb/config/ScanUtil.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/ScanUtil.java b/container/openejb-core/src/main/java/org/apache/openejb/config/ScanUtil.java
index 7a0d452..244f09d 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/config/ScanUtil.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/config/ScanUtil.java
@@ -49,6 +49,7 @@ public final class ScanUtil {
         private final Set<String> classes = new HashSet<String>();
         private final Set<String> packages = new HashSet<String>();
         private Set<String> current;
+        private boolean optimized = true;
 
         @Override
         public void startElement(final String uri, final String localName, final String qName, final Attributes attributes) throws SAXException {
@@ -56,6 +57,9 @@ public final class ScanUtil {
                 current = classes;
             } else if (qName.equals("package")) {
                 current = packages;
+            } else if (qName.equals("scan")) {
+                final String optimized = attributes.getValue("optimized");
+                this.optimized = optimized == null || Boolean.parseBoolean(optimized);
             }
         }
 
@@ -71,6 +75,10 @@ public final class ScanUtil {
             current = null;
         }
 
+        public boolean isOptimized() {
+            return optimized;
+        }
+
         public Set<String> getPackages() {
             return packages;
         }

http://git-wip-us.apache.org/repos/asf/tomee/blob/1adec522/container/openejb-core/src/main/java/org/apache/openejb/config/WebappAggregatedArchive.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/WebappAggregatedArchive.java b/container/openejb-core/src/main/java/org/apache/openejb/config/WebappAggregatedArchive.java
index 047270a..54d8dc2 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/config/WebappAggregatedArchive.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/config/WebappAggregatedArchive.java
@@ -18,6 +18,7 @@
 package org.apache.openejb.config;
 
 import org.apache.xbean.finder.archive.Archive;
+import org.apache.xbean.finder.archive.ClassesArchive;
 import org.apache.xbean.finder.archive.CompositeArchive;
 import org.apache.xbean.finder.archive.FilteredArchive;
 import org.apache.xbean.finder.filter.Filter;
@@ -26,18 +27,20 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import static java.util.Collections.singletonList;
+import static org.apache.openejb.loader.JarLocation.jarLocation;
+
 public class WebappAggregatedArchive implements Archive, ScanConstants {
     private final Map<URL, List<String>> map = new HashMap<URL, List<String>>();
     private ScanUtil.ScanHandler handler;
     private boolean scanXmlExists; // faster than using an empty handler
-    private final Archive archive;
+    private Archive archive;
 
     public WebappAggregatedArchive(final Module module, final Iterable<URL> urls, final Filter filter) {
         final List<Archive> archives = new ArrayList<Archive>();
@@ -47,6 +50,28 @@ public class WebappAggregatedArchive implements Archive, ScanConstants {
             try {
                 handler = ScanUtil.read(scanXml);
                 scanXmlExists = true;
+                if ((handler.getPackages() == null || handler.getPackages().isEmpty())
+                        && handler.getClasses() != null && !handler.getClasses().isEmpty()
+                        && handler.isOptimized()) { // only classes, skip scanning
+                    final Collection<Class<?>> loaded = new ArrayList<>(handler.getClasses().size());
+                    for (final String clazz : handler.getClasses()) {
+                        try {
+                            final Class<?> aClass = module.getClassLoader().loadClass(clazz);
+                            loaded.add(aClass);
+                            final URL jar = jarLocation(aClass).toURI().toURL();
+                            List<String> list = map.get(jar);
+                            if (list == null) {
+                                list = new ArrayList<>();
+                                map.put(jar, list);
+                            }
+                            list.add(clazz);
+                        } catch (final ClassNotFoundException e) {
+                            throw new IllegalArgumentException(e);
+                        }
+                    }
+                    archive = new ClassesArchive(loaded.toArray(new Class[loaded.size()]));
+                    return;
+                }
             } catch (final IOException e) {
                 // ignored, will not use filtering with scan.xml
             }
@@ -55,7 +80,8 @@ public class WebappAggregatedArchive implements Archive, ScanConstants {
         for (final URL url : urls) {
             final List<String> classes = new ArrayList<String>();
             final Archive archive = new FilteredArchive(
-                    new ConfigurableClasspathArchive(module.getClassLoader(), Arrays.asList(url)), new ScanXmlSaverFilter(scanXmlExists, handler, classes, filter));
+                    new ConfigurableClasspathArchive(module.getClassLoader(), singletonList(url)),
+                    new ScanXmlSaverFilter(scanXmlExists, handler, classes, filter));
             map.put(url, classes);
             archives.add(archive);
         }

http://git-wip-us.apache.org/repos/asf/tomee/blob/1adec522/container/openejb-core/src/test/java/org/apache/openejb/config/WebappAggregatedArchiveTest.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/test/java/org/apache/openejb/config/WebappAggregatedArchiveTest.java b/container/openejb-core/src/test/java/org/apache/openejb/config/WebappAggregatedArchiveTest.java
new file mode 100644
index 0000000..4f4596f
--- /dev/null
+++ b/container/openejb-core/src/test/java/org/apache/openejb/config/WebappAggregatedArchiveTest.java
@@ -0,0 +1,58 @@
+/*
+ * 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.openejb.config;
+
+import org.junit.Test;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.singletonMap;
+import static org.apache.openejb.loader.JarLocation.jarLocation;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class WebappAggregatedArchiveTest {
+    @Test
+    public void allClassesDefined() throws MalformedURLException {
+        final WebappAggregatedArchive aggregatedArchive = new WebappAggregatedArchive(
+                new Module(false) {
+                    @Override
+                    public ClassLoader getClassLoader() {
+                        return Thread.currentThread().getContextClassLoader();
+                    }
+
+                    @Override
+                    public Map<String, Object> getAltDDs() {
+                        return Map.class.cast(
+                                singletonMap("scan.xml", Thread.currentThread().getContextClassLoader().getResource("WebappAggregatedArchiveTest.xml")));
+                    }
+                },
+                asList(jarLocation(WebappAggregatedArchive.class).toURI().toURL(),
+                        jarLocation(WebappAggregatedArchiveTest.class).toURI().toURL()));
+        assertEquals(1, aggregatedArchive.getClassesMap().size());
+
+        final URL key = jarLocation(WebappAggregatedArchiveTest.class).toURI().toURL();
+        final List<String> classes = aggregatedArchive.getClassesMap().get(key);
+        assertNotNull(classes);
+        assertEquals(1, classes.size());
+        assertEquals(WebappAggregatedArchiveTest.class.getName(), classes.iterator().next());
+    }
+}

http://git-wip-us.apache.org/repos/asf/tomee/blob/1adec522/container/openejb-core/src/test/resources/WebappAggregatedArchiveTest.xml
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/test/resources/WebappAggregatedArchiveTest.xml b/container/openejb-core/src/test/resources/WebappAggregatedArchiveTest.xml
new file mode 100644
index 0000000..f237d8f
--- /dev/null
+++ b/container/openejb-core/src/test/resources/WebappAggregatedArchiveTest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+
+    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.
+-->
+<scan>
+  <classes>
+    <class>org.apache.openejb.config.WebappAggregatedArchiveTest</class>
+  </classes>
+</scan>