/* * Copyright 2008-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package es.alvsanand.webpage.web.beans.admin; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.faces.application.FacesMessage; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import javax.faces.component.UIComponent; import javax.faces.component.UIInput; import javax.faces.context.FacesContext; import javax.faces.validator.ValidatorException; import org.apache.commons.lang.StringUtils; import org.primefaces.event.FileUploadEvent; import org.primefaces.event.RateEvent; import org.primefaces.model.DualListModel; import org.primefaces.model.LazyDataModel; import org.primefaces.model.UploadedFile; import com.google.appengine.api.datastore.Text; import es.alvsanand.webpage.AlvsanandException; import es.alvsanand.webpage.common.FacesUtils; import es.alvsanand.webpage.common.Globals; import es.alvsanand.webpage.common.Logger; import es.alvsanand.webpage.common.MessageResources; import es.alvsanand.webpage.common.XMLUtils; import es.alvsanand.webpage.db.QueryBean; import es.alvsanand.webpage.db.QueryBean.OrderBean; import es.alvsanand.webpage.model.Article; import es.alvsanand.webpage.model.ArticleVersion; import es.alvsanand.webpage.model.Rating; import es.alvsanand.webpage.model.Tag; import es.alvsanand.webpage.model.User; import es.alvsanand.webpage.model.bulkUpload.ArticleBulkUpload; import es.alvsanand.webpage.services.ServiceException; import es.alvsanand.webpage.services.admin.CmsAdminService; import es.alvsanand.webpage.services.admin.CmsAdminServiceImpl; @SessionScoped @ManagedBean(name="articleBean") public class ArticleBean implements Serializable{ /** * */ private static final long serialVersionUID = 8834258652731878852L; private transient static final Logger logger = new Logger(ArticleBean.class); private transient static final String DEFAULT_SORT_FIELD = "date"; private transient static final String LIST_ARTICLE_VIEW_ID = "pretty:listArticle"; private transient static final String SHOW_ARTICLE_VIEW_ID = "pretty:article"; private transient static final String EDIT_ARTICLE_VIEW_ID = "/xhtml/secured/admin/articles/edit.jsf"; private transient static final String NEW_ARTICLE_VIEW_ID = "/xhtml/secured/admin/articles/edit.jsf"; private transient CmsAdminService cmsAdminService; private String idArticle; private String idArticleVersion; private String name; private String title; private String data; private Date date; private Date modifiedDate; private String state; private double ratingNumber; private ArticleBulkUpload articleBulkUpload; private boolean bulkUpload; private LazyDataModel<Article> lazyModel; private Map<String, Boolean> selectedArticles = new HashMap<String, Boolean>(); private DualListModel<String> tags; private Map<String,String> articleVersions = new HashMap<String, String>(); public ArticleBean(){ } public String getIdArticle() { return idArticle; } public void setIdArticle(String idArticle) { this.idArticle = idArticle; } public String getIdArticleVersion() { return idArticleVersion; } public void setIdArticleVersion(String idArticleVersion) { this.idArticleVersion = idArticleVersion; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public void setTitle(String title) { this.title = title; } public String getTitle() { return title; } public void setData(String data) { this.data = data; } public String getData() { return data; } public Date getModifiedDate() { return modifiedDate; } public void setModifiedDate(Date modifiedDate) { this.modifiedDate = modifiedDate; } public String getState() { return state; } public void setState(String state) { this.state = state; } public LazyDataModel<Article> getLazyModel() throws ServiceException { int rowCount = getCmsAdminService().getArticleCount(); if(lazyModel==null){ lazyModel = new LazyDataModel<Article>() { /** * */ private static final long serialVersionUID = 444907527835413595L; @Override public List<Article> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String,String> filters) { logger.info("Loading the article list between " + first + " and " + (first + pageSize)); List<Article> lazyArticles = null; try { QueryBean queryBean = new QueryBean(); queryBean.setLimit(pageSize); queryBean.setOffset(first); // //Sorting disabled until Primefaces implements it // OrderBean orderBean = new OrderBean(sortOrder, sortField); // List<OrderBean> orderBeans = new java.util.ArrayList<OrderBean>(); // orderBeans.add(orderBean); // queryBean.setOrderBeans(orderBeans); if(sortField==null){ OrderBean orderBean = new OrderBean(false,DEFAULT_SORT_FIELD); List<OrderBean> orderBeans = new java.util.ArrayList<OrderBean>(); orderBeans.add(orderBean); queryBean.setOrderBeans(orderBeans); } lazyArticles = getCmsAdminService().getArticles(queryBean); } catch (ServiceException e) { logger.error("Error loading the article list between " + first + " and " + (first+pageSize) + ": " + e.getMessage()); } return lazyArticles; } }; } lazyModel.setRowCount(rowCount); return lazyModel; } public Map<String, Boolean> getSelectedArticles() { return selectedArticles; } public void setSelectedArticles(Map<String, Boolean> selectedArticles) { this.selectedArticles = selectedArticles; } public DualListModel<String> getTags() { return tags; } public void setTags(DualListModel<String> tags) { this.tags = tags; } public Map<String, String> getArticleVersions() { return articleVersions; } public void setArticleVersions(Map<String, String> articleVersions) { this.articleVersions = articleVersions; } public CmsAdminService getCmsAdminService() { if(cmsAdminService==null){ cmsAdminService = new CmsAdminServiceImpl(); } return cmsAdminService; } public boolean isBulkUpload() { return bulkUpload; } public void setBulkUpload(boolean bulkUpload) { this.bulkUpload = bulkUpload; } public double getRatingNumber() { return ratingNumber; } public void setRatingNumber(double ratingNumber) { this.ratingNumber = ratingNumber; } // JSF methods public void getArticles() throws AlvsanandException { logger.info("Launched ArticleBean.getArticles"); bulkUpload = false; articleBulkUpload = null; } public String newArticle() throws AlvsanandException { logger.info("Launched ArticleBean.newArticle"); idArticle = null; data = null; date = null; modifiedDate = null; name = null; title = null; tags = new DualListModel<String>(); List<Tag> allTags = getCmsAdminService().getTags(null); List<String> source = new ArrayList<String>(); List<String> target = new ArrayList<String>(); if(allTags!=null){ for(Tag tag: allTags){ source.add(XMLUtils.repareText(tag.getName())); } } tags.setSource(source); tags.setTarget(target); return NEW_ARTICLE_VIEW_ID; } public String editArticle() throws AlvsanandException { logger.info("Launched ArticleBean.editArticle[" + idArticle + "]"); Article articleTmp = new Article(); articleTmp.setIdArticle(idArticle); Article article = getCmsAdminService().getArticle(articleTmp); name = article.getName(); date = article.getDate(); title = article.getTitle(); data = article.getDataValue(); tags = new DualListModel<String>(); List<Tag> articleTags = article.getTags(); List<Tag> allTags = getCmsAdminService().getTags(null); List<String> source = new ArrayList<String>(); List<String> target = new ArrayList<String>(); if(articleTags!=null && tags!=null){ for(Tag tag: allTags){ boolean foundTag = false; for(Tag tag2: articleTags){ if(tag2.getName()!=null && tag2.getName().equals(tag.getName())){ foundTag = true; } } if(foundTag){ target.add(XMLUtils.repareText(tag.getName())); } else{ source.add(XMLUtils.repareText(tag.getName())); } } } tags.setSource(source); tags.setTarget(target); articleVersions = new LinkedHashMap<String, String>(); int maxNumberversion = 0; if(article!=null && article.getArticleVersions()!=null){ SimpleDateFormat simpleDateFormat = new SimpleDateFormat(Globals.DEFAULT_DATE_FORMAT); for(ArticleVersion articleVersion: article.getArticleVersions()){ articleVersions.put(Integer.toString(articleVersion.getNumberversion()) + "(" + simpleDateFormat.format(articleVersion.getDate()) + ")", articleVersion.getIdArticleVersion()); if(articleVersion.getNumberversion() > maxNumberversion){ idArticleVersion = articleVersion.getIdArticleVersion(); maxNumberversion = articleVersion.getNumberversion(); } } } return EDIT_ARTICLE_VIEW_ID; } public String deleteArticle() throws AlvsanandException { logger.info("Launched ArticleBean.deleteArticle[" + idArticle + "]"); Article article = new Article(); article.setIdArticle(idArticle); getCmsAdminService().deleteArticle(article); return LIST_ARTICLE_VIEW_ID; } public String saveArticle() throws AlvsanandException { logger.info("Launched ArticleBean.saveArticle[" + idArticle + "]"); Article article = null; User actualUser = (User)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(Globals.SES_USER); Date actualDate = new Date(); if(StringUtils.isEmpty(idArticle)){ article = new Article(); article.setName(es.alvsanand.webpage.common.StringUtils.getValidName(name)); article.setDate(actualDate); article.setModifiedDate(actualDate); article.setData(new Text(data)); article.setTitle(title); article.setUser(actualUser); ArticleVersion articleVersion = new ArticleVersion(); articleVersion.setData(new Text(data)); articleVersion.setDate(actualDate); articleVersion.setTitle(title); articleVersion.setUser(actualUser); List<ArticleVersion> articleVersions = new ArrayList<ArticleVersion>(); articleVersions.add(articleVersion); article.setArticleVersions(articleVersions); if(tags.getTarget()!=null && tags.getTarget().size()>0){ List<Tag> articleTags = new ArrayList<Tag>(); for(String tagName: tags.getTarget()){ Tag tag = new Tag(tagName, null); tag.setAsociated(true); articleTags.add(tag); } article.setTags(articleTags); } } else{ Article articleTmp = new Article(); articleTmp.setIdArticle(idArticle); article = getCmsAdminService().getArticle(articleTmp); article.setData(new Text(data)); article.setModifiedDate(actualDate); article.setTitle(title); article.setUser(actualUser); ArticleVersion articleVersion = new ArticleVersion(); articleVersion.setData(new Text(data)); articleVersion.setDate(actualDate); articleVersion.setTitle(title); articleVersion.setUser(actualUser); List<ArticleVersion> articleVersions = new ArrayList<ArticleVersion>(); articleVersions.add(articleVersion); article.setArticleVersions(articleVersions); if(tags.getTarget()!=null && tags.getTarget().size()>0){ List<Tag> articleTags = new ArrayList<Tag>(); for(String tagName: tags.getTarget()){ Tag tag = new Tag(tagName, null); tag.setAsociated(true); articleTags.add(tag); } article.setTags(articleTags); } } getCmsAdminService().saveOrUpdateArticle(article); return LIST_ARTICLE_VIEW_ID; } public String updateStateArticles() throws AlvsanandException { logger.info("Launched ArticleBean.updateStateArticles[" + selectedArticles.keySet() + "]"); List<Article> articleList = new java.util.ArrayList<Article>(); if(selectedArticles!=null){ for(String idArticle: selectedArticles.keySet()){ if(selectedArticles.get(idArticle)!=null && selectedArticles.get(idArticle).booleanValue()){ Article articleTmp = new Article(); articleTmp.setIdArticle(idArticle); Article article = getCmsAdminService().getArticle(articleTmp); article.setState(Integer.parseInt(state)); articleList.add(article); } } } getCmsAdminService().saveOrUpdateArticles(articleList); return LIST_ARTICLE_VIEW_ID; } public void articleBulkUpload() throws AlvsanandException { logger.info("Launched ArticleBean.articleBulkUpload"); FacesContext context = FacesContext.getCurrentInstance(); UIComponent fileUploadComponent = FacesUtils.findComponent(context.getViewRoot(), "fileUpload"); try{ cmsAdminService.saveOrUpdateArticles(convertToArticleList(articleBulkUpload)); FacesMessage message = new FacesMessage(); message.setDetail(MessageResources.getMessage(MessageResources.ADMIN_RESOURCE_BUNDLE_NAME, "admin.article.articleBulkUpload.completed.detail", null)); message.setSummary(MessageResources.getMessage(MessageResources.ADMIN_RESOURCE_BUNDLE_NAME, "admin.article.articleBulkUpload.completed.summary", null)); message.setSeverity(FacesMessage.SEVERITY_INFO); FacesContext.getCurrentInstance().addMessage(fileUploadComponent.getClientId(context), message); } catch(ServiceException serviceException){ FacesMessage message = new FacesMessage(); message.setDetail(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.form.validation.loadArticleBulkUpload.unknown.detail", null)); message.setSummary(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.form.validation.loadArticleBulkUpload.unknown.summary", null)); message.setSeverity(FacesMessage.SEVERITY_ERROR); FacesContext.getCurrentInstance().addMessage(fileUploadComponent.getClientId(context), message); } setBulkUpload(false); } public String changeArticleVersion() throws AlvsanandException{ logger.info("Launched ArticleBean.changeArticleVersion[articleVersion=" + idArticleVersion + "]"); ArticleVersion articleVersionTmp = new ArticleVersion(); articleVersionTmp.setIdArticleVersion(idArticleVersion); ArticleVersion articleVersion = getCmsAdminService().getArticleVersion(articleVersionTmp); title = articleVersion.getTitle(); data = articleVersion.getData().getValue(); return EDIT_ARTICLE_VIEW_ID; } public void validateName(FacesContext context, UIComponent validate, Object value) throws AlvsanandException { logger.info("Launched ArticleBean.validateName"); String name = (String) value; if (!StringUtils.isEmpty(name)) { int count = 0; try { count = getCmsAdminService().getArticleCount(es.alvsanand.webpage.common.StringUtils.getValidName(name)); } catch (ServiceException ex) { throw ex; } if (count > 0) { ((UIInput) validate).setValid(false); FacesMessage message = new FacesMessage(); message.setDetail(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.form.validation.validateArticleName.detail", null)); message.setSummary(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.form.validation.validateArticleName.summary", null)); message.setSeverity(FacesMessage.SEVERITY_ERROR); throw new ValidatorException(message); } } } public void handleFileUpload(FileUploadEvent fileUploadEvent) { logger.info("Uploaded: {" + fileUploadEvent.getFile().getFileName()+"}"); loadArticleBulkUpload(fileUploadEvent.getFile()); } private void loadArticleBulkUpload(UploadedFile uploadedFile){ FacesContext context = FacesContext.getCurrentInstance(); UIComponent fileUploadComponent = FacesUtils.findComponent(context.getViewRoot(), "fileUpload"); InputStream inputStream = null; try { inputStream = uploadedFile.getInputstream(); } catch (IOException e1) { setBulkUpload(false); FacesMessage message = new FacesMessage(); message.setDetail(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.form.validation.loadArticleBulkUpload.badFile.detail", null)); message.setSummary(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.form.validation.loadArticleBulkUpload.badFile.summary", null)); message.setSeverity(FacesMessage.SEVERITY_ERROR); FacesContext.getCurrentInstance().addMessage(fileUploadComponent.getClientId(context), message); return; } try { articleBulkUpload = ArticleBulkUpload.unmarshal(new InputStreamReader(inputStream)); } catch (Exception e) { setBulkUpload(false); FacesMessage message = new FacesMessage(); message.setDetail(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.form.validation.loadArticleBulkUpload.badFile.detail", null)); message.setSummary(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.form.validation.loadArticleBulkUpload.badFile.summary", null)); message.setSeverity(FacesMessage.SEVERITY_ERROR); FacesContext.getCurrentInstance().addMessage(fileUploadComponent.getClientId(context), message); return; } try{ for(es.alvsanand.webpage.model.bulkUpload.Article article: articleBulkUpload.getArticle()){ validateArticle(article); } setBulkUpload(true); } catch(ValidatorException validatorException){ setBulkUpload(false); FacesContext.getCurrentInstance().addMessage(fileUploadComponent.getClientId(context), validatorException.getFacesMessage()); } } public void validateArticle(es.alvsanand.webpage.model.bulkUpload.Article article) throws ValidatorException { if (article!=null && StringUtils.isNotEmpty(article.getName()) && StringUtils.isNotEmpty(article.getTitle()) && article.getDate()!=null && article.getData()!=null && StringUtils.isNotEmpty(article.getData().toString())) { int count = 0; try { count = getCmsAdminService().getArticleCount(es.alvsanand.webpage.common.StringUtils.getValidName(article.getName())); } catch (ServiceException ex) { FacesMessage message = new FacesMessage(); message.setDetail(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.form.validation.loadArticleBulkUpload.unknown.detail", null)); message.setSummary(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.form.validation.loadArticleBulkUpload.unknown.summary", null)); message.setSeverity(FacesMessage.SEVERITY_ERROR); throw new ValidatorException(message); } if (count > 0) { FacesMessage message = new FacesMessage(); message.setDetail(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.form.validation.loadArticleBulkUpload.badName.detail", new String[]{es.alvsanand.webpage.common.StringUtils.getValidName(article.getName())})); message.setSummary(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.form.validation.loadArticleBulkUpload.badName.summary", new String[]{es.alvsanand.webpage.common.StringUtils.getValidName(article.getName())})); message.setSeverity(FacesMessage.SEVERITY_ERROR); throw new ValidatorException(message); } } else{ FacesMessage message = new FacesMessage(); message.setDetail(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.form.validation.loadArticleBulkUpload.badContent.detail", null)); message.setSummary(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.form.validation.loadArticleBulkUpload.badContent.summary", null)); message.setSeverity(FacesMessage.SEVERITY_ERROR); throw new ValidatorException(message); } } private List<Article> convertToArticleList(ArticleBulkUpload articleBulkUpload){ User user = (User)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(Globals.SES_USER); List<Article> articles = new ArrayList<Article>(); for(es.alvsanand.webpage.model.bulkUpload.Article bulkUploadArticle: articleBulkUpload.getArticle()){ Article article = new Article(); article.setName(es.alvsanand.webpage.common.StringUtils.getValidName(bulkUploadArticle.getName())); article.setTitle(bulkUploadArticle.getTitle()); article.setDate(bulkUploadArticle.getDate()); article.setData(new Text(bulkUploadArticle.getData())); article.setUser(user); ArticleVersion articleVersion = new ArticleVersion(); articleVersion.setData(new Text(bulkUploadArticle.getData())); articleVersion.setDate(bulkUploadArticle.getDate()); articleVersion.setTitle(bulkUploadArticle.getTitle()); articleVersion.setUser(user); List<ArticleVersion> articleVersions = new ArrayList<ArticleVersion>(); articleVersions.add(articleVersion); article.setArticleVersions(articleVersions); articles.add(article); } return articles; } public void handleRateListener(RateEvent rateEvent) throws AlvsanandException { logger.info("Launched ArticleBean.saveRating[" + idArticle + "]"); ratingNumber = rateEvent.getRating(); } public String saveRating() throws AlvsanandException { logger.info("Launched ArticleBean.saveRating[" + idArticle + "]"); User actualUser = (User)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(Globals.SES_USER); Rating rating = new Rating(); rating.setIdArticle(idArticle); rating.setRatingNumber(ratingNumber); rating.setUser(actualUser); rating.setDate(new Date()); getCmsAdminService().saveOrUpdateRating(rating); return SHOW_ARTICLE_VIEW_ID; } }