myfaces-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From we...@apache.org
Subject svn commit: r905384 - in /myfaces/extensions/scripting/trunk: core/core/src/main/java/org/apache/myfaces/scripting/api/ core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/ examples/myfaces20-example/src/main/webapp/WEB-INF/facelets/
Date Mon, 01 Feb 2010 19:30:27 GMT
Author: werpu
Date: Mon Feb  1 19:30:26 2010
New Revision: 905384

URL: http://svn.apache.org/viewvc?rev=905384&view=rev
Log:
preparations for checkin

Added:
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/MyFacesBeanHandler.java   (with props)
    myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/
    myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/DynamicClassloader.java   (with props)
    myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/JavaDynamicClassIdentifierTest.java   (with props)
    myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/Probe1.java   (with props)
    myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/Probe2.java   (with props)
    myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/TWeavingContext.java   (with props)
    myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/facelets/groovy-taglib.xml   (with props)
    myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/facelets/tomahawk.taglib.xml   (with props)

Added: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/MyFacesBeanHandler.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/MyFacesBeanHandler.java?rev=905384&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/MyFacesBeanHandler.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/MyFacesBeanHandler.java Mon Feb  1 19:30:26 2010
@@ -0,0 +1,404 @@
+package org.apache.myfaces.scripting.api;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.myfaces.config.RuntimeConfig;
+import org.apache.myfaces.config.element.ListEntries;
+import org.apache.myfaces.config.element.ManagedBean;
+import org.apache.myfaces.config.element.MapEntries;
+import org.apache.myfaces.config.impl.digester.elements.ManagedProperty;
+import org.apache.myfaces.scripting.core.util.ReflectUtil;
+import org.apache.myfaces.scripting.core.util.WeavingContext;
+import org.apache.myfaces.scripting.refresh.RefreshContext;
+import org.apache.myfaces.scripting.refresh.ReloadingMetadata;
+
+import javax.faces.context.FacesContext;
+import java.util.*;
+
+/**
+ * Bean handler implementation
+ * which encapsulates the myfaces specific parts
+ * of the bean processing
+ */
+public class MyFacesBeanHandler implements BeanHandler {
+
+    /**
+     * scripting engine for this bean handler
+     */
+    int _scriptingEngine;
+
+    /**
+     * constructor
+     *
+     * @param scriptingEngine the scripting engine the bean handler
+     *                        currently has to attach to for its
+     *                        operations
+     */
+    public MyFacesBeanHandler(int scriptingEngine) {
+        this._scriptingEngine = scriptingEngine;
+    }
+
+    /**
+     * scans all bean dependencies according to
+     * their IoC information stored by the runtime
+     * (in our case the MyFaces runtime confing)
+     * and adds those into our backward referencing dependency map
+     * to add further dependency information on IoC level
+     * (we can have IoC dependencies which are bound by object
+     * types, this is a corner case but it still can happen)
+     */
+    public void scanDependencies() {
+        if(FacesContext.getCurrentInstance() == null) {
+            return;
+        }
+        //TODO make this enabled also if the facesContext is not yet fully active
+        Map<String, ManagedBean> mbeans = RuntimeConfig.getCurrentInstance(FacesContext.getCurrentInstance().getExternalContext()).getManagedBeans();
+        Map<String, ManagedBean> mbeansSnapshotView;
+
+        synchronized (RefreshContext.BEAN_SYNC_MONITOR) {
+            mbeansSnapshotView = makeSnapshot(mbeans);
+        }
+
+        Collection<String> dynamicClasses = WeavingContext.getWeaver().loadPossibleDynamicClasses();
+
+        for (Map.Entry<String, ManagedBean> entry : mbeansSnapshotView.entrySet()) {
+            Object retVal = ReflectUtil.executeMethod(entry.getValue(), "getManagedProperties");
+            Iterator it = null;
+            if(retVal instanceof Collection) {
+                //Myfaces 2.x
+                it = ((Collection)retVal).iterator();
+            } else {
+                //older versions
+                it = (Iterator) retVal;
+            }
+            while (it.hasNext()) {
+                ManagedProperty prop = (ManagedProperty) it.next();
+                String propClass = prop.getPropertyClass();
+                handleObjectDependency(dynamicClasses, entry.getValue().getManagedBeanClassName(), propClass);
+                handleListEntries(dynamicClasses, entry);
+                handleMapEntries(dynamicClasses, entry);
+            }
+        }
+    }
+
+    /**
+     * check managed property maps
+     * for dependencies into other beans
+     *
+     * @param dynamicClasses the set of known dynamic classes
+     * @param entry          the current managed bean descriptor
+     */
+    private void handleMapEntries(Collection<String> dynamicClasses, Map.Entry<String, ManagedBean> entry) {
+        MapEntries entries = entry.getValue().getMapEntries();
+        if (entries != null) {
+            Iterator iter = entries.getMapEntries();
+            while (iter.hasNext()) {
+                Object value = ((Map.Entry) iter.next()).getValue();
+                String valueClass = value.getClass().getName();
+                if (valueClass.startsWith("java.") || valueClass.startsWith("javax.")) {
+                    continue;
+                }
+                handleObjectDependency(dynamicClasses, entry.getValue().getManagedBeanClassName(), valueClass);
+            }
+        }
+    }
+
+    /**
+     * check list entries of the managed bean facility
+     * for dependencies into other beans
+     *
+     * @param dynamicClasses the set of known dynamic classes to build the dependencies upon
+     * @param entry          the current managed bean descriptor
+     */
+    private void handleListEntries(Collection<String> dynamicClasses, Map.Entry<String, ManagedBean> entry) {
+        ListEntries entries = entry.getValue().getListEntries();
+        if (entries != null) {
+            Iterator iter = entries.getListEntries();
+            while (iter.hasNext()) {
+                Object value = iter.next();
+                String valueClass = value.getClass().getName();
+                if (valueClass.startsWith("java.") || valueClass.startsWith("javax.")) {
+                    continue;
+                }
+                handleObjectDependency(dynamicClasses, entry.getValue().getManagedBeanClassName(), valueClass);
+            }
+        }
+    }
+
+    /**
+     * handle an intra bean object to object dependency
+     *
+     * @param dynamicClasses           the collection of known dynamic classes
+     * @param beanClassName            the managed bean class name
+     * @param managedPropertyClassName the class name of the managed property
+     */
+    private void handleObjectDependency(Collection<String> dynamicClasses, String beanClassName, String managedPropertyClassName) {
+        if (dynamicClasses.contains(managedPropertyClassName)) {
+            WeavingContext.getFileChangedDaemon().getDependencyMap().addDependency(beanClassName, managedPropertyClassName);
+        }
+    }
+
+    /**
+     * Refreshes all managed beans
+     * session, and personal scoped ones
+     */
+    public void refreshAllManagedBeans() {
+        if (FacesContext.getCurrentInstance() == null) {
+            return;//no npe allowed
+        }
+
+        Set<String> tainted = getTaintedClasses();
+
+        if (tainted.size() > 0) {
+            //We now have to check if the tainted classes belong to the managed beans
+            Set<String> managedBeanClasses = new HashSet<String>();
+
+            Map<String, ManagedBean> mbeans = RuntimeConfig.getCurrentInstance(FacesContext.getCurrentInstance().getExternalContext()).getManagedBeans();
+            Map<String, ManagedBean> mbeansSnapshotView;
+
+            synchronized (RefreshContext.BEAN_SYNC_MONITOR) {
+                mbeansSnapshotView = makeSnapshot(mbeans);
+            }
+            for (Map.Entry<String, ManagedBean> entry : mbeansSnapshotView.entrySet()) {
+                managedBeanClasses.add(entry.getValue().getManagedBeanClassName());
+            }
+
+            boolean managedBeanTainted = isAnyManagedBeanTainted(tainted, managedBeanClasses);
+            markPersonalScopeRefreshRecommended();
+            getLog().info("[EXT-SCRIPTING] Tainting all beans to avoid classcast exceptions");
+            if (managedBeanTainted) {
+                globalManagedBeanRefresh(mbeansSnapshotView);
+            }
+        }
+    }
+
+    /**
+     * Exposed personal scope refresh
+     */
+    public void personalScopeRefresh() {
+        //shortcut to avoid heavier operations in the beginning
+        long globalBeanRefreshTimeout = WeavingContext.getRefreshContext().getPersonalScopedBeanRefresh();
+        if (globalBeanRefreshTimeout == -1l) return;
+
+        Map sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
+        Long timeOut = (Long) sessionMap.get(ScriptingConst.SESS_BEAN_REFRESH_TIMER);
+        if (timeOut == null || timeOut < globalBeanRefreshTimeout) {
+            refreshPersonalScopedBeans();
+        }
+    }
+
+    /**
+     * removes all bean references which have been tainted
+     * (note for now we remove all dynamic references until we
+     * get a more sophisticated handling of managed beans)
+     *
+     * @param workCopy the managed beam snapshot view
+     */
+    private void globalManagedBeanRefresh(Map<String, ManagedBean> workCopy) {
+        Set<String> tainted = getTaintedClasses();
+
+        for (Map.Entry<String, ManagedBean> entry : workCopy.entrySet()) {
+            Class managedBeanClass = entry.getValue().getManagedBeanClass();
+            if (hasToBeRefreshed(tainted, managedBeanClass)) {
+                //managed bean class found we drop the class from our session
+                removeBeanReferences(entry.getValue());
+            }
+            //one bean tainted we have to taint all dynamic beans otherwise we will get classcast
+            //exceptions
+            /*getLog().info("[EXT-SCRIPTING] Tainting ");
+            ReloadingMetadata metaData = WeavingContext.getFileChangedDaemon().getClassMap().get(managedBeanClass.getName());
+            if (metaData != null) {
+                metaData.setTainted(true);
+            }*/
+        }
+    }
+
+    /**
+     * determines whether any bean in our managed bean list
+     * is tainted or not
+     *
+     * @param tainted            a list of classes which are tainted in this iteration
+     * @param managedBeanClasses a ist of classes which are our managed beans
+     * @return true if one of the beans is tainted
+     */
+    private boolean isAnyManagedBeanTainted(Set<String> tainted, Set<String> managedBeanClasses) {
+        boolean managedBeanTainted = false;
+        for (String taintedClass : tainted) {
+            if (managedBeanClasses.contains(taintedClass)) {
+                managedBeanTainted = true;
+                break;
+            }
+        }
+        return managedBeanTainted;
+    }
+
+    /**
+     * helper which returns all tainted classes
+     *
+     * @return the tainted classes
+     */
+    private Set<String> getTaintedClasses() {
+        Set<String> tainted = new HashSet<String>();
+
+        for (Map.Entry<String, ReloadingMetadata> it : WeavingContext.getFileChangedDaemon().getClassMap().entrySet()) {
+            if (it.getValue().getScriptingEngine() == getScriptingEngine() && it.getValue().isTainted()) {
+                tainted.add(it.getKey());
+            }
+        }
+        return tainted;
+    }
+
+    /**
+     * refreshes all personal scoped beans (aka beans which
+     * have an assumed lifecycle <= session)
+     * <p/>
+     * This is needed for multiuser purposes because if one user alters some beans
+     * other users have to drop their non application scoped beans as well!
+     */
+    private void refreshPersonalScopedBeans() {
+        //the refreshing is only allowed if no compile is in progress
+        //and vice versa
+
+        synchronized (RefreshContext.BEAN_SYNC_MONITOR) {
+            Map<String, ManagedBean> mbeans = RuntimeConfig.getCurrentInstance(FacesContext.getCurrentInstance().getExternalContext()).getManagedBeans();
+            //the map is immutable but in between scanning might change it so we make a full copy of the map
+
+            //We can synchronized the refresh, but if someone alters
+            //the bean map from outside we still get race conditions
+            //But for most cases this mutex should be enough
+            Map<String, ManagedBean> mbeansSnapshotView = makeSnapshot(mbeans);
+            Set<String> tainted = getTaintedClasses();
+            for (Map.Entry<String, ManagedBean> entry : mbeansSnapshotView.entrySet()) {
+
+                Class managedBeanClass = entry.getValue().getManagedBeanClass();
+                if (hasToBeRefreshed(tainted, managedBeanClass)) {
+                    String scope = entry.getValue().getManagedBeanScope();
+
+                    if (scope != null && !scope.equalsIgnoreCase(ScriptingConst.SCOPE_APPLICATION)) {
+                        if (scope.equalsIgnoreCase(ScriptingConst.SCOPE_REQUEST)) {
+                            //request, nothing has to be done here
+                            break;
+                        }
+                        if (scope.equalsIgnoreCase(ScriptingConst.SCOPE_SESSION)) {
+                            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove(entry.getValue().getManagedBeanName());
+                        } else {
+                            removeCustomScopedBean(entry.getValue());
+                        }
+                    }
+                }
+            }
+            updateBeanRefreshTime();
+        }
+    }
+
+    /**
+     * removes the references from out static scope
+     * for jsf2 we probably have some kind of notification mechanism
+     * which notifies custom scopes
+     *
+     * @param bean the managed bean which all references have to be removed from
+     */
+
+    private void removeBeanReferences(ManagedBean bean) {
+        if (getLog().isInfoEnabled()) {
+            getLog().info("[EXT-SCRIPTING] JavaScriptingWeaver.removeBeanReferences(" + bean.getManagedBeanName() + ")");
+        }
+
+        String scope = bean.getManagedBeanScope();
+
+        if (scope != null && scope.equalsIgnoreCase(ScriptingConst.SCOPE_SESSION)) {
+            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove(bean.getManagedBeanName());
+        } else if (scope != null && scope.equalsIgnoreCase(ScriptingConst.SCOPE_APPLICATION)) {
+            FacesContext.getCurrentInstance().getExternalContext().getApplicationMap().remove(bean.getManagedBeanName());
+            //other scope
+        } else if (scope != null && !scope.equals(ScriptingConst.SCOPE_REQUEST)) {
+            removeCustomScopedBean(bean);
+        }
+    }
+
+    /**
+     * @return the log for this class
+     */
+    protected Log getLog() {
+        return LogFactory.getLog(this.getClass());
+    }
+
+    /**
+     * jsf2 helper to remove custom scoped beans
+     *
+     * @param bean the managed bean which has to be removed from the custom scope from
+     */
+    private void removeCustomScopedBean(ManagedBean bean) {
+        Object scopeImpl = FacesContext.getCurrentInstance().getExternalContext().getApplicationMap().get(bean.getManagedBeanScope());
+        if (scopeImpl == null) return; //scope not implemented
+        //we now have to revert to introspection here because scopes are a pure jsf2 construct
+        //so we use a messaging pattern here to cope with it
+
+        ReflectUtil.executeMethod(scopeImpl, "remove", bean.getManagedBeanName());
+    }
+
+    /**
+     * MyFaces 2.0 keeps an immutable map over the session
+     * and request scoped beans
+     * if we alter that during our loop we get a concurrent modification exception
+     * taking a snapshot in time fixes that
+     *
+     * @param mbeans the internal managed bean map which has to be investigated
+     * @return a map with the class name as key and the managed bean info
+     *         as value of the current state of the internal runtime config bean map
+     */
+    private Map<String, ManagedBean> makeSnapshot(Map<String, ManagedBean> mbeans) {
+        Map<String, ManagedBean> workCopy;
+
+        workCopy = new HashMap<String, ManagedBean>(mbeans.size());
+        for (Map.Entry<String, ManagedBean> entry : mbeans.entrySet()) {
+            workCopy.put(entry.getKey(), entry.getValue());
+        }
+
+        return workCopy;
+    }
+
+    /**
+     * updates the internal timer
+     * for our personal scoped beans so that
+     * we dont get updates on beans we have refreshed already
+     */
+    private void updateBeanRefreshTime() {
+        long sessionRefreshTime = System.currentTimeMillis();
+        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(ScriptingConst.SESS_BEAN_REFRESH_TIMER, sessionRefreshTime);
+    }
+
+    /**
+     * sets the internal timer for other processes
+     * to update their beans as well
+     */
+    private void markPersonalScopeRefreshRecommended() {
+        long sessionRefreshTime = System.currentTimeMillis();
+        WeavingContext.getRefreshContext().setPersonalScopedBeanRefresh(sessionRefreshTime);
+        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(ScriptingConst.SESS_BEAN_REFRESH_TIMER, sessionRefreshTime);
+    }
+
+    /**
+     * important, this method determines whether a managed bean class
+     * has to be refreshed or not
+     *
+     * @param managedBeanClass the class to be checked for refresh criteria
+     * @return true if the current bean class fulfills our refresh criteria
+     */
+    protected boolean hasToBeRefreshed(Set<String> tainted, Class managedBeanClass) {
+
+
+
+        return WeavingContext.isDynamic(managedBeanClass) && tainted.contains(managedBeanClass.getName());
+    }
+
+    /**
+     * returns the scripting engine which is attached
+     * to this bean handler
+     *
+     * @return the current scripting engine
+     */
+    private int getScriptingEngine() {
+        return _scriptingEngine;
+    }
+}

