/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2010-2011 The OpenNMS Group, Inc.
* OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc.
*
* OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
*
* OpenNMS(R) is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* OpenNMS(R) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenNMS(R). If not, see:
* http://www.gnu.org/licenses/
*
* For more information contact:
* OpenNMS(R) Licensing <license@opennms.org>
* http://www.opennms.org/
* http://www.opennms.com/
*******************************************************************************/
package org.opennms.web.controller.admin.support;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.opennms.core.utils.LogUtils;
import org.opennms.systemreport.SystemReportFormatter;
import org.opennms.systemreport.SystemReportPlugin;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.view.InternalResourceView;
public final class FormatterView implements View {
private SystemReportFormatter m_formatter = null;
private InternalResourceView m_view = null;
public FormatterView(final SystemReportFormatter formatter) {
super();
m_formatter = formatter;
if (m_formatter == null || !m_formatter.needsOutputStream() || m_formatter.getContentType() == null) {
m_view = new InternalResourceView("/admin/support/systemReportList.htm");
}
LogUtils.debugf(this, "formatter = %s, view = %s", m_formatter, m_view);
}
public String getContentType() {
if (m_view != null) return m_view.getContentType();
if (m_formatter == null) return "application/octet-stream";
return m_formatter.getContentType();
}
public void render(final Map<String, ?> model, final HttpServletRequest request, final HttpServletResponse response) throws Exception {
if (m_view == null) {
String fileName = getFileName(request);
response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
} else {
final String outputParameter = request.getParameter("output");
m_formatter.setOutput(outputParameter);
}
if (model.containsKey("report")) {
final SystemReportInfo info = (SystemReportInfo)model.get("report");
LogUtils.debugf(this, "found report = %s", info);
final OutputStream output;
if (m_view == null) {
output = response.getOutputStream();
} else {
output = new OutputStream() {
@Override
public void write(int b) throws IOException {}
};
}
try {
LogUtils.debugf(this, "beginning output");
m_formatter.setOutputStream(output);
m_formatter.begin();
for (final SystemReportPlugin plugin : info.getPlugins()) {
LogUtils.debugf(this, "running plugin %s", plugin);
m_formatter.write(plugin);
output.flush();
}
LogUtils.debugf(this, "finishing output");
m_formatter.end();
} catch (final Throwable e) {
LogUtils.warnf(this, e, "Error while formatting system report output");
throw new SystemReportException(e);
} finally {
IOUtils.closeQuietly(output);
}
} else {
LogUtils.infof(this, "Invalid form input: %s", model);
throw new SystemReportException("Form input was invalid.");
}
LogUtils.debugf(this, "done");
if (m_view != null) {
m_view.render(model, request, response);
}
}
public String getFileName(final HttpServletRequest request) {
final String outputParameter = request.getParameter("output");
String fileName = null;
if (outputParameter != null && !outputParameter.matches("^[\\s]*$")) {
fileName = new File(outputParameter).getName().replaceAll("[^[:alnum:]\\.]", "");
} else {
fileName = "opennms-system-report." + m_formatter.getExtension();
}
return fileName;
}
public String toString() {
return new ToStringBuilder(this)
.append("formatter", m_formatter)
.toString();
}
}