001: /*
002: * Copyright 1999-2004 The Apache Software Foundation.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package com.opensymphony.webwork.util.classloader.listeners;
017:
018: import com.opensymphony.webwork.util.classloader.ReloadingClassLoader;
019: import com.opensymphony.webwork.util.classloader.compilers.JavaCompiler;
020: import com.opensymphony.webwork.util.classloader.monitor.FilesystemAlterationListener;
021: import com.opensymphony.webwork.util.classloader.problems.CompilationProblem;
022: import com.opensymphony.webwork.util.classloader.problems.DefaultCompilationProblemHandler;
023: import com.opensymphony.webwork.util.classloader.problems.ConsoleCompilationProblemHandler;
024: import com.opensymphony.webwork.util.classloader.readers.ResourceReader;
025: import com.opensymphony.webwork.util.classloader.stores.TransactionalResourceStore;
026: import org.apache.commons.logging.Log;
027: import org.apache.commons.logging.LogFactory;
028:
029: import java.io.File;
030: import java.util.ArrayList;
031: import java.util.Collection;
032: import java.util.Iterator;
033: import java.util.List;
034:
035: public class CompilingListener implements FilesystemAlterationListener {
036:
037: private final static Log log = LogFactory
038: .getLog(CompilingListener.class);
039:
040: private final Collection created = new ArrayList();
041: private final Collection changed = new ArrayList();
042: private final Collection deleted = new ArrayList();
043: File pRepository;
044:
045: private final JavaCompiler compiler;
046: private final ResourceReader reader;
047: private final TransactionalResourceStore transactionalStore;
048: private final DefaultCompilationProblemHandler problemHandler = new ConsoleCompilationProblemHandler();
049:
050: public CompilingListener(final ResourceReader pReader,
051: final JavaCompiler pCompiler,
052: final TransactionalResourceStore pTransactionalStore) {
053: compiler = pCompiler;
054: reader = pReader;
055: transactionalStore = pTransactionalStore;
056: }
057:
058: public DefaultCompilationProblemHandler getCompilationProblemHandler() {
059: return problemHandler;
060: }
061:
062: public void onStart(final File pRepository) {
063: this .pRepository = pRepository;
064: created.clear();
065: changed.clear();
066: deleted.clear();
067: transactionalStore.onStart();
068: }
069:
070: public void onStop(final File pRepository) {
071: this .pRepository = pRepository;
072: log.debug("resources " + created.size() + " created, "
073: + changed.size() + " changed, " + deleted.size()
074: + " deleted");
075:
076: boolean reload = false;
077:
078: if (deleted.size() > 0) {
079: for (Iterator it = deleted.iterator(); it.hasNext();) {
080: final File file = (File) it.next();
081: transactionalStore.remove(ReloadingClassLoader
082: .clazzName(pRepository, file));
083: }
084: reload = true;
085: }
086:
087: final Collection compileables = new ArrayList();
088: compileables.addAll(created);
089: compileables.addAll(changed);
090:
091: final String[] clazzes = new String[compileables.size()];
092:
093: if (compileables.size() > 0) {
094:
095: int i = 0;
096: for (Iterator it = compileables.iterator(); it.hasNext();) {
097: final File file = (File) it.next();
098: clazzes[i] = ReloadingClassLoader.clazzName(
099: pRepository, file);
100: //log.debug(clazzes[i]);
101: i++;
102: }
103:
104: compiler.compile(clazzes, reader, transactionalStore,
105: problemHandler);
106:
107: final CompilationProblem[] errors = problemHandler
108: .getErrors();
109: final CompilationProblem[] warnings = problemHandler
110: .getWarnings();
111:
112: log.debug(errors.length + " errors, " + warnings.length
113: + " warnings");
114:
115: if (errors.length > 0) {
116: for (int j = 0; j < clazzes.length; j++) {
117: transactionalStore.remove(clazzes[j]);
118: }
119: }
120:
121: reload = true;
122:
123: }
124:
125: transactionalStore.onStop();
126:
127: if (reload) {
128: reload();
129: }
130: }
131:
132: public void onCreateFile(final File file) {
133: if (file.getName().endsWith(".java")) {
134: created.add(file);
135: }
136: }
137:
138: public void onChangeFile(final File file) {
139: if (file.getName().endsWith(".java")) {
140: changed.add(file);
141: }
142: }
143:
144: public void onDeleteFile(final File file) {
145: if (file.getName().endsWith(".java")) {
146: deleted.add(file);
147: }
148: }
149:
150: public void onCreateDirectory(final File file) {
151: }
152:
153: public void onChangeDirectory(final File file) {
154: }
155:
156: public void onDeleteDirectory(final File file) {
157: }
158:
159: protected void reload() {
160: log.debug("reload");
161: }
162: }
|