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().isErrorEnabled()) {
getLogger().error("The serverpage [" + id + "] could not be preloaded");
}
}
}
if (programInstance == null) {
// no instance found
if (getLogger().isDebugEnabled()) {
getLogger().debug("Creating new serverpage for [" + id + "]");
}
synchronized (this) {
generateSourcecode(source, normalizedName, markupLanguage, programmingLanguage, resolver);
programInstance = loadProgram(newManager, source, normalizedName, markupLanguage, programmingLanguage, resolver);
}
}
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, resolver);
programInstance = loadProgram(newManager, source, normalizedName, markupLanguage, programmingLanguage, resolver);
}
}
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()) {