/* =============================================================================== * * Part of the InfoGlue Content Management Platform (www.infoglue.org) * * =============================================================================== * * Copyright (C) * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 2, as published by the * Free Software Foundation. See the file LICENSE.html for more information. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY, including 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 * this program; if not, write to the Free Software Foundation, Inc. / 59 Temple * Place, Suite 330 / Boston, MA 02111-1307 / USA. * * =============================================================================== */ package org.infoglue.cms.applications.contenttool.actions; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.log4j.Logger; import org.exolab.castor.jdo.Database; import org.infoglue.cms.applications.common.VisualFormatter; import org.infoglue.cms.applications.common.actions.InfoGlueAbstractAction; import org.infoglue.cms.controllers.kernel.impl.simple.AccessRightController; import org.infoglue.cms.controllers.kernel.impl.simple.CastorDatabaseService; import org.infoglue.cms.controllers.kernel.impl.simple.ContentController; import org.infoglue.cms.controllers.kernel.impl.simple.ContentControllerProxy; import org.infoglue.cms.controllers.kernel.impl.simple.ContentTypeDefinitionController; import org.infoglue.cms.controllers.kernel.impl.simple.ContentVersionController; import org.infoglue.cms.controllers.kernel.impl.simple.EventController; import org.infoglue.cms.controllers.kernel.impl.simple.InfoGlueSettingsController; import org.infoglue.cms.controllers.kernel.impl.simple.InterceptionPointController; import org.infoglue.cms.controllers.kernel.impl.simple.LanguageController; import org.infoglue.cms.controllers.kernel.impl.simple.RegistryController; import org.infoglue.cms.controllers.kernel.impl.simple.RepositoryLanguageController; import org.infoglue.cms.controllers.kernel.impl.simple.SiteNodeVersionController; import org.infoglue.cms.entities.content.Content; import org.infoglue.cms.entities.content.ContentVO; import org.infoglue.cms.entities.content.ContentVersion; import org.infoglue.cms.entities.content.ContentVersionVO; import org.infoglue.cms.entities.management.ContentTypeDefinitionVO; import org.infoglue.cms.entities.management.InterceptionPointVO; import org.infoglue.cms.entities.management.LanguageVO; import org.infoglue.cms.entities.structure.SiteNodeVersion; import org.infoglue.cms.entities.structure.SiteNodeVersionVO; import org.infoglue.cms.entities.workflow.EventVO; import org.infoglue.cms.exception.AccessConstraintException; import org.infoglue.cms.exception.Bug; import org.infoglue.cms.exception.ConstraintException; import org.infoglue.cms.exception.SystemException; import org.infoglue.cms.util.AccessConstraintExceptionBuffer; import org.infoglue.cms.util.CmsPropertyHandler; import org.infoglue.cms.util.sorters.ReflectionComparator; import org.infoglue.deliver.util.Timer; import webwork.action.Action; public class ViewContentAction extends InfoGlueAbstractAction { private final static Logger logger = Logger.getLogger(ViewContentAction.class.getName()); private static final long serialVersionUID = 1L; private Integer unrefreshedContentId = new Integer(0); private Integer changeTypeId = new Integer(0); private Integer repositoryId = null; private List availableLanguages = null; private ContentTypeDefinitionVO contentTypeDefinitionVO; private String defaultFolderContentTypeName; private Integer languageId = null; private String stay = null; private List referenceBeanList = new ArrayList(); private Boolean inline = false; private ContentVO contentVO; public ViewContentAction() { this(new ContentVO()); } public ViewContentAction(ContentVO contentVO) { this.contentVO = contentVO; } public void repairBrokenProtection() throws SystemException, Bug { ContentVO contentVO = ContentController.getContentController().getContentVOWithId(getContentId()); logger.info("repairBrokenProtection..."); if(contentVO != null && contentVO.getIsProtected().intValue() == 1) { Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); logger.info("Let's check access rights so they are not null CONTENT..."); InterceptionPointVO ipReadVO = InterceptionPointController.getController().getInterceptionPointVOWithName("Content.Read", db); InterceptionPointVO ipWriteVO = InterceptionPointController.getController().getInterceptionPointVOWithName("Content.Write", db); if(ipReadVO != null && ipWriteVO != null) { List accessRightListRead = AccessRightController.getController().getAccessRightListOnlyReadOnly(ipReadVO.getId(), "" + contentVO.getId(), db); List accessRightListWrite = AccessRightController.getController().getAccessRightListOnlyReadOnly(ipWriteVO.getId(), "" + contentVO.getId(), db); if((accessRightListRead == null || accessRightListRead.size() == 0) && (accessRightListWrite == null || accessRightListWrite.size() == 0)) { logger.info("Removing isProtected as there are no access rights"); Content c = ContentController.getContentController().getContentWithId(contentVO.getId(), db); if(c != null) c.setIsProtected(ContentVO.INHERITED); } } commitTransaction(db); } catch (Exception e) { logger.info("An error occurred so we should not complete the transaction:" + e); rollbackTransaction(db); throw new SystemException(e.getMessage()); } } } protected void initialize(Integer contentId) throws Exception { Timer t = new Timer(); this.contentVO = ContentControllerProxy.getController().getACContentVOWithId(this.getInfoGluePrincipal(), contentId); this.contentTypeDefinitionVO = ContentController.getContentController().getContentTypeDefinition(contentId); this.availableLanguages = RepositoryLanguageController.getController().getAvailableLanguageVOListForRepositoryId(this.contentVO.getRepositoryId()); if(this.repositoryId == null) this.repositoryId = this.contentVO.getRepositoryId(); if(this.contentVO.getRepositoryId() != null && !hasAccessTo("Repository.Read", "" + this.contentVO.getRepositoryId()) && !hasAccessTo("Repository.Write", "" + this.contentVO.getRepositoryId())) { AccessConstraintExceptionBuffer ceb = new AccessConstraintExceptionBuffer(); ceb.add(new AccessConstraintException("Content.contentId", "1000")); ceb.throwIfNotEmpty(); } if(this.getIsBranch().booleanValue()) { this.defaultFolderContentTypeName = InfoGlueSettingsController.getInfoGlueSettingsController().getProperty("repository_" + this.getRepositoryId() + "_defaultFolderContentTypeName", "applicationProperties", null, false, false, false, false, null); if(this.defaultFolderContentTypeName == null || this.defaultFolderContentTypeName.equals("")) this.defaultFolderContentTypeName = "Folder"; } } public String doExecute() throws Exception { try { ContentVO contentVO = ContentControllerProxy.getController().getACContentVOWithId(this.getInfoGluePrincipal(), getContentId()); if(contentVO.getRepositoryId() != null && !hasAccessTo("Repository.Read", "" + contentVO.getRepositoryId()) && !hasAccessTo("Repository.Write", "" + this.contentVO.getRepositoryId())) { logger.error("The user " + this.getInfoGluePrincipal().getName() + " had no access to Repository.Read or Repository.write and " + this.contentVO.getRepositoryId() + ". Could be an hacker attempt."); AccessConstraintExceptionBuffer ceb = new AccessConstraintExceptionBuffer(); ceb.add(new AccessConstraintException("Content.contentId", "1000")); ceb.throwIfNotEmpty(); } if((this.stay == null || !this.stay.equalsIgnoreCase("true")) && contentVO.getIsBranch().booleanValue() == false && contentVO.getContentTypeDefinitionId() != null && getShowContentVersionFirst().equalsIgnoreCase("true")) { if(this.repositoryId == null) this.repositoryId = contentVO.getRepositoryId(); if(this.languageId == null) this.languageId = getInitialLanguageVO().getId(); return "viewVersion"; } else { this.initialize(getContentId()); this.referenceBeanList = RegistryController.getController().getReferencingObjectsForContent(getContentId(), 100, true, true); return "success"; } } catch(ConstraintException ce) { repairBrokenProtection(); throw ce; } catch(Exception e) { e.printStackTrace(); } return Action.NONE; } public String doStandalone() throws Exception { this.initialize(getContentId()); return "standalone"; } public String doV3() throws Exception { try { ContentVO contentVO = ContentControllerProxy.getController().getACContentVOWithId(this.getInfoGluePrincipal(), getContentId()); if(contentVO.getRepositoryId() != null && !hasAccessTo("Repository.Read", "" + contentVO.getRepositoryId()) && !hasAccessTo("Repository.Write", "" + this.contentVO.getRepositoryId())) { logger.error("The user " + this.getInfoGluePrincipal().getName() + " had no access to Repository.Read or Repository.write and " + this.contentVO.getRepositoryId() + ". Could be an hacker attempt."); AccessConstraintExceptionBuffer ceb = new AccessConstraintExceptionBuffer(); ceb.add(new AccessConstraintException("Content.contentId", "1000")); ceb.throwIfNotEmpty(); } if((this.stay == null || !this.stay.equalsIgnoreCase("true")) && contentVO.getIsBranch().booleanValue() == false && contentVO.getContentTypeDefinitionId() != null && getShowContentVersionFirst().equalsIgnoreCase("true")) { if(this.repositoryId == null) this.repositoryId = contentVO.getRepositoryId(); if(this.languageId == null) this.languageId = getInitialLanguageVO().getId(); return "viewVersionV3"; } else { this.initialize(getContentId()); return "successV3"; } } catch(ConstraintException ce) { repairBrokenProtection(); throw ce; } catch(Exception e) { e.printStackTrace(); } catch(Throwable e) { e.printStackTrace(); } return Action.NONE; } public java.lang.Integer getContentId() { return this.contentVO.getContentId(); } public void setContentId(java.lang.Integer contentId) { this.contentVO.setContentId(contentId); } public void setLanguageId(java.lang.Integer languageId) { this.languageId = languageId; } public java.lang.Integer getRepositoryId() { return this.repositoryId; } public void setRepositoryId(java.lang.Integer repositoryId) { this.repositoryId = repositoryId; } public java.lang.Integer getUnrefreshedContentId() { return this.unrefreshedContentId; } public void setUnrefreshedContentId(java.lang.Integer unrefreshedContentId) { this.unrefreshedContentId = unrefreshedContentId; } public java.lang.Integer getChangeTypeId() { return this.changeTypeId; } public void setChangeTypeId(java.lang.Integer changeTypeId) { this.changeTypeId = changeTypeId; } public java.lang.Integer getNewContentId() { return this.contentVO.getId(); } public String getName() { return this.contentVO.getName(); } public String getPublishDateTime() { return new VisualFormatter().formatDate(this.contentVO.getPublishDateTime(), "yyyy-MM-dd HH:mm"); } public String getExpireDateTime() { return new VisualFormatter().formatDate(this.contentVO.getExpireDateTime(), "yyyy-MM-dd HH:mm"); } public long getPublishDateTimeAsLong() { return this.contentVO.getPublishDateTime().getTime(); } public long getExpireDateTimeAsLong() { return this.contentVO.getExpireDateTime().getTime(); } public Boolean getIsBranch() { return this.contentVO.getIsBranch(); } public Integer getIsProtected() { return this.contentVO.getIsProtected(); } public ContentTypeDefinitionVO getContentTypeDefinition() { return this.contentTypeDefinitionVO; } public List getAvailableLanguages() { return this.availableLanguages; } public ContentVersionVO getLatestContentVersionVO(Integer contentId, Integer languageId) { ContentVersionVO contentVersionVO = null; try { contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentId, languageId); } catch(Exception e) { logger.error("An error occurred when we tried to get the latest version for the content:" + e.getMessage(), e); } return contentVersionVO; } public EventVO getContentVersionEvent(Integer contentVersionId) { EventVO eventVO = null; try { ContentVersion contentVersion = ContentVersionController.getContentVersionController().getContentVersionWithId(contentVersionId); List events = EventController.getEventVOListForEntity(ContentVersion.class.getName(), contentVersion.getId()); if(events != null && events.size() > 0) eventVO = (EventVO)events.get(0); } catch(Exception e) { logger.error("An error occurred when we tried to get any events for this version:" + e.getMessage(), e); } return eventVO; } public EventVO getContentEvent(Integer contentId) { EventVO eventVO = null; try { List events = EventController.getEventVOListForEntity(Content.class.getName(), contentId); if(events != null && events.size() > 0) eventVO = (EventVO)events.get(0); } catch(Exception e) { logger.error("An error occurred when we tried to get any events for this version:" + e.getMessage(), e); } return eventVO; } public Integer getMasterLanguageId() { try { return LanguageController.getController().getMasterLanguage(repositoryId).getLanguageId(); } catch (Exception e) { logger.error("Unable to get master language for repository", e); } return null; } public ContentVO getContentVO() { return contentVO; } /** * This method fetches the list of ContentTypeDefinitions */ public List getContentTypeDefinitions() throws Exception { List contentTypeVOList = null; String protectContentTypes = CmsPropertyHandler.getProtectContentTypes(); if(protectContentTypes != null && protectContentTypes.equalsIgnoreCase("true")) contentTypeVOList = ContentTypeDefinitionController.getController().getAuthorizedContentTypeDefinitionVOList(this.getInfoGluePrincipal()); else contentTypeVOList = ContentTypeDefinitionController.getController().getContentTypeDefinitionVOList(); Collections.sort(contentTypeVOList, new ReflectionComparator("name")); return contentTypeVOList; } public List getContentPath() { ContentVO contentVO = this.contentVO; List ret = new ArrayList(); // ret.add(0, contentVO); while (contentVO.getParentContentId() != null) { try { contentVO = ContentControllerProxy.getController().getContentVOWithId(contentVO.getParentContentId()); } catch (SystemException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Bug e) { // TODO Auto-generated catch block e.printStackTrace(); } ret.add(0, contentVO); } return ret; } public void setContentVO(ContentVO contentVO) { this.contentVO = contentVO; } public String getDefaultFolderContentTypeName() { return defaultFolderContentTypeName; } public String getShowContentVersionFirst() { return CmsPropertyHandler.getShowContentVersionFirst(); } public LanguageVO getMasterLanguageVO() throws Exception { return LanguageController.getController().getMasterLanguage(repositoryId); } public LanguageVO getInitialLanguageVO() throws Exception { String initialLanguageId = InfoGlueSettingsController.getInfoGlueSettingsController().getProperty("content_" + this.getContentId() + "_initialLanguageId", "applicationProperties", null, false, false, false, false, null); ContentVO contentVO = ContentController.getContentController().getContentVOWithId(this.getContentId()); while((initialLanguageId == null || initialLanguageId.equalsIgnoreCase("-1")) && contentVO.getParentContentId() != null) { initialLanguageId = InfoGlueSettingsController.getInfoGlueSettingsController().getProperty("content_" + contentVO.getParentContentId() + "_initialLanguageId", "applicationProperties", null, false, false, false, false, null); contentVO = ContentController.getContentController().getContentVOWithId(contentVO.getParentContentId()); } /* ContentController.getContentController().getParentContent(this.getContentId()); while((initialLanguageId == null || initialLanguageId.equalsIgnoreCase("-1")) && parentContentVO != null) { //initialLanguageId = ps.getString("content_" + parentContentVO.getId() + "_initialLanguageId"); initialLanguageId = InfoGlueSettingsController.getInfoGlueSettingsController().getProperty("content_" + parentContentVO.getId() + "_initialLanguageId", "applicationProperties", null, false, false, false, false, null); parentContentVO = ContentController.getContentController().getParentContent(parentContentVO.getId()); } */ if(initialLanguageId != null && !initialLanguageId.equals("") && !initialLanguageId.equals("-1")) return LanguageController.getController().getLanguageVOWithId(new Integer(initialLanguageId)); else return LanguageController.getController().getMasterLanguage(repositoryId); } public Integer getLanguageId() { return languageId; } public String getStay() { return stay; } public void setInline(Boolean inline) { this.inline = inline; } public Boolean getInline() { return inline; } public void setStay(String stay) { this.stay = stay; } public List getReferenceBeanList() { return referenceBeanList; } }