in src/main/java/org/apache/sling/jcr/base/internal/loader/Loader.java [242:322]
private boolean registerNodeTypes(Bundle bundle, boolean isRetry) throws RepositoryException {
// TODO: define header referring to mapper files
String typesHeader = bundle.getHeaders().get(NODETYPES_BUNDLE_HEADER);
if (typesHeader == null) {
// no node types in the bundle, return with success
logger.debug("registerNodeTypes: Bundle {} has no nodetypes",
getBundleIdentifier(bundle));
return true;
}
boolean success = true;
Session session = this.getSession();
try {
StringTokenizer tokener = new StringTokenizer(typesHeader, ",");
while (tokener.hasMoreTokens()) {
String nodeTypeFile = tokener.nextToken().trim();
Map<String,String> nodeTypeFileParams = new HashMap<String,String>();
nodeTypeFileParams.put("reregister", "true");
if (nodeTypeFile.contains(";")) {
int idx = nodeTypeFile.indexOf(';');
String nodeTypeFileParam = nodeTypeFile.substring(idx + 1);
String[] params = nodeTypeFileParam.split(":=");
nodeTypeFileParams.put(params[0], params[1]);
nodeTypeFile = nodeTypeFile.substring(0, idx);
}
URL mappingURL = bundle.getEntry(nodeTypeFile);
if (mappingURL == null) {
// if we are retrying we already logged this message once, so we won't log it again
if ( !isRetry ) {
logger.warn("Custom node type definition {} not found in bundle {}", nodeTypeFile, getBundleIdentifier(bundle));
}
continue;
}
InputStream ins = null;
try {
// laod the node types
ins = mappingURL.openStream();
String reregister = nodeTypeFileParams.get("reregister");
boolean reregisterBool = Boolean.valueOf(reregister);
NodeTypeLoader.registerNodeType(session, mappingURL.toString(), new InputStreamReader(ins), reregisterBool);
// log a message if retry is successful
if ( isRetry ) {
logger.info("Retrying to register node types from {} in bundle {} succeeded.",
new Object[]{ nodeTypeFile, getBundleIdentifier(bundle)});
}
} catch (IOException ioe) {
success = false;
// if we are retrying we already logged this message once, so we won't log it again
if ( !isRetry ) {
logger.warn("Cannot read node types {} from bundle {}: {}",
new Object[]{ nodeTypeFile, getBundleIdentifier(bundle), ioe });
logger.warn("Stacktrace ", ioe);
}
} catch (Exception e) {
success = false;
// if we are retrying we already logged this message once, so we won't log it again
if ( !isRetry ) {
logger.error("Error loading node types {} from bundle {}: {}",
new Object[]{ nodeTypeFile, getBundleIdentifier(bundle), e });
logger.error("Stacktrace ", e);
}
} finally {
if (ins != null) {
try {
ins.close();
} catch (IOException ioe) {
// ignore
}
}
}
}
} finally {
this.ungetSession(session);
}
return success;
}