You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by tc...@apache.org on 2005/02/20 23:27:49 UTC
svn commit: r154567 - in
jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci:
ReloadingClassLoader.java monitor/Test.java
Author: tcurdt
Date: Sun Feb 20 14:27:49 2005
New Revision: 154567
URL: http://svn.apache.org/viewcvs?view=rev&rev=154567
Log:
reloading resources from a monitored repository
Added:
jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/ReloadingClassLoader.java
Removed:
jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/monitor/Test.java
Added: jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/ReloadingClassLoader.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/ReloadingClassLoader.java?view=auto&rev=154567
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/ReloadingClassLoader.java (added)
+++ jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/ReloadingClassLoader.java Sun Feb 20 14:27:49 2005
@@ -0,0 +1,177 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ *
+ * Licensed 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.commons.jci;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.jci.monitor.AlterationListener;
+import org.apache.commons.jci.monitor.AlterationMonitor;
+import org.apache.commons.jci.readers.FileResourceReader;
+import org.apache.commons.jci.readers.ResourceReader;
+import org.apache.commons.jci.stores.MemoryResourceStore;
+import org.apache.commons.jci.stores.ResourceStore;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * @author tcurdt
+ *
+ */
+public class ReloadingClassLoader extends ClassLoader {
+
+ private final static Log log = LogFactory.getLog(ReloadingClassLoader.class);
+
+ private final ClassLoader parent;
+ private final File repository;
+ private ClassLoader delegate;
+ private final ResourceStore store;
+ private final ResourceReader reader;
+ private final AlterationMonitor fam;
+
+ public ReloadingClassLoader(final ClassLoader pParent, final File pRepository) {
+ this(pParent, pRepository, new MemoryResourceStore());
+ }
+
+ public ReloadingClassLoader(final ClassLoader pParent, final File pRepository, final ResourceStore pStore) {
+ super(pParent);
+ parent = pParent;
+ repository = pRepository;
+ reader = new FileResourceReader(repository);
+ store = pStore;
+
+ fam = new AlterationMonitor(repository);
+
+ fam.addListener(new AlterationListener() {
+
+ private Collection created = new ArrayList();
+ private Collection changed = new ArrayList();
+ private Collection deleted = new ArrayList();
+
+ public void onStart() {
+ created.clear();
+ changed.clear();
+ deleted.clear();
+ }
+ public void onStop() {
+
+ boolean reload = false;
+
+ if (deleted.size() > 0) {
+ for (Iterator it = deleted.iterator(); it.hasNext();) {
+ final File file = (File) it.next();
+ store.remove(clazzName(fam.getRoot(), file));
+ }
+ reload = true;
+ }
+
+ if (created.size() > 0) {
+ for (Iterator it = created.iterator(); it.hasNext();) {
+ final File file = (File) it.next();
+ try {
+ final byte[] bytes = IOUtils.toByteArray(new FileReader(file));
+ store.write(clazzName(fam.getRoot(), file), bytes);
+ } catch(final Exception e) {
+ log.error("could not load " + file, e);
+ }
+ }
+ }
+
+ if (changed.size() > 0) {
+ reload = true;
+ }
+
+ if (reload) {
+ reload();
+ }
+ }
+
+ public void onCreateFile( final File file ) {
+ if (file.getName().endsWith(".class")) {
+ created.add(file);
+ }
+ }
+ public void onChangeFile( final File file ) {
+ if (file.getName().endsWith(".class")) {
+ changed.add(file);
+ }
+ }
+ public void onDeleteFile( final File file ) {
+ if (file.getName().endsWith(".class")) {
+ deleted.add(file);
+ }
+ }
+
+ public void onCreateDirectory( final File file ) {
+ }
+ public void onChangeDirectory( final File file ) {
+ }
+ public void onDeleteDirectory( final File file ) {
+ }
+ });
+
+ delegate = new ResourceStoreClassLoader(parent, store);
+
+ Thread myThread = new Thread(fam);
+ myThread.start();
+ }
+
+ private void reload() {
+ log.debug("reloading");
+ delegate = new ResourceStoreClassLoader(parent, store );
+
+ }
+
+ public static String clazzName( final File base, final File file ) {
+ final int rootLength = base.getAbsolutePath().length();
+ final String absFileName = file.getAbsolutePath();
+ final String relFileName = absFileName.substring(
+ rootLength + 1,
+ absFileName.length() - ".java".length()
+ );
+ final String clazzName = relFileName.replace(File.separatorChar,'.');
+ return clazzName;
+ }
+
+
+ public void clearAssertionStatus() {
+ delegate.clearAssertionStatus();
+ }
+ public URL getResource(String name) {
+ return delegate.getResource(name);
+ }
+ public InputStream getResourceAsStream(String name) {
+ return delegate.getResourceAsStream(name);
+ }
+ public Class loadClass(String name) throws ClassNotFoundException {
+ return delegate.loadClass(name);
+ }
+ public void setClassAssertionStatus(String className, boolean enabled) {
+ delegate.setClassAssertionStatus(className, enabled);
+ }
+ public void setDefaultAssertionStatus(boolean enabled) {
+ delegate.setDefaultAssertionStatus(enabled);
+ }
+ public void setPackageAssertionStatus(String packageName, boolean enabled) {
+ delegate.setPackageAssertionStatus(packageName, enabled);
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org