use of org.eclipse.jetty.servlet.ErrorPageErrorHandler in project oozie by apache.
the class EmbeddedServletContainer method getErrorHandler.
/**
* Returns an error page handler
* @return
*/
private ErrorPageErrorHandler getErrorHandler() {
ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
errorHandler.addErrorPage(HttpServletResponse.SC_BAD_REQUEST, "/error");
errorHandler.addErrorPage(HttpServletResponse.SC_UNAUTHORIZED, "/error");
errorHandler.addErrorPage(HttpServletResponse.SC_FORBIDDEN, "/error");
errorHandler.addErrorPage(HttpServletResponse.SC_NOT_FOUND, "/error");
errorHandler.addErrorPage(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "/error");
errorHandler.addErrorPage(HttpServletResponse.SC_CONFLICT, "/error");
errorHandler.addErrorPage(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "/error");
errorHandler.addErrorPage(HttpServletResponse.SC_NOT_IMPLEMENTED, "/error");
errorHandler.addErrorPage(HttpServletResponse.SC_SERVICE_UNAVAILABLE, "/error");
errorHandler.addErrorPage("java.lang.Throwable", "/error");
return errorHandler;
}
use of org.eclipse.jetty.servlet.ErrorPageErrorHandler in project oozie by apache.
the class EmbeddedOozieServer method addErrorHandler.
private void addErrorHandler() {
ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
errorHandler.addErrorPage(HttpServletResponse.SC_BAD_REQUEST, "/error");
errorHandler.addErrorPage(HttpServletResponse.SC_UNAUTHORIZED, "/error");
errorHandler.addErrorPage(HttpServletResponse.SC_FORBIDDEN, "/error");
errorHandler.addErrorPage(HttpServletResponse.SC_NOT_FOUND, "/error");
errorHandler.addErrorPage(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "/error");
errorHandler.addErrorPage(HttpServletResponse.SC_CONFLICT, "/error");
errorHandler.addErrorPage(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "/error");
errorHandler.addErrorPage(HttpServletResponse.SC_NOT_IMPLEMENTED, "/error");
errorHandler.addErrorPage(HttpServletResponse.SC_SERVICE_UNAVAILABLE, "/error");
errorHandler.addErrorPage("java.lang.Throwable", "/error");
servletContextHandler.setErrorHandler(errorHandler);
}
use of org.eclipse.jetty.servlet.ErrorPageErrorHandler in project streamline by hortonworks.
the class StreamlineApplication method registerResources.
private void registerResources(StreamlineConfiguration configuration, Environment environment, Subject subject) throws ConfigException, ClassNotFoundException, IllegalAccessException, InstantiationException {
StorageManager storageManager = getDao(configuration);
TransactionManager transactionManager;
if (storageManager instanceof TransactionManager) {
transactionManager = (TransactionManager) storageManager;
} else {
transactionManager = new NOOPTransactionManager();
}
environment.jersey().register(new TransactionEventListener(transactionManager, true));
Collection<Class<? extends Storable>> streamlineEntities = getStorableEntities();
storageManager.registerStorables(streamlineEntities);
LOG.info("Registered streamline entities {}", streamlineEntities);
FileStorage fileStorage = this.getJarStorage(configuration, storageManager);
int appPort = ((HttpConnectorFactory) ((DefaultServerFactory) configuration.getServerFactory()).getApplicationConnectors().get(0)).getPort();
String catalogRootUrl = configuration.getCatalogRootUrl().replaceFirst("8080", appPort + "");
List<ModuleConfiguration> modules = configuration.getModules();
List<Object> resourcesToRegister = new ArrayList<>();
// add StreamlineConfigResource
resourcesToRegister.add(new StreamlineConfigurationResource(configuration));
// authorizer
StreamlineAuthorizer authorizer;
AuthorizerConfiguration authorizerConf = configuration.getAuthorizerConfiguration();
SecurityCatalogService securityCatalogService = new SecurityCatalogService(storageManager);
if (authorizerConf != null) {
authorizer = ((Class<StreamlineAuthorizer>) Class.forName(authorizerConf.getClassName())).newInstance();
Map<String, Object> authorizerConfig = new HashMap<>();
authorizerConfig.put(DefaultStreamlineAuthorizer.CONF_CATALOG_SERVICE, securityCatalogService);
authorizerConfig.put(DefaultStreamlineAuthorizer.CONF_ADMIN_PRINCIPALS, authorizerConf.getAdminPrincipals());
authorizer.init(authorizerConfig);
String filterClazzName = authorizerConf.getContainerRequestFilter();
ContainerRequestFilter filter;
if (StringUtils.isEmpty(filterClazzName)) {
// default
filter = new StreamlineKerberosRequestFilter();
} else {
filter = ((Class<ContainerRequestFilter>) Class.forName(filterClazzName)).newInstance();
}
LOG.info("Registering ContainerRequestFilter: {}", filter.getClass().getCanonicalName());
environment.jersey().register(filter);
} else {
LOG.info("Authorizer config not set, setting noop authorizer");
String noopAuthorizerClassName = "com.hortonworks.streamline.streams.security.impl.NoopAuthorizer";
authorizer = ((Class<StreamlineAuthorizer>) Class.forName(noopAuthorizerClassName)).newInstance();
}
for (ModuleConfiguration moduleConfiguration : modules) {
String moduleName = moduleConfiguration.getName();
String moduleClassName = moduleConfiguration.getClassName();
LOG.info("Registering module [{}] with class [{}]", moduleName, moduleClassName);
ModuleRegistration moduleRegistration = (ModuleRegistration) Class.forName(moduleClassName).newInstance();
if (moduleConfiguration.getConfig() == null) {
moduleConfiguration.setConfig(new HashMap<String, Object>());
}
if (moduleName.equals(Constants.CONFIG_STREAMS_MODULE)) {
moduleConfiguration.getConfig().put(Constants.CONFIG_CATALOG_ROOT_URL, catalogRootUrl);
}
Map<String, Object> initConfig = new HashMap<>(moduleConfiguration.getConfig());
initConfig.put(Constants.CONFIG_AUTHORIZER, authorizer);
initConfig.put(Constants.CONFIG_SECURITY_CATALOG_SERVICE, securityCatalogService);
initConfig.put(Constants.CONFIG_SUBJECT, subject);
if ((initConfig.get("proxyUrl") != null) && (configuration.getHttpProxyUrl() == null || configuration.getHttpProxyUrl().isEmpty())) {
LOG.warn("Please move proxyUrl, proxyUsername and proxyPassword configuration properties under streams module to httpProxyUrl, " + "httpProxyUsername and httpProxyPassword respectively at top level in your streamline.yaml");
configuration.setHttpProxyUrl((String) initConfig.get("proxyUrl"));
configuration.setHttpProxyUsername((String) initConfig.get("proxyUsername"));
configuration.setHttpProxyPassword((String) initConfig.get("proxyPassword"));
}
// pass http proxy information from top level config to each module. Up to them how they want to use it. Currently used in StreamsModule
initConfig.put(Constants.CONFIG_HTTP_PROXY_URL, configuration.getHttpProxyUrl());
initConfig.put(Constants.CONFIG_HTTP_PROXY_USERNAME, configuration.getHttpProxyUsername());
initConfig.put(Constants.CONFIG_HTTP_PROXY_PASSWORD, configuration.getHttpProxyPassword());
moduleRegistration.init(initConfig, fileStorage);
if (moduleRegistration instanceof StorageManagerAware) {
LOG.info("Module [{}] is StorageManagerAware and setting StorageManager.", moduleName);
StorageManagerAware storageManagerAware = (StorageManagerAware) moduleRegistration;
storageManagerAware.setStorageManager(storageManager);
}
if (moduleRegistration instanceof TransactionManagerAware) {
LOG.info("Module [{}] is TransactionManagerAware and setting TransactionManager.", moduleName);
TransactionManagerAware transactionManagerAware = (TransactionManagerAware) moduleRegistration;
transactionManagerAware.setTransactionManager(transactionManager);
}
resourcesToRegister.addAll(moduleRegistration.getResources());
}
LOG.info("Registering resources to Jersey environment: [{}]", resourcesToRegister);
for (Object resource : resourcesToRegister) {
environment.jersey().register(resource);
}
environment.jersey().register(MultiPartFeature.class);
final ErrorPageErrorHandler errorPageErrorHandler = new ErrorPageErrorHandler();
errorPageErrorHandler.addErrorPage(Response.Status.UNAUTHORIZED.getStatusCode(), "/401.html");
environment.getApplicationContext().setErrorHandler(errorPageErrorHandler);
}
use of org.eclipse.jetty.servlet.ErrorPageErrorHandler in project jetty.project by eclipse.
the class StandardDescriptorProcessor method visitErrorPage.
public void visitErrorPage(WebAppContext context, Descriptor descriptor, XmlParser.Node node) {
String error = node.getString("error-code", false, true);
int code = 0;
if (error == null || error.length() == 0) {
error = node.getString("exception-type", false, true);
if (error == null || error.length() == 0)
error = ErrorPageErrorHandler.GLOBAL_ERROR_PAGE;
} else
code = Integer.valueOf(error);
String location = node.getString("location", false, true);
if (!location.startsWith("/"))
throw new IllegalStateException("Missing leading '/' for location: " + location);
ErrorPageErrorHandler handler = (ErrorPageErrorHandler) context.getErrorHandler();
String originName = "error." + error;
switch(context.getMetaData().getOrigin(originName)) {
case NotSet:
{
//no error page setup for this code or exception yet
if (code > 0)
handler.addErrorPage(code, location);
else
handler.addErrorPage(error, location);
context.getMetaData().setOrigin("error." + error, descriptor);
break;
}
case WebXml:
case WebDefaults:
case WebOverride:
{
//an error page setup was set in web.xml/webdefault.xml/web-override.xml, only allow other web xml descriptors to override it
if (!(descriptor instanceof FragmentDescriptor)) {
//if set twice in the same descriptor, its an error
Descriptor originDescriptor = context.getMetaData().getOriginDescriptor(originName);
if (descriptor == originDescriptor)
throw new IllegalStateException("Duplicate error-page " + error + " at " + location);
if (code > 0)
handler.addErrorPage(code, location);
else
handler.addErrorPage(error, location);
context.getMetaData().setOrigin("error." + error, descriptor);
}
break;
}
case WebFragment:
{
//another web fragment set the same error code or exception, if its different its an error
if (!handler.getErrorPages().get(error).equals(location))
throw new IllegalStateException("Conflicting error-code or exception-type " + error + " in " + descriptor.getResource());
break;
}
default:
// TODO throw ISE?
LOG.warn(new Throwable());
}
}
use of org.eclipse.jetty.servlet.ErrorPageErrorHandler in project jetty.project by eclipse.
the class QuickStartDescriptorGenerator method generateQuickStartWebXml.
/**
* Perform the generation of the xml file
* @param stream the stream to generate the quickstart-web.xml to
* @throws IOException if unable to generate the quickstart-web.xml
* @throws FileNotFoundException if unable to find the file
*/
public void generateQuickStartWebXml(OutputStream stream) throws FileNotFoundException, IOException {
if (_webApp == null)
throw new IllegalStateException("No webapp for quickstart generation");
if (stream == null)
throw new IllegalStateException("No output for quickstart generation");
_webApp.getMetaData().getOrigins();
if (_webApp.getBaseResource() == null)
throw new IllegalArgumentException("No base resource for " + this);
LOG.info("Quickstart generating");
XmlAppendable out = new XmlAppendable(stream, "UTF-8");
MetaData md = _webApp.getMetaData();
Map<String, String> webappAttr = new HashMap<>();
webappAttr.put("xmlns", "http://xmlns.jcp.org/xml/ns/javaee");
webappAttr.put("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
webappAttr.put("xsi:schemaLocation", "http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd");
webappAttr.put("metadata-complete", "true");
webappAttr.put("version", "3.1");
out.openTag("web-app", webappAttr);
if (_webApp.getDisplayName() != null)
out.tag("display-name", _webApp.getDisplayName());
// Set some special context parameters
// The location of the war file on disk
AttributeNormalizer normalizer = new AttributeNormalizer(_webApp.getBaseResource());
// The library order
addContextParamFromAttribute(out, ServletContext.ORDERED_LIBS);
//the servlet container initializers
addContextParamFromAttribute(out, AnnotationConfiguration.CONTAINER_INITIALIZERS);
//the tlds discovered
addContextParamFromAttribute(out, MetaInfConfiguration.METAINF_TLDS, normalizer);
//the META-INF/resources discovered
addContextParamFromAttribute(out, MetaInfConfiguration.METAINF_RESOURCES, normalizer);
//add the name of the origin attribute, if it is being used
if (_generateOrigin) {
out.openTag("context-param").tag("param-name", ORIGIN).tag("param-value", _originAttribute).closeTag();
}
// init params
for (String p : _webApp.getInitParams().keySet()) out.openTag("context-param", origin(md, "context-param." + p)).tag("param-name", p).tag("param-value", _webApp.getInitParameter(p)).closeTag();
if (_webApp.getEventListeners() != null)
for (EventListener e : _webApp.getEventListeners()) out.openTag("listener", origin(md, e.getClass().getCanonicalName() + ".listener")).tag("listener-class", e.getClass().getCanonicalName()).closeTag();
ServletHandler servlets = _webApp.getServletHandler();
if (servlets.getFilters() != null) {
for (FilterHolder holder : servlets.getFilters()) outholder(out, md, holder);
}
if (servlets.getFilterMappings() != null) {
for (FilterMapping mapping : servlets.getFilterMappings()) {
out.openTag("filter-mapping");
out.tag("filter-name", mapping.getFilterName());
if (mapping.getPathSpecs() != null)
for (String s : mapping.getPathSpecs()) out.tag("url-pattern", s);
if (mapping.getServletNames() != null)
for (String n : mapping.getServletNames()) out.tag("servlet-name", n);
if (!mapping.isDefaultDispatches()) {
if (mapping.appliesTo(DispatcherType.REQUEST))
out.tag("dispatcher", "REQUEST");
if (mapping.appliesTo(DispatcherType.ASYNC))
out.tag("dispatcher", "ASYNC");
if (mapping.appliesTo(DispatcherType.ERROR))
out.tag("dispatcher", "ERROR");
if (mapping.appliesTo(DispatcherType.FORWARD))
out.tag("dispatcher", "FORWARD");
if (mapping.appliesTo(DispatcherType.INCLUDE))
out.tag("dispatcher", "INCLUDE");
}
out.closeTag();
}
}
if (servlets.getServlets() != null) {
for (ServletHolder holder : servlets.getServlets()) outholder(out, md, holder);
}
if (servlets.getServletMappings() != null) {
for (ServletMapping mapping : servlets.getServletMappings()) {
out.openTag("servlet-mapping", origin(md, mapping.getServletName() + ".servlet.mappings"));
out.tag("servlet-name", mapping.getServletName());
if (mapping.getPathSpecs() != null)
for (String s : mapping.getPathSpecs()) out.tag("url-pattern", s);
out.closeTag();
}
}
// Security elements
SecurityHandler security = _webApp.getSecurityHandler();
if (security != null && (security.getRealmName() != null || security.getAuthMethod() != null)) {
out.openTag("login-config");
if (security.getAuthMethod() != null)
out.tag("auth-method", origin(md, "auth-method"), security.getAuthMethod());
if (security.getRealmName() != null)
out.tag("realm-name", origin(md, "realm-name"), security.getRealmName());
if (Constraint.__FORM_AUTH.equalsIgnoreCase(security.getAuthMethod())) {
out.openTag("form-login-config");
out.tag("form-login-page", origin(md, "form-login-page"), security.getInitParameter(FormAuthenticator.__FORM_LOGIN_PAGE));
out.tag("form-error-page", origin(md, "form-error-page"), security.getInitParameter(FormAuthenticator.__FORM_ERROR_PAGE));
out.closeTag();
}
out.closeTag();
}
if (security instanceof ConstraintAware) {
ConstraintAware ca = (ConstraintAware) security;
for (String r : ca.getRoles()) out.openTag("security-role").tag("role-name", r).closeTag();
for (ConstraintMapping m : ca.getConstraintMappings()) {
out.openTag("security-constraint");
out.openTag("web-resource-collection");
{
if (m.getConstraint().getName() != null)
out.tag("web-resource-name", m.getConstraint().getName());
if (m.getPathSpec() != null)
out.tag("url-pattern", origin(md, "constraint.url." + m.getPathSpec()), m.getPathSpec());
if (m.getMethod() != null)
out.tag("http-method", m.getMethod());
if (m.getMethodOmissions() != null)
for (String o : m.getMethodOmissions()) out.tag("http-method-omission", o);
out.closeTag();
}
if (m.getConstraint().getAuthenticate()) {
String[] roles = m.getConstraint().getRoles();
if (roles != null && roles.length > 0) {
out.openTag("auth-constraint");
if (m.getConstraint().getRoles() != null)
for (String r : m.getConstraint().getRoles()) out.tag("role-name", r);
out.closeTag();
} else
out.tag("auth-constraint");
}
switch(m.getConstraint().getDataConstraint()) {
case Constraint.DC_NONE:
out.openTag("user-data-constraint").tag("transport-guarantee", "NONE").closeTag();
break;
case Constraint.DC_INTEGRAL:
out.openTag("user-data-constraint").tag("transport-guarantee", "INTEGRAL").closeTag();
break;
case Constraint.DC_CONFIDENTIAL:
out.openTag("user-data-constraint").tag("transport-guarantee", "CONFIDENTIAL").closeTag();
break;
default:
break;
}
out.closeTag();
}
}
if (_webApp.getWelcomeFiles() != null) {
out.openTag("welcome-file-list");
for (String welcomeFile : _webApp.getWelcomeFiles()) {
out.tag("welcome-file", welcomeFile);
}
out.closeTag();
}
Map<String, String> localeEncodings = _webApp.getLocaleEncodings();
if (localeEncodings != null && !localeEncodings.isEmpty()) {
out.openTag("locale-encoding-mapping-list");
for (Map.Entry<String, String> entry : localeEncodings.entrySet()) {
out.openTag("locale-encoding-mapping", origin(md, "locale-encoding." + entry.getKey()));
out.tag("locale", entry.getKey());
out.tag("encoding", entry.getValue());
out.closeTag();
}
out.closeTag();
}
//session-config
if (_webApp.getSessionHandler() != null) {
out.openTag("session-config");
int maxInactiveSec = _webApp.getSessionHandler().getMaxInactiveInterval();
out.tag("session-timeout", (maxInactiveSec == 0 ? "0" : Integer.toString(maxInactiveSec / 60)));
//cookie-config
SessionCookieConfig cookieConfig = _webApp.getSessionHandler().getSessionCookieConfig();
if (cookieConfig != null) {
out.openTag("cookie-config");
if (cookieConfig.getName() != null)
out.tag("name", origin(md, "cookie-config.name"), cookieConfig.getName());
if (cookieConfig.getDomain() != null)
out.tag("domain", origin(md, "cookie-config.domain"), cookieConfig.getDomain());
if (cookieConfig.getPath() != null)
out.tag("path", origin(md, "cookie-config.path"), cookieConfig.getPath());
if (cookieConfig.getComment() != null)
out.tag("comment", origin(md, "cookie-config.comment"), cookieConfig.getComment());
out.tag("http-only", origin(md, "cookie-config.http-only"), Boolean.toString(cookieConfig.isHttpOnly()));
out.tag("secure", origin(md, "cookie-config.secure"), Boolean.toString(cookieConfig.isSecure()));
out.tag("max-age", origin(md, "cookie-config.max-age"), Integer.toString(cookieConfig.getMaxAge()));
out.closeTag();
}
// tracking-modes
Set<SessionTrackingMode> modes = _webApp.getSessionHandler().getEffectiveSessionTrackingModes();
if (modes != null) {
for (SessionTrackingMode mode : modes) out.tag("tracking-mode", mode.toString());
}
out.closeTag();
}
//error-pages
Map<String, String> errorPages = ((ErrorPageErrorHandler) _webApp.getErrorHandler()).getErrorPages();
if (errorPages != null) {
for (Map.Entry<String, String> entry : errorPages.entrySet()) {
out.openTag("error-page", origin(md, "error." + entry.getKey()));
//a global or default error page has no code or exception
if (!ErrorPageErrorHandler.GLOBAL_ERROR_PAGE.equals(entry.getKey())) {
if (entry.getKey().matches("\\d{3}"))
out.tag("error-code", entry.getKey());
else
out.tag("exception-type", entry.getKey());
}
out.tag("location", entry.getValue());
out.closeTag();
}
}
//mime-types
MimeTypes mimeTypes = _webApp.getMimeTypes();
if (mimeTypes != null) {
for (Map.Entry<String, String> entry : mimeTypes.getMimeMap().entrySet()) {
out.openTag("mime-mapping");
out.tag("extension", origin(md, "extension." + entry.getKey()), entry.getKey());
out.tag("mime-type", entry.getValue());
out.closeTag();
}
}
//jsp-config
JspConfig jspConfig = (JspConfig) _webApp.getServletContext().getJspConfigDescriptor();
if (jspConfig != null) {
out.openTag("jsp-config");
Collection<TaglibDescriptor> tlds = jspConfig.getTaglibs();
if (tlds != null && !tlds.isEmpty()) {
for (TaglibDescriptor tld : tlds) {
out.openTag("taglib");
out.tag("taglib-uri", tld.getTaglibURI());
out.tag("taglib-location", tld.getTaglibLocation());
out.closeTag();
}
}
Collection<JspPropertyGroupDescriptor> jspPropertyGroups = jspConfig.getJspPropertyGroups();
if (jspPropertyGroups != null && !jspPropertyGroups.isEmpty()) {
for (JspPropertyGroupDescriptor jspPropertyGroup : jspPropertyGroups) {
out.openTag("jsp-property-group");
Collection<String> strings = jspPropertyGroup.getUrlPatterns();
if (strings != null && !strings.isEmpty()) {
for (String urlPattern : strings) out.tag("url-pattern", urlPattern);
}
if (jspPropertyGroup.getElIgnored() != null)
out.tag("el-ignored", jspPropertyGroup.getElIgnored());
if (jspPropertyGroup.getPageEncoding() != null)
out.tag("page-encoding", jspPropertyGroup.getPageEncoding());
if (jspPropertyGroup.getScriptingInvalid() != null)
out.tag("scripting-invalid", jspPropertyGroup.getScriptingInvalid());
if (jspPropertyGroup.getIsXml() != null)
out.tag("is-xml", jspPropertyGroup.getIsXml());
if (jspPropertyGroup.getDeferredSyntaxAllowedAsLiteral() != null)
out.tag("deferred-syntax-allowed-as-literal", jspPropertyGroup.getDeferredSyntaxAllowedAsLiteral());
if (jspPropertyGroup.getTrimDirectiveWhitespaces() != null)
out.tag("trim-directive-whitespaces", jspPropertyGroup.getTrimDirectiveWhitespaces());
if (jspPropertyGroup.getDefaultContentType() != null)
out.tag("default-content-type", jspPropertyGroup.getDefaultContentType());
if (jspPropertyGroup.getBuffer() != null)
out.tag("buffer", jspPropertyGroup.getBuffer());
if (jspPropertyGroup.getErrorOnUndeclaredNamespace() != null)
out.tag("error-on-undeclared-namespace", jspPropertyGroup.getErrorOnUndeclaredNamespace());
strings = jspPropertyGroup.getIncludePreludes();
if (strings != null && !strings.isEmpty()) {
for (String prelude : strings) out.tag("include-prelude", prelude);
}
strings = jspPropertyGroup.getIncludeCodas();
if (strings != null && !strings.isEmpty()) {
for (String coda : strings) out.tag("include-coda", coda);
}
out.closeTag();
}
}
out.closeTag();
}
//lifecycle: post-construct, pre-destroy
LifeCycleCallbackCollection lifecycles = ((LifeCycleCallbackCollection) _webApp.getAttribute(LifeCycleCallbackCollection.LIFECYCLE_CALLBACK_COLLECTION));
if (lifecycles != null) {
Collection<LifeCycleCallback> tmp = lifecycles.getPostConstructCallbacks();
for (LifeCycleCallback c : tmp) {
out.openTag("post-construct");
out.tag("lifecycle-callback-class", c.getTargetClassName());
out.tag("lifecycle-callback-method", c.getMethodName());
out.closeTag();
}
tmp = lifecycles.getPreDestroyCallbacks();
for (LifeCycleCallback c : tmp) {
out.openTag("pre-destroy");
out.tag("lifecycle-callback-class", c.getTargetClassName());
out.tag("lifecycle-callback-method", c.getMethodName());
out.closeTag();
}
}
out.literal(_extraXML);
out.closeTag();
}
Aggregations