in blocks/cocoon-xsp/cocoon-xsp-impl/src/main/java/org/apache/cocoon/components/language/generator/ProgramGeneratorImpl.java [204:377]
public CompiledComponent load(ServiceManager newManager,
Source source,
String markupLanguageName,
String programmingLanguageName,
SourceResolver resolver)
throws Exception {
final String id = source.getURI();
ProgrammingLanguage programmingLanguage = null;
MarkupLanguage markupLanguage = null;
try {
// Create file name for the program generated from the provided source.
final String normalizedName = getNormalizedName(id);
if (getLogger().isDebugEnabled()) {
getLogger().debug("Loading serverpage systemId=[" + id + "]" +
" markupLanguageName=[" + markupLanguageName + "]" +
" programmingLanguageName=[" + programmingLanguageName + "]" +
" -> normalizedName=[" + normalizedName + "]");
}
markupLanguage = (MarkupLanguage) this.markupSelector.select(markupLanguageName);
programmingLanguage = (ProgrammingLanguage) this.languageSelector.select(programmingLanguageName);
programmingLanguage.setLanguageName(programmingLanguageName);
Program program = null;
CompiledComponent programInstance = null;
// Attempt to load program object from cache
try {
programInstance = (CompiledComponent) this.cache.select(normalizedName);
} catch (Exception e) {
if (getLogger().isDebugEnabled()) {
getLogger().debug("The serverpage [" + id + "] is not in the cache yet");
}
}
if (programInstance == null && this.preload) {
// Preloading: Load program if its source/[object file] is available
try {
program = programmingLanguage.preload(normalizedName,
this.workDir,
markupLanguage.getEncoding());
this.cache.addGenerator(newManager, normalizedName, program);
programInstance = (CompiledComponent) this.cache.select(normalizedName);
if (getLogger().isDebugEnabled()) {
getLogger().debug("Successfully preloaded serverpage [" + id + "]");
}
} catch (Exception e) {
if (getLogger().isInfoEnabled()) {
getLogger().info("The serverpage [" + id
+ "] could not be preloaded, will be re-created ("
+ e + ")");
}
}
}
if (programInstance == null) {
synchronized (this) {
// Attempt again to load program object from cache.
// This avoids that simultaneous requests recompile
// the same XSP over and over again.
try {
programInstance = (CompiledComponent) this.cache.select(normalizedName);
if (getLogger().isDebugEnabled()) {
getLogger().debug("The serverpage [" + id + "] was now in the cache");
}
} catch (Exception e) {
// no instance found
if (getLogger().isDebugEnabled()) {
getLogger().debug("Creating new serverpage for [" + id + "]");
}
generateSourcecode(source,
normalizedName,
markupLanguage,
programmingLanguage);
programInstance = loadProgram(newManager,
normalizedName,
markupLanguage,
programmingLanguage);
}
}
} else {
// found an instance
if (this.autoReload) {
long sourceLastModified = source.getLastModified();
// Has XSP changed?
// Note : lastModified can be 0 if source is dynamically generated.
// In that case, let the program instance decide if it is modified or not.
if (programInstance.modifiedSince(sourceLastModified)) {
if (getLogger().isDebugEnabled()) {
getLogger().debug("ReCreating serverpage for [" + id + "]");
}
synchronized (this) {
if (getLogger().isDebugEnabled()) {
getLogger().debug("Releasing old serverpage program [" + id + "]");
}
release(programInstance);
programmingLanguage.unload(program, normalizedName, this.workDir);
this.cache.removeGenerator(normalizedName);
programInstance = null;
program = null;
generateSourcecode(source,
normalizedName,
markupLanguage,
programmingLanguage);
programInstance = loadProgram(newManager,
normalizedName,
markupLanguage,
programmingLanguage);
}
} else {
// check the repository for changes at all?
if (this.watchSource) {
if (getLogger().isDebugEnabled()) {
getLogger().debug("Checking sourcecode of [" + id + "] for a change");
}
File sourcecodeFile = new File(this.workDir,
normalizedName + "." + programmingLanguage.getSourceExtension());
// has sourcecode in repository changed ?
if (sourcecodeFile != null && sourcecodeFile.exists()) {
long sourcecodeLastModified = sourcecodeFile.lastModified();
if (sourcecodeLastModified > sourceLastModified
|| sourceLastModified == 0
|| sourcecodeLastModified == 0) {
if (getLogger().isDebugEnabled()) {
getLogger().debug("Create new serverpage program for [" + id + "] - repository has changed");
}
synchronized (this) {
if (getLogger().isDebugEnabled()) {
getLogger().debug("Releasing old serverpage program [" + id + "]");
}
release(programInstance);
//programmingLanguage.unload(program, normalizedName, this.workDir);
this.cache.removeGenerator(normalizedName);
programInstance = null;
program = null;
programInstance = loadProgram(newManager,
normalizedName,
markupLanguage,
programmingLanguage);
}
} else {
if (getLogger().isDebugEnabled()) {
getLogger().debug("Sourcecode of [" + id + "] has not changed - returning program from cache");
}
}
} else {
if (getLogger().isErrorEnabled()) {
getLogger().error("Could not find sourcecode for [" + id + "]");
}
}
}
}
} else {
if (getLogger().isDebugEnabled()) {
getLogger().debug("Not checking for modifications [autoReload=false] - using current version");
}
}
}
return programInstance;
} finally {
this.markupSelector.release(markupLanguage);
this.languageSelector.release(programmingLanguage);
}
}