/**
* Copyright (c) 2009-2014 Câmara dos Deputados. Todos os direitos reservados.
*
* e-Democracia é um software livre; você pode redistribuí-lo e/ou modificá-lo dentro
* dos termos da Licença Pública Geral Menor GNU como publicada pela Fundação do
* Software Livre (FSF); na versão 2.1 da Licença, ou (na sua opinião) qualquer versão.
*
* Este programa é distribuído na esperança de que possa ser útil, mas SEM NENHUMA GARANTIA;
* sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR.
* Veja a Licença Pública Geral Menor GNU para maiores detalhes.
*/
package br.gov.camara.edemocracia.portlets.wikilegis.ui.pages;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.wicket.PageParameters;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.RefreshingView;
import org.apache.wicket.model.ComponentPropertyModel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import br.gov.camara.edemocracia.portlets.wikilegis.NoSuchArtigoException;
import br.gov.camara.edemocracia.portlets.wikilegis.model.Artigo;
import br.gov.camara.edemocracia.portlets.wikilegis.model.Contribuicao;
import br.gov.camara.edemocracia.portlets.wikilegis.service.ContribuicaoLocalServiceUtil;
import br.gov.camara.edemocracia.portlets.wikilegis.service.WikiLegisServiceUtil;
import br.gov.camara.edemocracia.portlets.wikilegis.ui.components.ArtigoLabel;
import br.gov.camara.edemocracia.portlets.wikilegis.ui.components.UserImage;
import br.gov.camara.edemocracia.portlets.wikilegis.ui.model.ContribuicaoDisplay;
import br.gov.camara.edemocracia.portlets.wikilegis.ui.panels.AlterarContribuicaoBoxPanel;
import br.gov.camara.edemocracia.portlets.wikilegis.ui.panels.WikiLegisMenuPanel;
import br.gov.camara.edemocracia.portlets.wikilegis.ui.util.UIUtils;
import com.google.common.collect.Iterators;
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.util.PortalUtil;
/**
* Lista as contribuições e permite sua edição
*
* @author rpdmiranda
*
*/
public class ContribuicaoPage extends WebPage {
/**
* Constrói a página de visualização de contribuiçõe
*
* @param pp
*/
public ContribuicaoPage(PageParameters pp) {
super(pp);
boolean sugestoesEnabled = Boolean.parseBoolean(UIUtils.getPortletPreferences().getValue("habilitaSugestoes", "true"));
if(sugestoesEnabled) {
final long artigoId = pp.getAsLong("artigo", 0l);
Artigo artigo;
try {
artigo = WikiLegisServiceUtil.getArtigo(artigoId);
} catch (PortalException e) {
// TODO Log
throw new RestartResponseException(HomePage.class);
} catch (SystemException e) {
// TODO Log
throw new RuntimeException(e);
}
setDefaultModel(new LoadableDetachableModel<Artigo>(artigo) {
private static final long serialVersionUID = 1L;
@Override
protected Artigo load() {
try {
return WikiLegisServiceUtil.getArtigo(artigoId);
} catch (Exception e) {
// TODO Log
throw new RuntimeException(e);
}
}
});
init();
} else {
throw new RestartResponseException(HomePage.class);
}
}
private Artigo getModelObject() {
return (Artigo) getDefaultModelObject();
}
// //////////////////////////////////////////
// Componentes
// //////////////////////////////////////////
private RefreshingView<ContribuicaoDisplay> contribuicoes;
private Form<Void> form;
private TextArea<String> textoArtigo;
private TextArea<String> descricao;
private AlterarContribuicaoBoxPanel alterarContribuicaoBox;
private static final Log LOG = LogFactoryUtil.getLog(ContribuicaoPage.class);
private void init() {
initMenuWikilegis();
initPlugins();
add(new ArtigoLabel("texto", new ComponentPropertyModel<String>("texto"), true));
add(new ArtigoLabel("legislacaoVigente", new ComponentPropertyModel<String>("legislacaoVigente"), false) {
private static final long serialVersionUID = 1L;
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(!getDefaultModelObjectAsString().trim().isEmpty());
}
});
initContribuicoes();
initForm();
initTextoTextArea();
initDescricao();
initEnviar();
initCancelar();
initAlterarContribuicao();
}
private void initMenuWikilegis() {
add(new WikiLegisMenuPanel("menuWikilegis"));
}
private void initPlugins() {
WebMarkupContainer plugins = new WebMarkupContainer("plugins");
plugins.add(new WebMarkupContainer("share").add(new SimpleAttributeModifier("addthis:url", PortalUtil.getCurrentCompleteURL(UIUtils.getHttpServletRequest()))));
plugins.setVisible(Boolean.parseBoolean(UIUtils.getPortletPreferences().getValue("habilitaPlugins", "false")));
add(plugins);
}
private void initContribuicoes() {
contribuicoes = new RefreshingView<ContribuicaoDisplay>("contribuicoes") {
private static final long serialVersionUID = 1L;
@Override
protected Iterator<IModel<ContribuicaoDisplay>> getItemModels() {
return listaContribuicoes();
}
@Override
protected void populateItem(final Item<ContribuicaoDisplay> item) {
item.add(new UserImage("userId"));
item.add(new Label("userName"));
item.add(new ArtigoLabel("texto"));
item.add(new Label("descricao") {
private static final long serialVersionUID = 1L;
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(getDefaultModelObjectAsString().trim().length() > 0);
}
});
item.add(new AjaxLink<Void>("alterar") {
private static final long serialVersionUID = 1L;
@Override
protected void onConfigure() {
super.onConfigure();
if(!(UIUtils.possuiPermissoes("UPDATE_PROPOSITION") || UIUtils.isOwner(item.getModelObject().getUserId(),"UPDATE_PROPOSITION")))
setVisible(false);
}
@Override
public void onClick(AjaxRequestTarget target) {
alterarContribuicaoBox.editarArtigo(item.getModelObject());
target.addComponent(alterarContribuicaoBox);
target.appendJavascript(" $('#dialog').fadeIn(400);");
target.appendJavascript("$('.modalWindow .close').click(function (){ $('#mask').hide(); $('.modalWindow').hide();});");
}
});
final long id = item.getModelObject().getContribuicaoId();
item.add(new Link<Void>("excluir"){
@Override
protected void onConfigure() {
super.onConfigure();
if(!(UIUtils.possuiPermissoes("DELETE_PROPOSITION") || UIUtils.isOwner(item.getModelObject().getUserId(),"DELETE_PROPOSITION")))
setVisible(false);
}
private static final long serialVersionUID = 1L;
@Override
public void onClick() {
try {
WikiLegisServiceUtil.removeContribuicao(id);
} catch (PortalException e) {
LOG.error("Erro ao remover a contribuição.",e);
} catch (SystemException e) {
LOG.error("Erro ao remover a contribuição",e);
}
}
});
}
};
add(contribuicoes);
}
private void initForm() {
form = new Form<Void>("form") {
private static final long serialVersionUID = 1L;
@Override
protected void onConfigure() {
super.onConfigure();
/**
* Não mostra o formulário se o usuário não tiver permissão para contribuir
*/
setVisible(UIUtils.possuiPermissoes("PROPOSE"));
}
/**
* Realizar validações
*/
@Override
protected void onSubmit() {
gravaAlteracoes();
}
};
add(form);
}
private void initTextoTextArea() {
String texto = getModelObject() != null ? getModelObject().getTexto()
: "";
textoArtigo = new TextArea<String>("textoArtigo", Model.of(texto));
textoArtigo.setOutputMarkupId(true);
form.add(textoArtigo);
}
private void initDescricao() {
descricao = new TextArea<String>("descricao", Model.of(""));
descricao.setOutputMarkupId(true);
form.add(descricao);
}
private void initEnviar() {
form.add(new Button("enviar"));
}
private void initCancelar() {
BookmarkablePageLink<HomePage> cancelar = new BookmarkablePageLink<HomePage>("cancelar", HomePage.class);
form.add(cancelar);
}
private void initAlterarContribuicao() {
alterarContribuicaoBox = new AlterarContribuicaoBoxPanel("alterarContribuicaoBox");
alterarContribuicaoBox.setOutputMarkupId(true);
add(alterarContribuicaoBox);
}
/**
* Lista as contribuições para o artigo atual
*
* @return
*/
private Iterator<IModel<ContribuicaoDisplay>> listaContribuicoes() {
Artigo artigo = getModelObject();
if (artigo == null)
return Iterators.emptyIterator();
List<Contribuicao> contribuicoes;
try {
contribuicoes = WikiLegisServiceUtil.listaContribuicoes(artigo.getArtigoId());
} catch (SystemException e1) {
// TODO log
LOG.error("Erro ao obter lista de contribuições do artigo.Param artigoId=\""+artigo.getArtigoId()+"\"" ,e1);
return Iterators.emptyIterator();
}
ArrayList<IModel<ContribuicaoDisplay>> retorno = new ArrayList<IModel<ContribuicaoDisplay>>();
for (Contribuicao contribuicao : contribuicoes) {
final long contribuicaoId = contribuicao.getContribuicaoId();
ContribuicaoDisplay display = new ContribuicaoDisplay(contribuicao);
retorno.add(new CompoundPropertyModel<ContribuicaoDisplay>(new LoadableDetachableModel<ContribuicaoDisplay>(display) {
private static final long serialVersionUID = 1L;
@Override
protected ContribuicaoDisplay load() {
try {
return new ContribuicaoDisplay(ContribuicaoLocalServiceUtil.getContribuicao(contribuicaoId));
} catch (PortalException e) {
// TODO LOG
LOG.error("Erro ao obter contribuição.Param contribuicaoId = \""+contribuicaoId+"\"",e);
return null;
} catch (SystemException e) {
// TODO LOG
LOG.error("Erro ao obter contribuição.Param contribuicaoId=\""+contribuicaoId+"\" ",e);
return null;
}
}
}));
}
return retorno.iterator();
}
/**
* Grava o novo comentário
*/
private void gravaAlteracoes() {
Artigo artigo = getModelObject();
String textoContribuicao = textoArtigo.getModelObject();
String descricaoContribuicao = descricao.getModelObject();
try {
WikiLegisServiceUtil.adicionaContribuicao(artigo.getArtigoId(), textoContribuicao, descricaoContribuicao);
} catch (SystemException e) {
LOG.error("Erro ao gravar comentário",e);
} catch (NoSuchArtigoException e) {
LOG.error("Erro ao gravar comentário",e);
} catch (PortalException e) {
LOG.error("Erro ao gravar comentário",e);
}
setResponsePage(HomePage.class);
setRedirect(true);
}
}