You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by we...@apache.org on 2012/03/06 13:31:01 UTC
svn commit: r1297444 [3/3] - in
/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite:
./ org/ org/apache/ org/apache/myfaces/ org/apache/myfaces/extensions/
org/apache/myfaces/extensions/scripting/ org/apache/myf...
Added: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/filter/WhitelistFilter.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/filter/WhitelistFilter.java?rev=1297444&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/filter/WhitelistFilter.java (added)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/filter/WhitelistFilter.java Tue Mar 6 12:30:58 2012
@@ -0,0 +1,130 @@
+/*
+ * 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 rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.filter;
+
+import rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.api.ClassFilter;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Filter class which depends upon a list of whitelisted packages
+ * wildcards in this filter are implicit which means
+ * <p/>
+ * org.apache.myfaces includes all files
+ * under org.apache.myfaces
+ */
+public class WhitelistFilter implements ClassFilter
+{
+
+ WhiteListNode _whiteList = new WhiteListNode();
+
+ /*we use a package tree here to make the whitelist check as performant as possible*/
+
+ class WhiteListNode {
+ Map<String, WhiteListNode> _value = new ConcurrentHashMap<String, WhiteListNode>();
+
+ public WhiteListNode addEntry(String key) {
+ if (_value.containsKey(key)) {
+ return _value.get(key);
+ }
+ WhiteListNode retVal = new WhiteListNode();
+ _value.put(key, retVal);
+ return retVal;
+ }
+
+ public boolean hasChildren() {
+ return !_value.isEmpty();
+ }
+
+ public Map<String, WhiteListNode> getValue() {
+ return _value;
+ }
+
+ public void setValue(Map<String, WhiteListNode> value) {
+ this._value = value;
+ }
+
+ public WhiteListNode get(String key) {
+ return _value.get(key);
+ }
+ }
+
+ public WhitelistFilter(String... whiteList) {
+ for (String singlePackage : whiteList) {
+ addEntry(singlePackage);
+ }
+ }
+
+ public WhitelistFilter(Collection<String> whiteList) {
+ for (String singlePackage : whiteList) {
+ addEntry(singlePackage);
+ }
+ }
+
+ /**
+ * whitespace is allowed implementation
+ *
+ * @param engineType integer value of the engine type of the class
+ * @param clazz the class itself to be processed by the filter
+ * @return true if it is white-spaced, false otherwise
+ */
+ public final boolean isAllowed(Integer engineType, String clazz) {
+ String[] subParts = clazz.split("\\.");
+ WhiteListNode currPackage = _whiteList;
+ WhiteListNode parentPackage = null;
+ for (String subPart : subParts) {
+ currPackage = currPackage.get(subPart);
+ if (isRootPackageMismatch(currPackage, parentPackage)) {
+ return false;
+ } else if (isSubpackage(currPackage, parentPackage)) {
+ return true;
+ } else if (isMismatch(currPackage)) {
+ return false;
+ }
+
+ parentPackage = currPackage;
+ }
+ return true;
+ }
+
+ private void addEntry(String singlePackage) {
+ String[] subPackages = singlePackage.split("\\.");
+ WhiteListNode currPackage = _whiteList;
+ for (String subPackage : subPackages) {
+ currPackage = currPackage.addEntry(subPackage);
+ }
+ }
+
+ //special conditions extracted for readability reasons in the core
+ //algorithm
+
+ private boolean isMismatch(WhiteListNode currPackage) {
+ return currPackage == null;
+ }
+
+ private boolean isSubpackage(WhiteListNode currPackage, WhiteListNode parentPackage) {
+ return currPackage == null && parentPackage != null && !parentPackage.hasChildren();
+ }
+
+ private boolean isRootPackageMismatch(WhiteListNode currPackage, WhiteListNode parentPackage) {
+ return currPackage == null && parentPackage == null;
+ }
+}
Added: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/loaders/ScannerClassloader.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/loaders/ScannerClassloader.java?rev=1297444&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/loaders/ScannerClassloader.java (added)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/loaders/ScannerClassloader.java Tue Mar 6 12:30:58 2012
@@ -0,0 +1,129 @@
+/*
+ * 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 rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.loaders;
+
+
+
+import org.apache.myfaces.extensions.scripting.monitor.RefreshContext;
+import rewrite.org.apache.myfaces.extensions.scripting.common.util.ClassUtils;
+import rewrite.org.apache.myfaces.extensions.scripting.monitor.ClassResource;
+
+import java.io.*;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+
+public class ScannerClassloader extends ClassLoader {
+
+ File _tempDir = null;
+
+ Map<String, Class> _alreadyScanned = new HashMap<String, Class>();
+
+ final Logger _logger = Logger.getLogger(ScannerClassloader.class.getName());
+
+
+ public ScannerClassloader(ClassLoader classLoader, int scriptingEngine, String engineExtension, File tempDir) {
+ super(classLoader);
+
+ this._tempDir = tempDir;
+ }
+
+ @Override
+ public InputStream getResourceAsStream(String name) {
+ File resource = new File(_tempDir.getAbsolutePath() + File.separator + name);
+ if (resource.exists()) {
+ try {
+ return new FileInputStream(resource);
+ } catch (FileNotFoundException e) {
+ return super.getResourceAsStream(name);
+ }
+ }
+ return super.getResourceAsStream(name);
+ }
+
+ public File getClassFile(String className) {
+ return ClassUtils.classNameToFile(_tempDir.getAbsolutePath(), className);
+ }
+
+ @Override
+ public Class<?> loadClass(String className) throws ClassNotFoundException {
+ //check if our class exists in the tempDir
+
+ if (_alreadyScanned.containsKey(className)) {
+ return _alreadyScanned.get(className);
+ }
+
+ File target = getClassFile(className);
+ if (!target.exists()) {
+ return super.loadClass(className);
+ }
+
+ //ClassResource data = WeavingContext.getFileChangedDaemon().getClassMap().get(className);
+ //if (data != null && !data.getRefreshAttribute().requiresRefresh()) {
+ // return data.getAClass();
+ //}
+
+ FileInputStream iStream = null;
+
+ int fileLength;
+ byte[] fileContent;
+ try {
+ //we cannot load while a compile is in progress
+ //we have to wait until it is one
+ synchronized (RefreshContext.COMPILE_SYNC_MONITOR) {
+ fileLength = (int) target.length();
+ fileContent = new byte[fileLength];
+ iStream = new FileInputStream(target);
+ int len = iStream.read(fileContent);
+ if (_logger.isLoggable(Level.FINER)) {
+ _logger.log(Level.FINER, "class read {0}� bytes read", String.valueOf(len));
+ }
+ }
+
+ //we have to do it here because just in case
+ //a dependent class is loaded as well we run into classcast exceptions
+ Class retVal = super.defineClass(className, fileContent, 0, fileLength);
+ _alreadyScanned.put(className, retVal);
+ return retVal;
+
+ } catch (FileNotFoundException e) {
+ throw new ClassNotFoundException(e.toString());
+ } catch (IOException e) {
+ throw new ClassNotFoundException(e.toString());
+ } finally {
+ if (iStream != null) {
+ try {
+ iStream.close();
+ } catch (Exception e) {
+ _logger.log(Level.SEVERE, "", e);
+ }
+ }
+ }
+
+ }
+
+}
+
Added: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/DependencyRegistryImpl.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/DependencyRegistryImpl.java?rev=1297444&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/DependencyRegistryImpl.java (added)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/DependencyRegistryImpl.java Tue Mar 6 12:30:58 2012
@@ -0,0 +1,136 @@
+/*
+ * 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 rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.registry;
+
+import org.apache.myfaces.extensions.scripting.api.ScriptingConst;
+import org.apache.myfaces.extensions.scripting.core.util.StringUtils;
+import rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.api.ClassFilter;
+import rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.core.ClassDependencies;
+import rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.filter.ScanIdentifierFilter;
+import rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.filter.StandardNamespaceFilter;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * registry facade which is used to track our dependencies
+ */
+public class DependencyRegistryImpl implements ExternalFilterDependencyRegistry
+{
+ List<ClassFilter> _filters = new LinkedList<ClassFilter>();
+
+ ClassDependencies _dependencMap;
+
+ //private volatile Strategy _registrationStrategy;
+ final Integer _engineType;
+
+ /**
+ * constructor for our facade
+ *
+ * @param engineType the engine type this registry should support
+ * @param dependencyMap the dependency map which stores the dependencies
+ */
+ public DependencyRegistryImpl(Integer engineType, ClassDependencies dependencyMap) {
+ _dependencMap = dependencyMap;
+ _engineType = engineType;
+
+ _filters.add(new ScanIdentifierFilter(_engineType, ScriptingConst.ENGINE_TYPE_JSF_ALL, ScriptingConst.ENGINE_TYPE_JSF_NO_ENGINE));
+ _filters.add(new StandardNamespaceFilter());
+ }
+
+ /**
+ * Clears the entire filter map
+ */
+ public void clearFilters() {
+ _filters.clear();
+ _filters.add(new ScanIdentifierFilter(_engineType, ScriptingConst.ENGINE_TYPE_JSF_ALL, ScriptingConst.ENGINE_TYPE_JSF_NO_ENGINE));
+ _filters.add(new StandardNamespaceFilter());
+ }
+
+ /**
+ * adds a new filter
+ *
+ * @param filter the filter to be added
+ */
+ public void addFilter(ClassFilter filter) {
+ _filters.add(filter);
+ }
+
+ /**
+ * checks if the className is allowed in the current filter chain
+ *
+ * @param engineType an identifier for the current scan type (jsf java scan for instance)
+ * @param className the classname to be checked
+ * @return true if a filter triggers false if not
+ */
+ public boolean isAllowed(Integer engineType, String className) {
+ for (ClassFilter filter : _filters) {
+ if (!filter.isAllowed(_engineType, className)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * adds a dependency to our dependency map (usually rootclass -> dependency and currentClass -> dependency)
+ *
+ * @param engineType the engine type for this dependency
+ * @param rootClass the root class of this scan which all dependencies are referenced from
+ * @param currentlyVisitedClass the source which includes or casts the dependencies
+ * @param dependency the dependency to be added
+ */
+ public void addDependency(Integer engineType, String rootClass, String currentlyVisitedClass, String dependency) {
+
+ if (StringUtils.isBlank(dependency)) {
+ return;
+ }
+
+ if (currentlyVisitedClass != null && currentlyVisitedClass.equals(dependency)) {
+ return;
+ }
+
+
+
+ if (!isAllowed(engineType, dependency)) {
+ return;
+ }
+
+ //not needed
+ //if(!StringUtils.isBlank(currentlyVisitedClass)) {
+ // _dependencMap.addDependency(currentlyVisitedClass, dependency);
+ //}
+
+ //for now we code it into a list like we used to do before
+ //but in the long run we have to directly register
+ //to save one step
+ //getDependencySet(source).add(dependency);
+ if(!StringUtils.isBlank(rootClass)) {
+ _dependencMap.addDependency(rootClass, dependency);
+ }
+ }
+
+ /**
+ * flush to flush down our stored dependencies into our final map
+ */
+ public void flush(Integer engineType) {
+ //_registrationStrategy.apply(_dependencies);
+ }
+
+}
Added: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/ExternalFilterDependencyRegistry.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/ExternalFilterDependencyRegistry.java?rev=1297444&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/ExternalFilterDependencyRegistry.java (added)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/ExternalFilterDependencyRegistry.java Tue Mar 6 12:30:58 2012
@@ -0,0 +1,68 @@
+/*
+ * 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 rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.registry;
+
+import rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.api.ClassFilter;
+import rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.api.DependencyRegistry;
+
+/**
+ * General contractual interface for a dependency registry with external filters
+ * being settable
+ * <p/>
+ * The dependency registry is a class which stores dependencies
+ * according to an internal whitelisting system.
+ * <p/>
+ * Only classes which pass the whitelisting check will be processed
+ */
+public interface ExternalFilterDependencyRegistry extends DependencyRegistry
+{
+
+ /**
+ * Clears the internal filters
+ * for the registry
+ */
+ void clearFilters();
+
+ /**
+ * adds another filter to the internal filter list
+ *
+ * @param filter the filter to be added
+ */
+ void addFilter(ClassFilter filter);
+
+ /**
+ * Allowance check for external shortcutting
+ * This check triggers into the internal filters
+ * to pre-check if a class is allowed to pass or not
+ *
+ * @param className the classname to be checked
+ * @param engineType an identifier for the current scan type (jsf java scan for instance)
+ * @return true if it is false otherwise
+ */
+ public boolean isAllowed(Integer engineType, String className);
+
+ /**
+ * Flush operation to batch sync
+ * the current dependencies against a storage
+ * <p/>
+ * (will be removed later once we have all the code transitioned
+ * to the registry system)
+ */
+ void flush(Integer engineType);
+}
Added: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/MasterDependencyRegistry.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/MasterDependencyRegistry.java?rev=1297444&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/MasterDependencyRegistry.java (added)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/MasterDependencyRegistry.java Tue Mar 6 12:30:58 2012
@@ -0,0 +1,90 @@
+/*
+ * 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 rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.registry;
+
+import rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.api.DependencyRegistry;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * A master dependency registry which keeps track of various
+ * sub-registries in our dependency scanning system
+ *
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+public class MasterDependencyRegistry implements DependencyRegistry
+{
+
+ /**
+ * We keep our central registry in a map
+ * with the engineType as key value to detect which
+ * registry needs to be triggered
+ */
+ private Map<Integer, DependencyRegistry> _subRegistries = new ConcurrentHashMap<Integer, DependencyRegistry>();
+
+ /**
+ * adds a new dependency to all registered registries
+ *
+ * @param engineType the engine type which holds the registry
+ * @param rootClass the root class of this scan which all dependencies are referenced from
+ * @param currentClass the current class scanned
+ * @param dependency the dependency to be added relative to the current class
+ */
+ public void addDependency(Integer engineType, String rootClass, String currentClass, String dependency) {
+ for (Map.Entry<Integer, DependencyRegistry> entry : _subRegistries.entrySet()) {
+ entry.getValue().addDependency(engineType, rootClass, currentClass, dependency);
+ }
+ }
+
+ /**
+ * Flush which is issued at the end of processing to flush
+ * any content which has not been yet processed into our content holding
+ * data structures
+ *
+ * @param engineType the engine type which has issued the flush operation
+ */
+ public void flush(Integer engineType) {
+ for (Map.Entry<Integer, DependencyRegistry> entry : _subRegistries.entrySet()) {
+ entry.getValue().flush(engineType);
+ }
+ }
+
+ /**
+ * adds a subregistry to our current master registry
+ *
+ * @param engineType the engine type which is the key to our subregistry
+ * @param registry the subregistry which has to be added
+ */
+ public void addSubregistry(Integer engineType, DependencyRegistry registry) {
+ _subRegistries.put(engineType, registry);
+ }
+
+ /**
+ * Getter for getting a subregistry from our given registry
+ *
+ * @param engineType the engine type to search for
+ * @return the subregistry according to the engine type, or null if none is found
+ */
+ public DependencyRegistry getSubregistry(Integer engineType) {
+ return _subRegistries.get(engineType);
+ }
+
+}
Copied: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ClassResource.java (from r1296173, myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/monitor/ClassResource.java)
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ClassResource.java?p2=myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ClassResource.java&p1=myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/monitor/ClassResource.java&r1=1296173&r2=1297444&rev=1297444&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/monitor/ClassResource.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ClassResource.java Tue Mar 6 12:30:58 2012
@@ -17,10 +17,11 @@
* under the License.
*/
-package org.apache.myfaces.extensions.scripting.monitor;
+package rewrite.org.apache.myfaces.extensions.scripting.monitor;
-import org.apache.myfaces.extensions.scripting.api.ScriptingConst;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
+import rewrite.org.apache.myfaces.extensions.scripting.common.ScriptingConst;
+import rewrite.org.apache.myfaces.extensions.scripting.common.util.ClassUtils;
+import rewrite.org.apache.myfaces.extensions.scripting.context.WeavingContext;
import java.io.File;
import java.util.Collection;
@@ -31,7 +32,11 @@ import java.util.logging.Logger;
* @version $Revision$ $Date$
*/
-public class ClassResource extends WatchedResource {
+public class ClassResource extends WatchedResource
+{
+
+ Logger logger = Logger.getLogger(this.getClass().getName());
+
/*
* volatile due to the ram concurrency behavior
* of the instance vars jdk 5+
@@ -42,105 +47,139 @@ public class ClassResource extends Watch
//on its corresponding classloader
//caching the info however probably is faster
volatile Class _aClass = null;
- volatile File _sourceFile;
- volatile long _lastLoaded = -1L;
+ volatile File _sourceFile;
+
volatile int _scriptingEngine = ScriptingConst.ENGINE_TYPE_JSF_NO_ENGINE;
+ volatile long _lastLoaded = -1L;
//todo clean up the sourcepath and filename
//--- todo move this into a separate resource handling facility
- @Override
- public String identifier() {
- return _aClass.getName();
- }
+
@Override
/**
* returns the source file in this case
*/
- public File getFile() {
- try {
+ public File getFile()
+ {
+ try
+ {
return _sourceFile;
- } catch (NullPointerException ex) {
+ }
+ catch (NullPointerException ex)
+ {
return null;
}
}
- public void setFile(File sourceFile) {
+ public void setFile(File sourceFile)
+ {
_sourceFile = sourceFile;
}
-
- public Class getAClass() {
+
+ public Class getAClass()
+ {
return _aClass;
}
- public void setAClass(Class aClass) {
+ public void setAClass(Class aClass)
+ {
this._aClass = aClass;
}
- public int getScriptingEngine() {
+ public int getScriptingEngine()
+ {
return _scriptingEngine;
}
- public void setScriptingEngine(int scriptingEngine) {
+ public void setScriptingEngine(int scriptingEngine)
+ {
this._scriptingEngine = scriptingEngine;
}
-
- public void setRefreshAttribute(RefreshAttribute attr) {
- _refreshAttribute = attr;
- }
-
@Override
- protected Object clone() throws CloneNotSupportedException {
+ protected Object clone() throws CloneNotSupportedException
+ {
ClassResource retVal = (ClassResource) super.clone();
- retVal.setRefreshAttribute(_refreshAttribute.getClone());
return retVal;
}
-
- public String getSourceFile() {
- return _sourceFile.getAbsolutePath().substring(getSourceDir().length()+1);
+ public String getSourceFile()
+ {
+ return _sourceFile.getAbsolutePath().substring(getSourceDir().length() + 1);
}
-
- public String getSourceDir() {
- Collection<String> sourceRoots = WeavingContext.getConfiguration().getSourceDirs(_scriptingEngine);
+ public String getSourceDir()
+ {
+ Collection<String> sourceRoots = WeavingContext.getInstance().getConfiguration().getSourceDirs(_scriptingEngine);
String fileDir = _sourceFile.getAbsolutePath();
- fileDir = fileDir.replaceAll("\\\\","/");
- for(String sourceRoot: sourceRoots) {
- sourceRoot = sourceRoot.replaceAll("\\\\","/");
- if(fileDir.startsWith(sourceRoot)) {
+ fileDir = fileDir.replaceAll("\\\\", "/");
+ for (String sourceRoot : sourceRoots)
+ {
+ sourceRoot = sourceRoot.replaceAll("\\\\", "/");
+ if (fileDir.startsWith(sourceRoot))
+ {
return sourceRoot;
}
}
return null;
}
- public void executeLastLoaded() {
+ public void executeLastLoaded()
+ {
_lastLoaded = System.currentTimeMillis();
}
- public long getLastLoaded() {
+ public long getLastLoaded()
+ {
return _lastLoaded;
}
/**
+ * identifier for this resource is the classname
*
- * @return true if the class file has been recompiled since the last request for recompilation
+ * @return
*/
- public boolean isRecompiled() {
- File classFile = WeavingContext.getConfiguration().resolveClassFile(_aClass.getName());
- if(!classFile.exists()) {
- return false;
- }
- Logger log = Logger.getLogger(this.getClass().getName());
- log.info(this.getAClass().getName() + (classFile.lastModified() - _lastLoaded));
+ public String getIdentifier()
+ {
+ String targetDir = WeavingContext.getInstance().getConfiguration().getCompileTarget().getAbsolutePath();
+ String className = ClassUtils.relativeFileToClassName(getSourceFile());
+ return className;
+ }
-
- return classFile.lastModified() > _lastLoaded;
+ public void setTainted(boolean value)
+ {
+ if (isTainted()) return;
+ if (value)
+ {
+ //TODO add logging event here
+ logger.info("[EXT-SCRIPTING] tainting " + getSourceFile());
+ }
+ tainted = true;
}
+ /**
+ * @return true if the source file has been modified compared to its classfile
+ */
+ public boolean isTainted()
+ {
+ return tainted;
+ }
+
+ public boolean needsRecompile()
+ {
+ String targetDir = WeavingContext.getInstance().getConfiguration().getCompileTarget().getAbsolutePath();
+ String className = ClassUtils.relativeFileToClassName(getSourceFile());
+ className = targetDir + File.separator + className.replaceAll("\\.", File.separator) + ".class";
+ File targetClass = new File(className);
+ return !targetClass.exists() || targetClass.lastModified() < _sourceFile.lastModified();
+ }
+
+ public boolean stillExists()
+ {
+ return _sourceFile.exists();
+ }
}
Copied: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ResourceMonitor.java (from r1296173, myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/monitor/ResourceMonitor.java)
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ResourceMonitor.java?p2=myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ResourceMonitor.java&p1=myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/monitor/ResourceMonitor.java&r1=1296173&r2=1297444&rev=1297444&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/monitor/ResourceMonitor.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ResourceMonitor.java Tue Mar 6 12:30:58 2012
@@ -16,13 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.myfaces.extensions.scripting.monitor;
+package rewrite.org.apache.myfaces.extensions.scripting.monitor;
-import org.apache.myfaces.extensions.scripting.api.ScriptingConst;
-import org.apache.myfaces.extensions.scripting.api.ScriptingWeaver;
-import org.apache.myfaces.extensions.scripting.core.dependencyScan.core.ClassDependencies;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-import org.apache.myfaces.extensions.scripting.api.extensionevents.ClassTaintedEvent;
+
+
+import rewrite.org.apache.myfaces.extensions.scripting.common.ScriptingConst;
+import rewrite.org.apache.myfaces.extensions.scripting.context.WeavingContext;
import javax.servlet.ServletContext;
import java.io.File;
@@ -52,8 +51,8 @@ public class ResourceMonitor extends Thr
static ResourceMonitor _instance = null;
- Map<String, ClassResource> _classMap = new ConcurrentHashMap<String, ClassResource>(8, 0.75f, 1);
- ClassDependencies _dependencyMap = new ClassDependencies();
+ //Map<String, ClassResource> _classMap = new ConcurrentHashMap<String, ClassResource>(8, 0.75f, 1);
+ //ClassDependencies _dependencyMap = new ClassDependencies();
/**
* This map is a shortcut for the various scripting engines.
@@ -68,20 +67,21 @@ public class ResourceMonitor extends Thr
Map<Integer, Boolean> _systemRecompileMap = new ConcurrentHashMap<Integer, Boolean>(8, 0.75f, 1);
boolean _running = false;
- boolean _contextInitialized = false;
+// boolean _contextInitialized = false;
Logger _log = Logger.getLogger(ResourceMonitor.class.getName());
- ScriptingWeaver _weavers = null;
+// ScriptingWeaver _weavers = null;
static WeakReference<ServletContext> _externalContext;
public static synchronized void startup(ServletContext externalContext) {
- if (_externalContext != null) return;
+ if (_externalContext == null) return;
_externalContext = new WeakReference<ServletContext>(externalContext);
+ if(getInstance() != null) return;
//we currently keep it as singleton but in the long run we will move it into the context
//like everything else singleton-wise
- if (WeavingContext.isScriptingEnabled() && _instance == null) {
+ if (_instance == null) {
_instance = new ResourceMonitor();
- externalContext.setAttribute(CONTEXT_KEY, _instance);
+
/**
* daemon thread to allow forced
* shutdowns for web context restarts
@@ -89,7 +89,7 @@ public class ResourceMonitor extends Thr
_instance.setDaemon(true);
_instance.setRunning(true);
_instance.start();
-
+ _externalContext.get().setAttribute(CONTEXT_KEY, _instance);
}
}
@@ -113,33 +113,32 @@ public class ResourceMonitor extends Thr
* which performs the entire scanning process
*/
public void run() {
- while (WeavingContext.isScriptingEnabled() && _running) {
- if (_externalContext != null && _externalContext.get() != null && !_contextInitialized) {
- WeavingContext.initThread((ServletContext) _externalContext.get());
- _contextInitialized = true;
- }
- try {
- try {
- Thread.sleep(ScriptingConst.TAINT_INTERVAL);
- } catch (InterruptedException e) {
- //if the server shuts down while we are in sleep we get an error
- //which we better should swallow
- }
-
- if (_classMap == null || _classMap.size() == 0)
- continue;
- if (_contextInitialized)
- checkForChanges();
- } catch (Throwable e) {
- _log.log(Level.SEVERE, "[EXT-SCRIPTING]", e);
+ while(_running) {
+ sleep();
+ //we run the full scan on the classes to bring our data structures up to the task
+ WeavingContext.getInstance().initialFullScan();
+ //we compile wherever needed, taints are now in place due to our scan already being performed
+ WeavingContext.getInstance().compile();
+ //we now have to perform a full dependency scan to bring our dependency map to the latest state
+ WeavingContext.getInstance().scanDependencies();
+ //we next retaint all classes according to our dependency graph
- }
}
if (_log.isLoggable(Level.INFO)) {
_log.info("[EXT-SCRIPTING] Dynamic reloading watch daemon is shutting down");
}
}
+ private void sleep()
+ {
+ try {
+ Thread.sleep(ScriptingConst.TAINT_INTERVAL);
+ } catch (InterruptedException e) {
+ //if the server shuts down while we are in sleep we get an error
+ //which we better should swallow
+ }
+ }
+
/**
* central tainted mark method which keeps
* track if some file in one of the supported engines has changed
@@ -147,7 +146,7 @@ public class ResourceMonitor extends Thr
* as marks the engine as having to do a full recompile
*/
private final void checkForChanges() {
- ScriptingWeaver weaver = WeavingContext.getWeaver();
+ /* ScriptingWeaver weaver = WeavingContext.getWeaver();
if (weaver == null) return;
weaver.scanForAddedClasses();
@@ -170,7 +169,7 @@ public class ResourceMonitor extends Thr
//}
}
//we clean up the taint log
- WeavingContext.getRefreshContext().gcTaintLog();
+ WeavingContext.getRefreshContext().gcTaintLog();*/
}
/**
@@ -182,7 +181,7 @@ public class ResourceMonitor extends Thr
* @param className the origin classname which needs to be walked recursively
*/
private void dependencyTainted(String className) {
- Set<String> referrers = _dependencyMap.getReferringClasses(className);
+ /*Set<String> referrers = _dependencyMap.getReferringClasses(className);
if (referrers == null) return;
for (String referrer : referrers) {
ClassResource metaData = _classMap.get(referrer);
@@ -195,10 +194,10 @@ public class ResourceMonitor extends Thr
dependencyTainted(metaData.getAClass().getName());
WeavingContext.getRefreshContext().addTaintLogEntry(metaData);
WeavingContext.getExtensionEventRegistry().sendEvent(new ClassTaintedEvent(metaData));
- }
+ } */
}
- private final boolean isModified(Map.Entry<String, ClassResource> it, File proxyFile) {
+ /*private final boolean isModified(Map.Entry<String, ClassResource> it, File proxyFile) {
return proxyFile.lastModified() > it.getValue().getRefreshAttribute().getRequestedRefreshDate() ;
}
@@ -219,9 +218,6 @@ public class ResourceMonitor extends Thr
return _running;
}
- public void setRunning(boolean running) {
- this._running = running;
- }
public Map<Integer, Boolean> getSystemRecompileMap() {
return _systemRecompileMap;
@@ -229,26 +225,11 @@ public class ResourceMonitor extends Thr
public void setSystemRecompileMap(Map<Integer, Boolean> systemRecompileMap) {
this._systemRecompileMap = systemRecompileMap;
- }
-
- public Map<String, ClassResource> getClassMap() {
- return _classMap;
- }
+ } */
- public void setClassMap(Map<String, ClassResource> classMap) {
- this._classMap = classMap;
- }
- public ScriptingWeaver getWeavers() {
- return _weavers;
- }
-
- public void setWeavers(ScriptingWeaver weavers) {
- _weavers = weavers;
- }
-
- public ClassDependencies getDependencyMap() {
- return _dependencyMap;
+ public void setRunning(boolean running) {
+ this._running = running;
}
}
Copied: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/WatchedResource.java (from r1296173, myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/monitor/WatchedResource.java)
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/WatchedResource.java?p2=myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/WatchedResource.java&p1=myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/monitor/WatchedResource.java&r1=1296173&r2=1297444&rev=1297444&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/monitor/WatchedResource.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/WatchedResource.java Tue Mar 6 12:30:58 2012
@@ -17,7 +17,9 @@
* under the License.
*/
-package org.apache.myfaces.extensions.scripting.monitor;
+package rewrite.org.apache.myfaces.extensions.scripting.monitor;
+
+import org.apache.myfaces.extensions.scripting.monitor.RefreshAttribute;
import java.io.File;
@@ -31,14 +33,19 @@ import java.io.File;
public abstract class WatchedResource implements Cloneable {
- RefreshAttribute _refreshAttribute = new RefreshAttribute();
+ /**
+ * tainted override for dependend classes
+ */
+ volatile boolean tainted = false;
+
+ volatile long _lastLoaded = -1L;
/**
* Unique identifier on the resource
*
* @return
*/
- public abstract String identifier();
+ public abstract String getIdentifier();
/**
* @return a file handle on the current resource
@@ -48,9 +55,9 @@ public abstract class WatchedResource im
/**
* @return additional refresh attribute metadata
*/
- public RefreshAttribute getRefreshAttribute() {
- return _refreshAttribute;
- }
+ //public RefreshAttribute getRefreshAttribute() {
+ // return _refreshAttribute;
+ //}
public WatchedResource getClone() {
try {
@@ -60,4 +67,23 @@ public abstract class WatchedResource im
}
}
+ public long getLastLoaded()
+ {
+ return _lastLoaded;
+ }
+
+ public void setLastLoaded(long lastLoaded)
+ {
+ _lastLoaded = lastLoaded;
+ }
+
+ public boolean isTainted()
+ {
+ return tainted;
+ }
+
+ public void setTainted(boolean tainted)
+ {
+ this.tainted = tainted;
+ }
}
Copied: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/servlet/ScriptingServletFilter.java (from r1296173, myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/servlet/ScriptingServletFilter.java)
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/servlet/ScriptingServletFilter.java?p2=myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/servlet/ScriptingServletFilter.java&p1=myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/servlet/ScriptingServletFilter.java&r1=1296173&r2=1297444&rev=1297444&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/servlet/ScriptingServletFilter.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/servlet/ScriptingServletFilter.java Tue Mar 6 12:30:58 2012
@@ -16,109 +16,43 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.myfaces.extensions.scripting.servlet;
+package rewrite.org.apache.myfaces.extensions.scripting.servlet;
-import org.apache.myfaces.extensions.scripting.api.ScriptingConst;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-import org.apache.myfaces.extensions.scripting.jsf.RefreshPhaseListener;
+import rewrite.org.apache.myfaces.extensions.scripting.context.WeavingContext;
import javax.servlet.*;
import java.io.IOException;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Logger;
/**
- * Scripting servlet filter
- * <p/>
- * hits the filter while the
- * init system is not entirely finished yet
+ * This filter is just a blocking filter
+ * refreshes are not allowed while the system
+ * recompiles, incoming requests are put on hold
*
* @author Werner Punz
*/
-public class ScriptingServletFilter implements Filter {
+public class ScriptingServletFilter implements Filter
+{
- ServletContext _context = null;
- static volatile boolean _active = false;
- static volatile boolean _warned = false;
-
- public void init(FilterConfig filterConfig) throws ServletException {
+ ServletContext _context;
+ Logger logger = Logger.getLogger(this.getClass().getName());
+
+ public void init(FilterConfig filterConfig) throws ServletException
+ {
_context = filterConfig.getServletContext();
- /*we cannot use the context listener here
- * because we have the problem that we do not want to parse the web.xml*/
- WeavingContext.setFilterEnabled(true);
- }
-
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
- assertInitialized();
- if (!_active) {
- filterChain.doFilter(servletRequest, servletResponse);
- return;
- }
- markRequestStart();
- WeavingContext.initThread(_context);
-
- WeavingContext.setRequest(servletRequest);
-
- WeavingContext.getRefreshContext().setCurrentlyRunningRequests(getRequestCnt());
-
- ScriptingServletFilter._action.run();
-
- try {
- filterChain.doFilter(servletRequest, servletResponse);
- } finally {
- markRequestEnd();
- }
- }
-
- static Runnable _action = new Runnable() {
- public void run() {
- WeavingContext.doRequestRefreshes();
- }
- };
-
- /**
- * Checks for an initialized system and if not the filter will be deactivated
- * <p/>
- * the idea is to check the context in regular intervals
- * whether the startup process has been finished and then
- * allow the requests to pass through
- */
- private void assertInitialized() {
- if (_active) return;
-
- AtomicBoolean startup = (AtomicBoolean) _context.getAttribute(ScriptingConst.CTX_ATTR_STARTUP);
- if (startup == null) {
- if (!_warned) {
- Logger log = Logger.getLogger(ScriptingServletFilter.class.getName());
- log.warning("[EXT-SCRIPTING] the Startup plugin chainloader has not been set, ext scripting is not working" +
- "please refer to the documentation for the org.apache.myfaces.FACES_INIT_PLUGINS parameter, deactivating servlet filter");
- _active = false;
- }
- } else {
- _active = !startup.get();
- }
- }
-
- public void destroy() {
-
- WeavingContext.clean();
- }
-
- //we mark the request beginning and end for further synchronisation issues
-
- private final AtomicInteger getRequestCnt() {
- AtomicInteger retVal = (AtomicInteger) _context.getAttribute(ScriptingConst.CTX_ATTR_REQUEST_CNT);
-
- return retVal;
}
- private int markRequestStart() {
- return getRequestCnt().incrementAndGet();
+ public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException
+ {
+ synchronized (WeavingContext.getInstance().recompileLock) {
+ logger.fine("request");
+ }
+ filterChain.doFilter(servletRequest, servletResponse);
}
- private int markRequestEnd() {
- return getRequestCnt().decrementAndGet();
+ @Override
+ public void destroy()
+ {
}
}
\ No newline at end of file
Added: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/startup/StartupServletContextPluginChainLoader.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/startup/StartupServletContextPluginChainLoader.java?rev=1297444&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/startup/StartupServletContextPluginChainLoader.java (added)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/startup/StartupServletContextPluginChainLoader.java Tue Mar 6 12:30:58 2012
@@ -0,0 +1,121 @@
+/*
+ * 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 rewrite.org.apache.myfaces.extensions.scripting.startup;
+
+import org.apache.myfaces.webapp.StartupListener;
+import rewrite.org.apache.myfaces.extensions.scripting.common.util.Cast;
+import rewrite.org.apache.myfaces.extensions.scripting.common.util.ClassUtils;
+import rewrite.org.apache.myfaces.extensions.scripting.common.util.ReflectUtil;
+import rewrite.org.apache.myfaces.extensions.scripting.context.WeavingContext;
+import rewrite.org.apache.myfaces.extensions.scripting.engine.FactoryEngines;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import java.io.IOException;
+import java.util.logging.Logger;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ * <p/>
+ * serves the startup process
+ * the chainloader hooks itself into the myfaces init process
+ * and is responsible for startup of the daemon the
+ * initial scan and compile
+ */
+
+public class StartupServletContextPluginChainLoader implements StartupListener
+{
+ final Logger _log = Logger.getLogger(this.getClass().getName());
+
+ public void preInit(ServletContextEvent servletContextEvent)
+ {
+ ServletContext servletContext = servletContextEvent.getServletContext();
+ try
+ {
+ WeavingContext context = WeavingContext.getInstance();
+ _log.info("[EXT-SCRIPTING] Instantiating StartupServletContextPluginChainLoader");
+ context.initEngines();
+ _log.info("[EXT-SCRIPTING] Loading configuration");
+ context.getConfiguration().init(servletContext);
+ _log.info("[EXT-SCRIPTING] Loading Scripting end");
+
+ _log.info("[EXT-SCRIPTING] Initial Scan");
+ context.initialFullScan();
+ _log.info("[EXT-SCRIPTING] Initial Compile");
+ //we can rely on the compiler picking the files
+ context.compile();
+ _log.info("[EXT-SCRIPTING] init the chain loader");
+ initChainLoader(servletContext);
+ _log.info("[EXT-SCRIPTING] Starting Change Monitor");
+ //TODO code the initial watchdog daemon start here
+ _log.info("[EXT-SCRIPTING] Startup done");
+
+ }
+ catch (IOException e)
+ {
+ _log.severe("[EXT-SCRIPTING] Engine startup failed terminating ext-scripting");
+ }
+
+ }
+
+ /**
+ * initializes our custom chain loader which gets plugged into
+ * the MyFaces loading part for classes!
+ *
+ * @param servletContext the servlet context to be passed down
+ * @return the custom chain loader for loading our classes over our classloaders
+ */
+ private void initChainLoader(ServletContext servletContext)
+ {
+ Object loader = ReflectUtil.instantiate("org.apache.myfaces.extensions.scripting.servlet" +
+ ".CustomChainLoader",
+ new Cast(ServletContext.class, servletContext));
+ ClassUtils.addClassLoadingExtension(loader, true);
+
+ }
+
+ public void postInit(ServletContextEvent evt)
+ {
+ //tell the system that the startup phase is done
+ /* WeavingContext.getWeaver().fullClassScan();
+ evt.getServletContext().setAttribute(ScriptingConst.CTX_ATTR_STARTUP, new AtomicBoolean(Boolean.FALSE));
+
+ WeavingContext.getExtensionEventRegistry().sendEvent(new SystemInitializedEvent());
+ */
+ }
+
+ public void preDestroy(ServletContextEvent evt)
+ {
+
+ }
+
+ public void postDestroy(ServletContextEvent evt)
+ {
+ //context is destroyed we have to shut down our daemon as well, by giving it
+ //a hint to shutdown
+
+ //TODO this is probably not needed because we run in a daemon thread anyway
+ //so the servlet should not have a problem to shut it down externally
+ /* RefreshContext rContext = (RefreshContext) evt.getServletContext().getAttribute("RefreshContext");
+ rContext.getDaemon().setRunning(false);
+ */
+ }
+}