Author: markt
Date: Wed Jul 3 11:55:56 2013
New Revision: 1499341
URL: http://svn.apache.org/r1499341
Log:
EL 3.0
Implement new class
Added:
tomcat/trunk/java/javax/el/ImportHandler.java (with props)
Added: tomcat/trunk/java/javax/el/ImportHandler.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/javax/el/ImportHandler.java?rev=1499341&view=auto
==============================================================================
--- tomcat/trunk/java/javax/el/ImportHandler.java (added)
+++ tomcat/trunk/java/javax/el/ImportHandler.java Wed Jul 3 11:55:56 2013
@@ -0,0 +1,173 @@
+/*
+ * 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 javax.el;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @since EL 3.0
+ */
+public class ImportHandler {
+
+ private List<String> packages = new ArrayList<>();
+ private Map<String,Class<?>> clazzes = new HashMap<>();
+ private Map<String,Class<?>> statics = new HashMap<>();
+
+
+ public ImportHandler() {
+ importPackage("java.lang");
+ }
+
+
+ public void importStatic(String name) throws javax.el.ELException {
+ int lastPeriod = name.lastIndexOf('.');
+
+ if (lastPeriod < 0) {
+ throw new ELException(ELResolver.message(
+ null, "importHandler.invalidStaticName", name));
+ }
+
+ String className = name.substring(0, lastPeriod - 1);
+ String fieldOrMethodName = name.substring(lastPeriod + 1);
+
+ Class<?> clazz = findClass(className);
+
+ if (clazz == null) {
+ throw new ELException(ELResolver.message(
+ null, "importHandler.invalidClassNameForStatic",
+ className, name));
+ }
+
+ boolean found = false;
+
+ for (Field field : clazz.getFields()) {
+ if (field.getName().equals(fieldOrMethodName)) {
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) {
+ for (Method method : clazz.getMethods()) {
+ if (method.getName().equals(fieldOrMethodName)) {
+ found = true;
+ break;
+ }
+ }
+ }
+
+ if (!found) {
+ throw new ELException(ELResolver.message(null,
+ "importHandler.staticNotFound", fieldOrMethodName,
+ className, name));
+ }
+
+ Class<?> conflict = statics.get(fieldOrMethodName);
+ if (conflict != null) {
+ throw new ELException(ELResolver.message(null,
+ "importHandler.ambiguousStaticImport", name,
+ conflict.getName() + '.' + fieldOrMethodName));
+ }
+
+ statics.put(fieldOrMethodName, clazz);
+ }
+
+
+ public void importClass(String name) throws javax.el.ELException {
+ if (!name.contains(".")) {
+ throw new ELException(ELResolver.message(
+ null, "importHandler.invalidClassName", name));
+ }
+
+ Class<?> clazz = findClass(name);
+
+ if (clazz == null) {
+ throw new ELException(ELResolver.message(
+ null, "importHandler.classNotFound", name));
+ }
+ }
+
+
+ public void importPackage(String name) {
+ // Import ambiguity is handled at resolution, not at import
+ Package p = Package.getPackage(name);
+ if (p == null) {
+ throw new IllegalArgumentException(ELResolver.message(
+ null, "importHandler.invalidPackage", name));
+ }
+ packages.add(name);
+ }
+
+
+ public java.lang.Class<?> resolveClass(String name) {
+ Class<?> result = clazzes.get(name);
+
+ if (result == null) {
+ // Search the package imports
+ for (String p : packages) {
+ String className = p + '.' + name;
+ result = findClass(className);
+ if (result != null) {
+ break;
+ }
+ }
+ }
+
+ return result;
+ }
+
+
+ public java.lang.Class<?> resolveStatic(String name) {
+ return statics.get(name);
+ }
+
+
+ private Class<?> findClass(String name) {
+ Class<?> clazz;
+ try {
+ clazz = Class.forName(name);
+ } catch (ClassNotFoundException e) {
+ return null;
+ }
+
+ // Class must be public, non-abstract and not an interface
+ int modifiers = clazz.getModifiers();
+ if (!Modifier.isPublic(modifiers) || Modifier.isAbstract(modifiers) ||
+ Modifier.isInterface(modifiers)) {
+ throw new ELException(ELResolver.message(
+ null, "importHandler.invalidClass", name));
+ }
+
+ String simpleName = clazz.getSimpleName();
+ Class<?> conflict = clazzes.get(simpleName);
+
+ if (conflict != null) {
+ throw new ELException(ELResolver.message(null,
+ "importHandler.ambiguousImport", name,
conflict.getName()));
+ }
+
+ clazzes.put(simpleName, clazz);
+
+ return clazz;
+ }
+}
Propchange: tomcat/trunk/java/javax/el/ImportHandler.java
------------------------------------------------------------------------------
svn:eol-style = native
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]