Propchange: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/MyFacesBeanHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/MyFacesBeanHandler.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/DynamicClassloader.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/DynamicClassloader.java?rev=905384&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/DynamicClassloader.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/DynamicClassloader.java Mon Feb  1 19:30:26 2010
@@ -0,0 +1,88 @@
+/*
+ * 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.myfaces.scripting.core.classIdentifier;
+
+import org.apache.myfaces.extensions.scripting.loader.support.ThrowAwayClassLoader;
+import org.apache.myfaces.scripting.core.util.ClassUtils;
+import org.apache.myfaces.scripting.loaders.java.JavaThrowAwayClassloader;
+
+import java.io.File;
+import java.io.FileInputStream;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ *          <p/>
+ *          A classloader implementing our throwaway classloader interface
+ *          the new detection algorithm depends on the classloader
+ *          instead of runtime alteration of the classes to attach
+ *          an interface
+ */
+@JavaThrowAwayClassloader
+public class DynamicClassloader extends ClassLoader implements ThrowAwayClassLoader {
+    String _rootPath = "";
+
+    public DynamicClassloader(ClassLoader classLoader, String rootPath) {
+        super(classLoader);
+        _rootPath = rootPath;
+    }
+
+    public Class loadClass(String className, boolean resolve) throws ClassNotFoundException {
+
+        if (className.contains("java.lang")) {
+            return super.loadClass(className, resolve);
+        }
+
+        File classFile = ClassUtils.classNameToFile(_rootPath, className);
+        assertClassfile(className, classFile);
+
+        FileInputStream iStream = null;
+        int fileLength = (int) classFile.length();
+        byte[] fileContent = new byte[fileLength];
+
+        try {
+            iStream = new FileInputStream(classFile);
+            iStream.read(fileContent);
+
+            //we have to do it here because just in case
+            //a dependend class is loaded as well we run into classcast exceptions
+            return super.defineClass(className, fileContent, 0, fileLength);
+
+        } catch (Exception e) {
+            throw new ClassNotFoundException(e.toString());
+        } finally {
+            if (iStream != null) {
+                try {
+                    iStream.close();
+                } catch (Exception e) {
+                }
+            }
+        }
+    }
+
+    private void assertClassfile(String className, File classFile) throws ClassNotFoundException {
+        if (!classFile.exists()) {
+            throw new ClassNotFoundException(className + " not found");
+        }
+    }
+
+    public boolean isOutdated(long lastModified) {
+        return false;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+}

Propchange: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/DynamicClassloader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/DynamicClassloader.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/JavaDynamicClassIdentifierTest.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/JavaDynamicClassIdentifierTest.java?rev=905384&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/JavaDynamicClassIdentifierTest.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/JavaDynamicClassIdentifierTest.java Mon Feb  1 19:30:26 2010
@@ -0,0 +1,73 @@
+/*
+ * 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.myfaces.scripting.core.classIdentifier;
+
+import org.junit.Test;
+import org.junit.Before;
+import org.junit.Ignore;
+
+import static org.junit.Assert.*;
+
+import org.apache.myfaces.scripting.core.CoreWeaver;
+import org.apache.myfaces.scripting.core.util.ClassUtils;
+import org.apache.myfaces.scripting.loaders.java.JavaScriptingWeaver;
+
+import java.io.File;
+import java.net.URL;
+
+
+/**
+ * @author werpu
+ */
+public class JavaDynamicClassIdentifierTest {
+
+    Object probe1 = null;
+    Object probe2 = null;
+    CoreWeaver weaver = null;
+
+    String classPath = "";
+
+    @Before
+    public void setUp() {
+        probe1 = new Probe1();
+        //ClassLoader contextLoader = Thread.currentThread().getContextClassLoader();
+        URL rootPath = this.getClass().getClassLoader().getResource(".");
+
+        DynamicClassloader throwAwayClassloader = new DynamicClassloader(this.getClass().getClassLoader(), rootPath.getPath());
+
+
+        try {
+            probe2 = throwAwayClassloader.loadClass("org.apache.myfaces.scripting.core.classIdentifier.Probe2", false).newInstance();
+        } catch (Throwable e) {
+            fail(e.getMessage());
+        }
+
+        weaver = new CoreWeaver(new JavaScriptingWeaver());
+        TWeavingContext.setWeaverForTesting(weaver);
+    }
+
+
+    @Test
+    public void isDynamic() {
+        assertFalse("Class should be static", TWeavingContext.isDynamic(probe1.getClass()));
+        assertTrue("Class should be dynamic", TWeavingContext.isDynamic(probe2.getClass()));
+    }
+
+
+}

Propchange: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/JavaDynamicClassIdentifierTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/JavaDynamicClassIdentifierTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/Probe1.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/Probe1.java?rev=905384&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/Probe1.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/Probe1.java Mon Feb  1 19:30:26 2010
@@ -0,0 +1,26 @@
+/*
+ * 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.myfaces.scripting.core.classIdentifier;
+
+/**
+ * @author werpu
+ *         probe for our unit test
+ */
+public class Probe1 {
+}

Propchange: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/Probe1.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/Probe1.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/Probe2.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/Probe2.java?rev=905384&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/Probe2.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/Probe2.java Mon Feb  1 19:30:26 2010
@@ -0,0 +1,27 @@
+/*
+ * 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.myfaces.scripting.core.classIdentifier;
+
+import org.apache.myfaces.scripting.loaders.java.ScriptingClass;
+
+/**
+ * @author werpu
+ */
+public class Probe2 {
+}

Propchange: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/Probe2.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/Probe2.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/TWeavingContext.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/TWeavingContext.java?rev=905384&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/TWeavingContext.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/TWeavingContext.java Mon Feb  1 19:30:26 2010
@@ -0,0 +1,40 @@
+/*
+ * 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.myfaces.scripting.core.classIdentifier;
+
+import org.apache.myfaces.scripting.refresh.FileChangedDaemon;
+import org.apache.myfaces.scripting.api.ScriptingWeaver;
+import org.apache.myfaces.scripting.core.util.WeavingContext;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ *          <p/>
+ *          A helper to bypass an app server startup which otherwise would be enforced
+ */
+
+public class TWeavingContext extends WeavingContext {
+    public static void setWeaverForTesting(Object weaver) {
+        _weaverHolder.set(weaver);
+        if (FileChangedDaemon.getInstance().getWeavers() == null) {
+            FileChangedDaemon.getInstance().setWeavers((ScriptingWeaver) weaver);
+        }
+    }
+
+}

Propchange: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/TWeavingContext.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/scripting/core/classIdentifier/TWeavingContext.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/facelets/groovy-taglib.xml
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/facelets/groovy-taglib.xml?rev=905384&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/facelets/groovy-taglib.xml (added)
+++ myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/facelets/groovy-taglib.xml Mon Feb  1 19:30:26 2010
@@ -0,0 +1,61 @@
+<?xml version="1.0"?>
+<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "facelet-taglib_1_0.dtd">
+<facelet-taglib version="2.0">
+    <!-- author: werner.punz@irian.at -->
+
+    <namespace>http://myfaces.apache.org/groovy</namespace>
+    <tag>
+        <tag-name>groovyvalidator</tag-name>
+        <validator>
+            <validator-id>org.apache.myfaces.groovyloader.test.TestValidator</validator-id>
+        </validator>
+    </tag>
+    <tag>
+        <tag-name>groovyconverter</tag-name>
+        <converter>
+            <converter-id>org.apache.myfaces.groovyloader.test.TestConverter</converter-id>
+        </converter>
+    </tag>
+    <tag>
+        <tag-name>testcomponent</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.groovyloader.test.TestComponent</component-type>
+            <renderer-type>org.apache.myfaces.groovyloader.test.Test</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>compilerOutput</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.extensions.scripting.components.CompilerComponent</component-type>
+            <renderer-type>org.apache.myfaces.extensions.scripting.components.CompilerComponentRenderer</renderer-type>
+        </component>
+    </tag>
+
+    <tag>
+        <tag-name>testcomponent2</tag-name>
+        <component>
+            <component-type>at.irian.JavaTestComponent</component-type>
+            <renderer-type>at.irian.JavaTestRenderer</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>testcomponent3</tag-name>
+        <component>
+            <component-type>at.irian.JavaTestComponent</component-type>
+            <renderer-type>at.irian.JavaTestRenderer</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>testValidator1</tag-name>
+        <validator>
+            <validator-id>at.irian.CustomValidator</validator-id>
+        </validator>
+    </tag>
+    <tag>
+        <tag-name>testConverter1</tag-name>
+        <converter>
+            <converter-id>at.irian.CustomConverter</converter-id>
+        </converter>
+    </tag>
+
+</facelet-taglib>

Propchange: myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/facelets/groovy-taglib.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/facelets/groovy-taglib.xml
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/facelets/tomahawk.taglib.xml
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/facelets/tomahawk.taglib.xml?rev=905384&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/facelets/tomahawk.taglib.xml (added)
+++ myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/facelets/tomahawk.taglib.xml Mon Feb  1 19:30:26 2010
@@ -0,0 +1,458 @@
+<?xml version="1.0"?>
+<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "facelet-taglib_1_0.dtd">
+<facelet-taglib>
+    <!-- author: thomas.jachmann@mindmatters.de -->
+    <namespace>http://myfaces.apache.org/tomahawk</namespace>
+    <tag>
+        <tag-name>commandButton</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlCommandButton</component-type>
+            <renderer-type>org.apache.myfaces.Button</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>commandLink</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlCommandLink</component-type>
+            <renderer-type>org.apache.myfaces.Link</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>dataTable</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlDataTable</component-type>
+            <renderer-type>org.apache.myfaces.Table</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>inputHidden</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlInputHidden</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>inputSecret</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlInputSecret</component-type>
+            <renderer-type>org.apache.myfaces.Secret</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>inputText</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlInputText</component-type>
+            <renderer-type>org.apache.myfaces.Text</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>inputTextHelp</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlInputTextHelp</component-type>
+            <renderer-type>org.apache.myfaces.TextHelp</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>inputTextarea</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlInputTextarea</component-type>
+            <renderer-type>org.apache.myfaces.Textarea</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>graphicImage</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlGraphicImage</component-type>
+            <renderer-type>org.apache.myfaces.Image</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>message</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlMessage</component-type>
+            <renderer-type>org.apache.myfaces.Message</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>messages</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlMessages</component-type>
+            <renderer-type>org.apache.myfaces.Messages</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>outputLabel</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlOutputLabel</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>outputText</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlOutputText</component-type>
+            <renderer-type>org.apache.myfaces.Text</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>panelGrid</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlPanelGrid</component-type>
+            <renderer-type>org.apache.myfaces.Grid</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>panelGroup</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlPanelGroup</component-type>
+            <renderer-type>org.apache.myfaces.Group</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>selectOneMenu</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlSelectOneMenu</component-type>
+            <renderer-type>org.apache.myfaces.Menu</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>selectManyMenu</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlSelectManyMenu</component-type>
+            <renderer-type>org.apache.myfaces.Menu</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>selectOneRadio</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlSelectOneRadio</component-type>
+            <renderer-type>org.apache.myfaces.Radio</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>selectBooleanCheckbox</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlSelectBooleanCheckbox</component-type>
+            <renderer-type>org.apache.myfaces.Checkbox</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>selectManyCheckbox</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlSelectManyCheckbox</component-type>
+            <renderer-type>org.apache.myfaces.Checkbox</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>selectOneListbox</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlSelectOneListbox</component-type>
+            <renderer-type>org.apache.myfaces.Listbox</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>selectManyListbox</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlSelectManyListbox</component-type>
+            <renderer-type>org.apache.myfaces.Listbox</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>inputCalendar</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlInputCalendar</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>jsValueChangeListener</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.JsValueChangeListener</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>jsValueSet</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlJsValueSet</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>checkbox</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlCheckbox</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>commandNavigation</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlCommandNavigation</component-type>
+            <renderer-type>org.apache.myfaces.Navigation</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>commandNavigation2</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlCommandNavigationItem</component-type>
+            <renderer-type>org.apache.myfaces.NavigationMenu</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>commandSortHeader</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlCommandSortHeader</component-type>
+            <renderer-type>org.apache.myfaces.SortHeader</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>dataList</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlDataList</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>dataScroller</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlDataScroller</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>inputDate</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlInputDate</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>inputFileUpload</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlInputFileUpload</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>inputHtml</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.InputHtml</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>navigationMenuItem</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.NavigationMenuItem</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>navigationMenuItems</tag-name>
+        <component>
+            <component-type>javax.faces.SelectItems</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>jscookMenu</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.JSCookMenu</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>panelLayout</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlPanelLayout</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>panelNavigation</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlPanelNavigation</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>panelNavigation2</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlPanelNavigationMenu</component-type>
+            <renderer-type>org.apache.myfaces.NavigationMenu</renderer-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>panelTab</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlPanelTab</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>panelTabbedPane</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlPanelTabbedPane</component-type>
+        </component>
+    </tag>
+    <!-- deactivated since there's no component! tag>
+        <tag-name>tabChangeListener</tag-name>
+        <component>
+        <component-type></component-type>
+        </component>
+        </tag-->
+    <tag>
+        <tag-name>collapsiblePanel</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlCollapsiblePanel</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>selectOneCountry</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.SelectOneCountry</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>selectOneLanguage</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.SelectOneLanguage</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>stylesheet</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.Stylesheet</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>div</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.Div</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>htmlTag</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlTag</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>radio</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlRadio</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>tree</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlTree</component-type>
+            <renderer-type>org.apache.myfaces.HtmlTree</renderer-type>
+        </component>
+    </tag>
+    <!-- deactivated since there's no component! tag>
+        <tag-name>treeSelectionListener</tag-name>
+        <component>
+        <component-type></component-type>
+        </component>
+        </tag-->
+    <!-- deactivated since there's no component! tag>
+        <tag-name>iconProvider</tag-name>
+        <component>
+        <component-type></component-type>
+        </component>
+        </tag-->
+    <tag>
+        <tag-name>treeColumn</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlTreeColumn</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>treeCheckbox</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlTreeCheckbox</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>tree2</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlTree2</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>panelStack</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlPanelStack</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>popup</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlPopup</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>newspaperTable</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlNewspaperTable</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>aliasBean</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.AliasBean</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>aliasBeansScope</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.AliasBeansScope</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>buffer</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.Buffer</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>saveState</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.SaveState</component-type>
+        </component>
+    </tag>
+    <!-- deactivated since there's no component! tag>
+        <tag-name>updateActionListener</tag-name>
+        <component>
+        <component-type></component-type>
+        </component>
+        </tag-->
+    <tag>
+        <tag-name>validateCreditCard</tag-name>
+        <validator>
+            <validator-id>org.apache.myfaces.validator.CreditCard</validator-id>
+        </validator>
+    </tag>
+    <tag>
+        <tag-name>validateEmail</tag-name>
+        <validator>
+            <validator-id>org.apache.myfaces.validator.Email</validator-id>
+        </validator>
+    </tag>
+    <tag>
+        <tag-name>validateEqual</tag-name>
+        <validator>
+            <validator-id>org.apache.myfaces.validator.Equal</validator-id>
+        </validator>
+    </tag>
+    <tag>
+        <tag-name>swapImage</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlSwapImage</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>columns</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlColumns</component-type>
+        </component>
+    </tag>
+    <tag>
+        <tag-name>column</tag-name>
+        <component>
+            <component-type>org.apache.myfaces.HtmlColumn</component-type>
+        </component>
+    </tag>
+    <!-- additional validators (note: not in tld, so no code completion) -->
+    <tag>
+        <tag-name>validateRegExpr</tag-name>
+        <validator>
+            <validator-id>org.apache.myfaces.validator.RegExpr</validator-id>
+        </validator>
+    </tag>
+</facelet-taglib>
\ No newline at end of file

Propchange: myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/facelets/tomahawk.taglib.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/facelets/tomahawk.taglib.xml
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL



Mime
View raw message