package br.gov.camara.edemocracia.portlets.exportacao;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.Charset;
import java.sql.SQLException;
import javax.portlet.PortletException;
import javax.portlet.PortletRequest;
import javax.portlet.PortletRequestDispatcher;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import br.gov.camara.edemocracia.portlets.exportacao.csv.ExportacaoCSV;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.portlet.LiferayPortlet;
import com.liferay.portal.kernel.portlet.LiferayPortletSession;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.portal.util.PortalUtil;
public class ExportacaoPortlet extends LiferayPortlet {
private static final Log LOG = LogFactoryUtil.getLog(ExportacaoPortlet.class);
@Override
protected void doView(RenderRequest request, RenderResponse response) throws PortletException, java.io.IOException {
PortletRequestDispatcher portletRequestDispatcher = getPortletContext().getRequestDispatcher(
"/html/exportacao/exportacao.jsp");
portletRequestDispatcher.include(request, response);
}
/**
* Verifica se o usuário possui permissões
*
* @param request
* @return
*/
private boolean hasPermission(PortletRequest request, boolean admin_data) {
ThemeDisplay td = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);
String name = td.getPortletDisplay().getRootPortletId();
String primKey;
if ("".equals(name) || name == null) {
name = PortalUtil.getPortletId(request);
primKey = td.getLayout().getPlid() + LiferayPortletSession.LAYOUT_SEPARATOR + name;
} else {
primKey = td.getPortletDisplay().getResourcePK();
}
boolean userAdmin = td.getPermissionChecker().isCommunityAdmin(td.getScopeGroupId());
boolean hasPermission = td.getPermissionChecker().hasPermission(td.getScopeGroupId(), name, primKey, "VIEW");
if(admin_data)
return (userAdmin && hasPermission);
else
return hasPermission ;
}
/**
* Fornece o arquivo CSV
*/
@Override
public void serveResource(ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws IOException,
PortletException {
ThemeDisplay td = (ThemeDisplay) resourceRequest.getAttribute(WebKeys.THEME_DISPLAY);
boolean dadosAdmin = Boolean.parseBoolean(resourceRequest.getParameter("ad"));
long groupId = td.getScopeGroupId();
if (hasPermission(resourceRequest,dadosAdmin)) {
resourceResponse.setContentType("text/csv; charset=ISO-8859-1");
resourceResponse.setCharacterEncoding("ISO-8859-1");
resourceResponse.setProperty("content-disposition", "attachment;filename=propostas.csv");
OutputStream os = resourceResponse.getPortletOutputStream();
Writer writer = new OutputStreamWriter(os, Charset.forName(resourceResponse.getCharacterEncoding()));
try {
ExportacaoCSV.getCSV(groupId, writer, dadosAdmin);
} catch (SystemException e) {
LOG.error("Erro ao exportar dados do fórum",e);
throw new PortletException(e);
} catch (SQLException e) {
LOG.error("Erro ao exportar dados do fórum",e);
throw new PortletException(e);
} catch (PortalException e) {
LOG.error("Erro ao exportar dados do fórum",e);
throw new PortletException(e);
}finally{
writer.flush();
writer.close();
}
} else {
//Ideal setar a propriedade status code, mas há um bug no liferay 6.0.5 e foi corrigido somente no liferay 6.1
//resourceResponse.setProperty(ResourceResponse.HTTP_STATUS_CODE, "550");
resourceResponse.getWriter().write("<h1>550 Permissão negada</h1>");
super.serveResource(resourceRequest, resourceResponse);
}
}
}