package com.idega.block.article.bean.article_view;
import java.io.IOException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.idega.block.article.bean.ArticleItemBean;
import com.idega.block.article.component.article_view.ArticleFileBrowser;
import com.idega.block.article.data.ArticleEntity;
import com.idega.block.article.data.dao.ArticleDao;
import com.idega.builder.bean.AdvancedProperty;
import com.idega.content.presentation.ContentViewer;
import com.idega.core.accesscontrol.business.AccessController;
import com.idega.core.accesscontrol.business.NotLoggedOnException;
import com.idega.core.accesscontrol.business.StandardRoles;
import com.idega.core.builder.business.BuilderService;
import com.idega.core.builder.business.BuilderServiceFactory;
import com.idega.core.business.DefaultSpringBean;
import com.idega.idegaweb.IWApplicationContext;
import com.idega.idegaweb.IWMainApplication;
import com.idega.presentation.IWContext;
import com.idega.user.data.Group;
import com.idega.util.CoreConstants;
import com.idega.util.CoreUtil;
import com.idega.util.ListUtil;
@Service(ArticleViewRequestBean.SERVICE)
@Scope("request")
public class ArticleViewRequestBean extends DefaultSpringBean{
public static final String SERVICE = "articleViewRequestBean";
private ArticleItemBean articleItemBean = null;
@Autowired
ArticleDao articleDAO;
@Autowired
ArticleServices articleServices;
//request scope, iwc can be saved
private IWContext iwc = null;
public ArticleViewRequestBean(){
iwc = CoreUtil.getIWContext();
}
public boolean isAllowedToPerformAction(){
String action = iwc.getParameter(ContentViewer.PARAMETER_ACTION);
return isAllowedToPerformAction(action);
}
public boolean isAllowedToPerformAction(String action){
if(!iwc.isLoggedOn()){
return false;
}
ArticleItemBean articleItemBean;
try {
articleItemBean = getArticleItemBean();
} catch (IOException e) {
return false;
}
if(articleItemBean == null){
return true;
}
return articleItemBean.isAllowedToEditByCurrentUser(iwc);
}
public ArticleItemBean getArticleItemBean() throws IOException{
if(articleItemBean != null){
return articleItemBean;
}
String uri = iwc.getParameter(ContentViewer.PARAMETER_CONTENT_RESOURCE);
articleItemBean = articleServices.getArticleItemBean(uri);
return articleItemBean;
}
public String getResourcePath() throws IOException{
return getArticleItemBean().getResourcePath();
}
public String getArticleResourcesPath() throws IOException{
return getArticleItemBean().getFilesResourcePath();
}
public String getUriToFileBrowser() throws IOException{
BuilderService builderService;
try {
builderService = BuilderServiceFactory.getBuilderService(iwc);
} catch (RemoteException e) {
getLogger().log(Level.WARNING, "Failed getting uri to filebrowser.", e);
return CoreConstants.EMPTY;
}
List<AdvancedProperty> parameters = new ArrayList<AdvancedProperty>();
parameters.add(new AdvancedProperty(ContentViewer.PARAMETER_CONTENT_RESOURCE, getResourcePath()));
parameters.add(new AdvancedProperty(ArticleFileBrowser.PARAMETER_UPLOAD_PATH, getArticleResourcesPath()));
return builderService.getUriToObject(ArticleFileBrowser.class, parameters);
}
/**
* @return path where article files should be uploaded by current user.
* @throws IOException
* @throws NotLoggedOnException if user is not logged on
*/
public String getUploadPath() throws IOException{
String uploadPath = iwc.getParameter(ArticleFileBrowser.PARAMETER_UPLOAD_PATH);
if(uploadPath == null){
uploadPath = getArticleItemBean().getFilesResourcePath();
}
if(!uploadPath.startsWith(CoreConstants.SLASH)){
uploadPath = CoreConstants.SLASH + uploadPath;
}
if(!uploadPath.startsWith("/content")){
uploadPath = "/content" + uploadPath;
}
return uploadPath;
}
@Transactional
public Collection<String> getEditors() throws IOException{
Collection<String> editors = new HashSet<String>();
Collection<Integer> existingEditors = null;
ArticleEntity articleEntity = getArticleItemBean().getArticleEntity(false);
if (articleEntity != null) {
existingEditors = articleEntity.getEditors();
}
if (ListUtil.isEmpty(existingEditors)){
editors.addAll(getDefaultEditorsGroups());
} else {
for(Integer editor : existingEditors){
editors.add(String.valueOf(editor));
}
}
return editors;
}
private Collection<String> getDefaultEditorsGroups(){
List <String> defaultEditorGroups = new ArrayList<String>();
AccessController accessController = iwc.getAccessController();
IWApplicationContext iwac = IWMainApplication.getDefaultIWApplicationContext();
Collection <Group> groups = accessController.getAllGroupsForRoleKey(StandardRoles.ROLE_KEY_AUTHOR, iwac);
if(!ListUtil.isEmpty(groups)){
defaultEditorGroups.add(groups.iterator().next().getId());
}
groups = accessController.getAllGroupsForRoleKey(StandardRoles.ROLE_KEY_EDITOR, iwac);
if(!ListUtil.isEmpty(groups)){
defaultEditorGroups.add(groups.iterator().next().getId());
}
return defaultEditorGroups;
}
public String getArticleCategoriesJsArray(){
Collection <String> categories;
// Collection <CategoryEntity> categories;
try {
// categories = getArticleItemBean().getArticleEntity().getCategories();
categories = getArticleItemBean().getCategories();
} catch (Exception e) {
getLogger().log(Level.WARNING, "failed getting article categories", e);
return "[]";
}
if(ListUtil.isEmpty(categories)){
return "[]";
}
StringBuilder array = new StringBuilder("[");
for(Iterator<String> iter = categories.iterator();iter.hasNext();){
array.append(CoreConstants.QOUTE_SINGLE_MARK).append(iter.next()).append(CoreConstants.QOUTE_SINGLE_MARK);
if(iter.hasNext()){
array.append(CoreConstants.COMMA);
}
}
// for(Iterator<CategoryEntity> iter = categories.iterator();iter.hasNext();){
// array.append(iter.next().getCategory()).append(CoreConstants.QOUTE_SINGLE_MARK);;
// if(iter.hasNext()){
// array.append(CoreConstants.COMMA);
// }
// }
array.append("]");
return array.toString();
}
}