public String getParentPath() throws DotDataException, DotSecurityException { if (parent == null) return null; // no parent! I'm the root folder if (parent.equals(FolderAPI.SYSTEM_FOLDER)) return "/"; Folder folder = APILocator.getFolderAPI().find(parent, sysuser, true); Identifier ident = APILocator.getIdentifierAPI().find(folder); return ident.getURI(); }
@Override public Permissionable getParentPermissionable() throws DotDataException { try { if (type.equals("htmlpage")) return APILocator.getHTMLPageAPI() .loadLivePageById(permissionId, sysuser, false) .getParentPermissionable(); if (type.equals("folder")) return APILocator.getFolderAPI().find(folderId, sysuser, false).getParentPermissionable(); if (type.equals("link")) return APILocator.getMenuLinkAPI() .findWorkingLinkById(permissionId, sysuser, false) .getParentPermissionable(); if (type.equals("file")) { Identifier ident = APILocator.getIdentifierAPI().find(permissionId); if (ident.getAssetType().equals("contentlet")) return APILocator.getContentletAPI() .findContentletByIdentifier( permissionId, true, APILocator.getLanguageAPI().getDefaultLanguage().getId(), sysuser, false) .getParentPermissionable(); else return APILocator.getFileAPI() .getWorkingFileById(permissionId, sysuser, false) .getParentPermissionable(); } return null; } catch (DotSecurityException e) { throw new RuntimeException(e); } }
/** * Copy a file into the given directory OR host * * @param file File to be copied * @param parent Destination Folder * @param host Destination host * @return true if copy success, false otherwise * @throws IOException * @throws DotHibernateException */ private File copyFile(File file, Folder parent, Host host) throws DotDataException, IOException { File newFile = new File(); newFile.copy(file); // gets filename before extension String fileName = com.dotmarketing.util.UtilMethods.getFileName(file.getFileName()); // gets file extension String fileExtension = com.dotmarketing.util.UtilMethods.getFileExtension(file.getFileName()); Boolean fileNameExists; if (parent != null) { fileNameExists = fileNameExists(parent, file.getFileName()); } else { fileNameExists = fileNameExists(APILocator.getFolderAPI().findSystemFolder(), file.getFileName()); } // Setting file name if (fileNameExists) { // adds "copy" word to the filename newFile.setFileName(fileName + "_copy." + fileExtension); newFile.setFriendlyName(file.getFriendlyName() + " (COPY) "); } else { newFile.setFileName(fileName + "." + fileExtension); } Identifier identifier; if (parent != null) { identifier = APILocator.getIdentifierAPI().createNew(newFile, parent); } else { identifier = APILocator.getIdentifierAPI().createNew(newFile, host); } newFile.setIdentifier(identifier.getInode()); // persists the webasset HibernateUtil.saveOrUpdate(newFile); saveFileData(file, newFile, null); Logger.debug(FileFactory.class, "identifier=" + identifier.getURI()); WorkingCache.removeAssetFromCache(newFile); WorkingCache.addToWorkingAssetToCache(newFile); PermissionAPI permissionAPI = APILocator.getPermissionAPI(); try { APILocator.getVersionableAPI().setWorking(newFile); if (file.isLive()) APILocator.getVersionableAPI().setLive(newFile); } catch (DotStateException e) { Logger.error(this, e.getMessage()); } catch (DotSecurityException e) { Logger.error(this, e.getMessage()); } // Copy permissions permissionAPI.copyPermissions(file, newFile); return newFile; }
@SuppressWarnings({"unchecked", "deprecation"}) public boolean renameFile(File file, String newName) throws DotStateException, DotDataException, DotSecurityException { // getting old file properties String oldFileName = file.getFileName(); String ext = UtilMethods.getFileExtension(oldFileName); Folder folder = APILocator.getFolderAPI() .findParentFolder(file, APILocator.getUserAPI().getSystemUser(), false); Identifier ident = APILocator.getIdentifierAPI().find(file); String newFileName = newName; if (UtilMethods.isSet(ext)) { newFileName = newFileName + "." + ext; } if (fileNameExists(folder, newFileName) || file.isLocked()) return false; List<Versionable> versions = APILocator.getVersionableAPI().findAllVersions(ident); boolean islive = false; for (Versionable version : versions) { File f = (File) version; // sets filename for this new file f.setFileName(newFileName); HibernateUtil.saveOrUpdate(f); if (f.isLive()) islive = true; } LiveCache.removeAssetFromCache(file); WorkingCache.removeAssetFromCache(file); CacheLocator.getIdentifierCache().removeFromCacheByVersionable(file); ident.setURI(APILocator.getIdentifierAPI().find(folder).getPath() + newFileName); // HibernateUtil.saveOrUpdate(ident); APILocator.getIdentifierAPI().save(ident); if (islive) { LiveCache.removeAssetFromCache(file); LiveCache.addToLiveAssetToCache(file); } WorkingCache.removeAssetFromCache(file); WorkingCache.addToWorkingAssetToCache(file); CacheLocator.getIdentifierCache().removeFromCacheByVersionable(file); // RefreshMenus.deleteMenus(); RefreshMenus.deleteMenu(file); CacheLocator.getNavToolCache().removeNav(folder.getHostId(), folder.getInode()); return true; }
protected void doAdminMode(HttpServletRequest request, HttpServletResponse response) throws Exception { // LIVE MODE - LIVE PAGE com.liferay.portal.model.User backendUser = null; backendUser = com.liferay.portal.util.PortalUtil.getUser(request); response.setContentType(CHARSET); Context context = VelocityUtil.getWebContext(request, response); String uri = URLDecoder.decode(request.getRequestURI(), UtilMethods.getCharsetConfiguration()); uri = UtilMethods.cleanURI(uri); Host host = hostWebAPI.getCurrentHost(request); Identifier id = APILocator.getIdentifierAPI().find(host, uri); request.setAttribute("idInode", id.getInode()); HTMLPage htmlPage = (HTMLPage) APILocator.getVersionableAPI() .findWorkingVersion(id, APILocator.getUserAPI().getSystemUser(), false); HTMLPageAPI htmlPageAPI = APILocator.getHTMLPageAPI(); VelocityUtil.makeBackendContext( context, htmlPage, "", id.getURI(), request, true, false, false, host); boolean canUserWriteOnTemplate = permissionAPI.doesUserHavePermission( htmlPageAPI.getTemplateForWorkingHTMLPage(htmlPage), PERMISSION_WRITE, backendUser); context.put("EDIT_TEMPLATE_PERMISSION", canUserWriteOnTemplate); Template template = null; if (request.getParameter("leftMenu") != null) { template = VelocityUtil.getEngine().getTemplate("/preview_left_menu.vl"); } else if (request.getParameter("mainFrame") != null) { template = VelocityUtil.getEngine() .getTemplate("/live/" + id.getInode() + "." + VELOCITY_HTMLPAGE_EXTENSION); } else { template = VelocityUtil.getEngine().getTemplate("/preview_mode.vl"); } Logger.debug(VelocityServlet.class, "Got the template!!!!" + id.getInode()); PrintWriter out = response.getWriter(); request.setAttribute(VELOCITY_CONTEXT, context); try { template.merge(context, out); } catch (ParseErrorException e) { out.append(e.getMessage()); } }
public File getLiveFileByFileName(String fileName, Folder folder) throws DotDataException { Identifier id = APILocator.getIdentifierAPI().find(folder); HibernateUtil hu = new HibernateUtil(File.class); hu.setSQLQuery(liveFileByName); hu.setParam(id.getPath()); hu.setParam(fileName); return (File) hu.load(); }
public List<NavResult> getChildren() throws Exception { if (children == null && hostId != null && folderId != null) { // lazy loadinge children Host host = APILocator.getHostAPI().find(hostId, sysuser, true); Folder folder = APILocator.getFolderAPI().find(folderId, sysuser, true); Identifier ident = APILocator.getIdentifierAPI().find(folder); NavResult lazyMe = NavTool.getNav(host, ident.getPath()); children = lazyMe.getChildren(); childrenFolderIds = lazyMe.getChildrenFolderIds(); } if (children != null) { ArrayList<NavResult> list = new ArrayList<NavResult>(); for (NavResult nn : children) { if (nn.isFolder()) { // for folders we avoid returning the same instance // it could be changed elsewhere and we need it to // load its children lazily NavResult ff = new NavResult(folderId, nn.hostId, nn.folderId); ff.setTitle(nn.getTitle()); ff.setHref(nn.getHref()); ff.setOrder(nn.getOrder()); ff.setType(nn.getType()); ff.setPermissionId(nn.getPermissionId()); list.add(ff); } else { list.add(nn); } } if (checkPermissions) { // now filtering permissions List<NavResult> allow = new ArrayList<NavResult>(list.size()); Context ctx = (VelocityContext) VelocityServlet.velocityCtx.get(); HttpServletRequest req = (HttpServletRequest) ctx.get("request"); User currentUser = WebAPILocator.getUserWebAPI().getLoggedInUser(req); if (currentUser == null) currentUser = APILocator.getUserAPI().getAnonymousUser(); for (NavResult nv : list) { try { if (APILocator.getPermissionAPI() .doesUserHavePermission(nv, PermissionAPI.PERMISSION_READ, currentUser)) { allow.add(nv); } } catch (Exception ex) { Logger.error(this, ex.getMessage(), ex); } } return allow; } else return list; } else { return new ArrayList<NavResult>(); } }
@SuppressWarnings("unchecked") public File saveFile( File newFile, java.io.File dataFile, Folder parentFolder, Identifier identifier) throws DotDataException { boolean localTransation = false; try { localTransation = DbConnectionFactory.getConnection().getAutoCommit(); if (localTransation) { HibernateUtil.startTransaction(); } // old working file File oldFile = null; // if new identifier if (identifier == null || !InodeUtils.isSet(identifier.getInode())) { identifier = APILocator.getIdentifierAPI().createNew(newFile, parentFolder); newFile.setIdentifier(identifier.getInode()); HibernateUtil.save(newFile); APILocator.getVersionableAPI().setWorking(newFile); saveFileData(newFile, null, dataFile); } else { APILocator.getVersionableAPI().removeLive(identifier.getId()); } if (UtilMethods.isSet(dataFile)) { HibernateUtil.save(newFile); saveFileData(newFile, null, dataFile); } if (oldFile != null && InodeUtils.isSet(oldFile.getInode())) { APILocator.getFileAPI().invalidateCache(oldFile); fileCache.remove(oldFile); WorkingCache.removeAssetFromCache(oldFile); } LiveCache.removeAssetFromCache(newFile); if (newFile.isLive()) { LiveCache.addToLiveAssetToCache(newFile); } WorkingCache.addToWorkingAssetToCache(newFile); if (localTransation) { HibernateUtil.commitTransaction(); } } catch (Exception e) { if (localTransation) { HibernateUtil.rollbackTransaction(); } throw new DotDataException(e.getMessage(), e); } return newFile; }
public File getFileByURI(String uri, String hostId, boolean live) throws DotDataException, DotSecurityException { // uri = uri.replaceAll(Config.getStringProperty("VIRTUAL_FILE_PREFIX"), ""); Logger.debug(FileFactory.class, "getFileByURI=" + uri); Host host = APILocator.getHostAPI().find(hostId, APILocator.getUserAPI().getSystemUser(), false); Identifier id = APILocator.getIdentifierAPI().find(host, uri); if (id != null && InodeUtils.isSet(id.getId())) { return (live) ? (File) APILocator.getVersionableAPI() .findLiveVersion(id, APILocator.getUserAPI().getSystemUser(), false) : (File) APILocator.getVersionableAPI() .findWorkingVersion(id, APILocator.getUserAPI().getSystemUser(), false); } else { return null; } }
private boolean isArchive(HttpServletRequest request) throws PortalException, SystemException, DotDataException, DotSecurityException { String uri = request.getRequestURI(); uri = UtilMethods.cleanURI(uri); Host host = null; String hostId = ""; /* * String pageHostId = request.getParameter("host_id"); if (pageHostId * != null) { try { hostId = Long.parseLong(pageHostId); } catch * (Exception ex) { } } */ hostId = request.getParameter("host_id"); if (!InodeUtils.isSet(hostId)) { host = hostWebAPI.getCurrentHost(request); hostId = host.getIdentifier(); } else { User user = (com.liferay.portal.model.User) request.getSession().getAttribute(com.dotmarketing.util.WebKeys.CMS_USER); if (user == null) { user = com.liferay.portal.util.PortalUtil.getUser(request); } host = hostWebAPI.find(hostId, user, true); } // Getting the identifier from the uri Identifier id = APILocator.getIdentifierAPI().find(host, uri); request.setAttribute("idInode", String.valueOf(id.getInode())); HTMLPage htmlPage = (HTMLPage) APILocator.getVersionableAPI() .findWorkingVersion(id, APILocator.getUserAPI().getSystemUser(), false); boolean isArchived = htmlPage.isDeleted(); return isArchived; }
public Map<String, Object> fetchTemplateImage(String id) throws DotDataException, DotSecurityException { Map<String, Object> toReturn = new HashMap<String, Object>(); Template template = null; try { template = templateAPI.findWorkingTemplate(id, APILocator.getUserAPI().getSystemUser(), false); } catch (DotSecurityException e) { Logger.error(this, e.getMessage()); } if (template != null) { Identifier imageIdentifier = APILocator.getIdentifierAPI().find(template.getImage()); if (UtilMethods.isSet(imageIdentifier.getAssetType()) && imageIdentifier.getAssetType().equals("contentlet")) { Contentlet imageContentlet = TemplateFactory.getImageContentlet(template); if (imageContentlet != null) { toReturn.put("inode", imageContentlet.getInode()); toReturn.put("name", imageContentlet.getTitle()); toReturn.put("identifier", imageContentlet.getIdentifier()); toReturn.put( "extension", com.dotmarketing.util.UtilMethods.getFileExtension(imageContentlet.getTitle())); } } else { File imgFile = TemplateFactory.getImageFile(template); if (imgFile != null) { toReturn.put("inode", imgFile.getInode()); toReturn.put("name", imgFile.getFileName()); toReturn.put("identifier", imgFile.getIdentifier()); toReturn.put( "extension", com.dotmarketing.util.UtilMethods.getFileExtension(imgFile.getFileName())); } } } return toReturn; }
public static void removePageFile(HTMLPage htmlPage, Identifier identifier, boolean EDIT_MODE) { String folderPath = (!EDIT_MODE) ? "live" + java.io.File.separator : "working" + java.io.File.separator; String velocityRootPath = Config.getStringProperty("VELOCITY_ROOT"); if (velocityRootPath.startsWith("/WEB-INF")) { velocityRootPath = com.liferay.util.FileUtil.getRealPath(velocityRootPath); } String filePath = folderPath + identifier.getInode() + "." + Config.getStringProperty("VELOCITY_HTMLPAGE_EXTENSION"); velocityRootPath += java.io.File.separator; java.io.File f = new java.io.File(velocityRootPath + filePath); f.delete(); DotResourceCache vc = CacheLocator.getVeloctyResourceCache(); vc.remove(ResourceManager.RESOURCE_TEMPLATE + filePath); CacheLocator.getHTMLPageCache().remove((HTMLPage) htmlPage); }
public static void removeContainerFile( Container container, Identifier identifier, boolean EDIT_MODE) { String folderPath = (!EDIT_MODE) ? "live" + java.io.File.separator : "working" + java.io.File.separator; String velocityRootPath = Config.getStringProperty("VELOCITY_ROOT"); if (velocityRootPath.startsWith("/WEB-INF")) { velocityRootPath = Config.CONTEXT.getRealPath(velocityRootPath); } velocityRootPath += java.io.File.separator; String filePath = folderPath + identifier.getInode() + "." + Config.getStringProperty("VELOCITY_CONTAINER_EXTENSION"); java.io.File f = new java.io.File(velocityRootPath + filePath); f.delete(); DotResourceCache vc = CacheLocator.getVeloctyResourceCache(); vc.remove(ResourceManager.RESOURCE_TEMPLATE + filePath); }
@SuppressWarnings("unchecked") public void doPreviewMode(HttpServletRequest request, HttpServletResponse response) throws Exception { String uri = URLDecoder.decode(request.getRequestURI(), UtilMethods.getCharsetConfiguration()); uri = UtilMethods.cleanURI(uri); Host host = hostWebAPI.getCurrentHost(request); StringBuilder preExecuteCode = new StringBuilder(); Boolean widgetPreExecute = false; // Getting the user to check the permissions com.liferay.portal.model.User user = null; HttpSession session = request.getSession(false); try { if (session != null) user = (com.liferay.portal.model.User) session.getAttribute(com.dotmarketing.util.WebKeys.CMS_USER); } catch (Exception nsue) { Logger.warn(this, "Exception trying getUser: "******"idInode", id.getInode()); Logger.debug(VelocityServlet.class, "VELOCITY HTML INODE=" + id.getInode()); Template template = null; Template hostVariablesTemplate = null; // creates the context where to place the variables response.setContentType(CHARSET); Context context = VelocityUtil.getWebContext(request, response); HTMLPage htmlPage = (HTMLPage) APILocator.getVersionableAPI().findWorkingVersion(id, user, true); HTMLPageAPI htmlPageAPI = APILocator.getHTMLPageAPI(); // to check user has permission to write on this page boolean hasWritePermOverHTMLPage = permissionAPI.doesUserHavePermission(htmlPage, PERMISSION_WRITE, user); boolean hasPublishPermOverHTMLPage = permissionAPI.doesUserHavePermission(htmlPage, PERMISSION_PUBLISH, user); context.put("EDIT_HTMLPAGE_PERMISSION", new Boolean(hasWritePermOverHTMLPage)); context.put("PUBLISH_HTMLPAGE_PERMISSION", new Boolean(hasPublishPermOverHTMLPage)); boolean canUserWriteOnTemplate = permissionAPI.doesUserHavePermission( htmlPageAPI.getTemplateForWorkingHTMLPage(htmlPage), PERMISSION_WRITE, user, true); context.put("EDIT_TEMPLATE_PERMISSION", canUserWriteOnTemplate); com.dotmarketing.portlets.templates.model.Template cmsTemplate = com.dotmarketing.portlets.htmlpages.factories.HTMLPageFactory.getHTMLPageTemplate( htmlPage, true); Identifier templateIdentifier = APILocator.getIdentifierAPI().find(cmsTemplate); Logger.debug(VelocityServlet.class, "VELOCITY TEMPLATE INODE=" + cmsTemplate.getInode()); VelocityUtil.makeBackendContext( context, htmlPage, cmsTemplate.getInode(), id.getURI(), request, true, false, true, host); context.put("previewPage", "2"); context.put("livePage", "0"); // get the containers for the page and stick them in context List<Container> containers = APILocator.getTemplateAPI() .getContainersInTemplate(cmsTemplate, APILocator.getUserAPI().getSystemUser(), false); for (Container c : containers) { context.put( String.valueOf("container" + c.getIdentifier()), "/working/" + c.getIdentifier() + "." + Config.getStringProperty("VELOCITY_CONTAINER_EXTENSION")); context.put( "EDIT_CONTAINER_PERMISSION" + c.getIdentifier(), permissionAPI.doesUserHavePermission(c, PERMISSION_WRITE, user, true)); // to check user has permission to write this container Structure st = (Structure) InodeFactory.getInode(c.getStructureInode(), Structure.class); boolean hasWritePermOverTheStructure = permissionAPI.doesUserHavePermission(st, PERMISSION_WRITE, user, true); context.put( "ADD_CONTENT_PERMISSION" + c.getIdentifier(), new Boolean(hasWritePermOverTheStructure)); Logger.debug( VelocityServlet.class, String.valueOf("container" + c.getIdentifier()) + "=/working/" + c.getIdentifier() + "." + Config.getStringProperty("VELOCITY_CONTAINER_EXTENSION")); String sort = (c.getSortContentletsBy() == null) ? "tree_order" : c.getSortContentletsBy(); boolean staticContainer = !UtilMethods.isSet(c.getLuceneQuery()); List<Contentlet> contentlets = null; // get contentlets only for main frame if (request.getParameter("mainFrame") != null) { if (staticContainer) { Logger.debug(VelocityServlet.class, "Static Container!!!!"); Logger.debug( VelocityServlet.class, "html=" + htmlPage.getInode() + " container=" + c.getInode()); // The container doesn't have categories Identifier idenHtmlPage = APILocator.getIdentifierAPI().find(htmlPage); Identifier idenContainer = APILocator.getIdentifierAPI().find(c); contentlets = conAPI.findPageContentlets( idenHtmlPage.getInode(), idenContainer.getInode(), sort, true, -1, user, true); Logger.debug( VelocityServlet.class, "Getting contentlets for language=" + (String) request .getSession() .getAttribute(com.dotmarketing.util.WebKeys.HTMLPAGE_LANGUAGE) + " contentlets =" + contentlets.size()); } if (UtilMethods.isSet(contentlets) && contentlets.size() > 0) { Set<String> contentletIdentList = new HashSet<String>(); List<Contentlet> contentletsFilter = new ArrayList<Contentlet>(); for (Contentlet cont : contentlets) { if (!contentletIdentList.contains(cont.getIdentifier())) { contentletIdentList.add(cont.getIdentifier()); contentletsFilter.add(cont); } } contentlets = contentletsFilter; } List<String> contentletList = new ArrayList<String>(); if (contentlets != null && contentlets.size() > 0) { Iterator<Contentlet> iter = contentlets.iterator(); int count = 0; while (iter.hasNext() && (count < c.getMaxContentlets())) { count++; Contentlet contentlet = (Contentlet) iter.next(); Identifier contentletIdentifier = APILocator.getIdentifierAPI().find(contentlet); boolean hasWritePermOverContentlet = permissionAPI.doesUserHavePermission(contentlet, PERMISSION_WRITE, user, true); context.put( "EDIT_CONTENT_PERMISSION" + contentletIdentifier.getInode(), new Boolean(hasWritePermOverContentlet)); contentletList.add(String.valueOf(contentletIdentifier.getInode())); Logger.debug(this, "Adding contentlet=" + contentletIdentifier.getInode()); Structure contStructure = contentlet.getStructure(); if (contStructure.getStructureType() == Structure.STRUCTURE_TYPE_WIDGET) { Field field = contStructure.getFieldVar("widgetPreexecute"); if (field != null && UtilMethods.isSet(field.getValues())) { preExecuteCode.append(field.getValues().trim() + "\n"); widgetPreExecute = true; } } } } // sets contentletlist with all the files to load per // container context.put("contentletList" + c.getIdentifier(), contentletList); context.put("totalSize" + c.getIdentifier(), new Integer(contentletList.size())); } } Logger.debug( VelocityServlet.class, "Before finding template: /working/" + templateIdentifier.getInode() + "." + Config.getStringProperty("VELOCITY_TEMPLATE_EXTENSION")); Logger.debug( VelocityServlet.class, "Velocity directory:" + VelocityUtil.getEngine().getProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH)); if (request.getParameter("leftMenu") != null) { /* * try to get the messages from the session */ List<String> list = new ArrayList<String>(); if (SessionMessages.contains(request, "message")) { list.add((String) SessionMessages.get(request, "message")); SessionMessages.clear(request); } if (SessionMessages.contains(request, "custommessage")) { list.add((String) SessionMessages.get(request, "custommessage")); SessionMessages.clear(request); } if (list.size() > 0) { ArrayList<String> mymessages = new ArrayList<String>(); Iterator<String> it = list.iterator(); while (it.hasNext()) { try { String message = (String) it.next(); Company comp = PublicCompanyFactory.getDefaultCompany(); mymessages.add(LanguageUtil.get(comp.getCompanyId(), user.getLocale(), message)); } catch (Exception e) { } } context.put("vmessages", mymessages); } template = VelocityUtil.getEngine().getTemplate("/preview_left_menu.vl"); } else if (request.getParameter("mainFrame") != null) { hostVariablesTemplate = VelocityUtil.getEngine() .getTemplate( "/working/" + host.getIdentifier() + "." + Config.getStringProperty("VELOCITY_HOST_EXTENSION")); template = VelocityUtil.getEngine() .getTemplate( "/working/" + templateIdentifier.getInode() + "." + Config.getStringProperty("VELOCITY_TEMPLATE_EXTENSION")); } else { template = VelocityUtil.getEngine().getTemplate("/preview_mode.vl"); } PrintWriter out = response.getWriter(); request.setAttribute("velocityContext", context); try { if (widgetPreExecute) { VelocityUtil.getEngine().evaluate(context, out, "", preExecuteCode.toString()); } if (hostVariablesTemplate != null) hostVariablesTemplate.merge(context, out); template.merge(context, out); } catch (ParseErrorException e) { out.append(e.getMessage()); } }
@SuppressWarnings("unchecked") public static InputStream buildStream(HTMLPage htmlPage, Identifier identifier, boolean EDIT_MODE) throws DotDataException, DotSecurityException { String folderPath = (!EDIT_MODE) ? "live/" : "working/"; InputStream result; StringBuilder sb = new StringBuilder(); ContentletAPI conAPI = APILocator.getContentletAPI(); Template cmsTemplate = com.dotmarketing.portlets.htmlpages.factories.HTMLPageFactory.getHTMLPageTemplate( htmlPage, EDIT_MODE); if (cmsTemplate == null || !InodeUtils.isSet(cmsTemplate.getInode())) { Logger.error( This.class, "PAGE DOES NOT HAVE A VALID TEMPLATE (template unpublished?) : page id " + htmlPage.getIdentifier() + ":" + identifier.getURI()); } // gets pageChannel for this path java.util.StringTokenizer st = new java.util.StringTokenizer(String.valueOf(identifier.getURI()), "/"); String pageChannel = null; if (st.hasMoreTokens()) { pageChannel = st.nextToken(); } // set the page cache var if (htmlPage.getCacheTTL() > 0 && LicenseUtil.getLevel() > 99) { sb.append("#set($dotPageCacheDate = \"").append(new java.util.Date()).append("\")"); sb.append("#set($dotPageCacheTTL = \"").append(htmlPage.getCacheTTL()).append("\")"); } // set the host variables HTMLPageAPI htmlPageAPI = APILocator.getHTMLPageAPI(); Host host = htmlPageAPI.getParentHost(htmlPage); sb.append("#if(!$doNotParseTemplate)"); sb.append("$velutil.mergeTemplate('") .append(folderPath) .append(host.getIdentifier()) .append(".") .append(Config.getStringProperty("VELOCITY_HOST_EXTENSION")) .append("')"); sb.append(" #end "); // creates the context where to place the variables // Build a context to pass to the page sb.append("#if(!$doNotSetPageInfo)"); sb.append("#set ( $quote = '\"' )"); sb.append("#set ($HTMLPAGE_INODE = \"") .append(String.valueOf(htmlPage.getInode())) .append("\" )"); sb.append("#set ($HTMLPAGE_IDENTIFIER = \"") .append(String.valueOf(htmlPage.getIdentifier())) .append("\" )"); sb.append("#set ($HTMLPAGE_TITLE = \"") .append(UtilMethods.espaceForVelocity(htmlPage.getTitle())) .append("\" )"); sb.append( "#set ($HTMLPAGE_FRIENDLY_NAME = \"" + UtilMethods.espaceForVelocity(htmlPage.getFriendlyName())) .append("\" )"); sb.append("#set ($TEMPLATE_INODE = \"") .append(String.valueOf(cmsTemplate.getInode())) .append("\" )"); sb.append("#set ($HTMLPAGE_META = \"") .append(UtilMethods.espaceForVelocity(htmlPage.getMetadata())) .append("\" )"); sb.append("#set ($HTMLPAGE_META = \"#fixBreaks($HTMLPAGE_META)\")"); sb.append("#set ($HTMLPAGE_DESCRIPTION = \"") .append(UtilMethods.espaceForVelocity(htmlPage.getSeoDescription())) .append("\" )"); sb.append("#set ($HTMLPAGE_DESCRIPTION = \"#fixBreaks($HTMLPAGE_DESCRIPTION)\")"); sb.append("#set ($HTMLPAGE_KEYWORDS = \"") .append(UtilMethods.espaceForVelocity(htmlPage.getSeoKeywords())) .append("\" )"); sb.append("#set ($HTMLPAGE_KEYWORDS = \"#fixBreaks($HTMLPAGE_KEYWORDS)\")"); sb.append("#set ($HTMLPAGE_SECURE = \"") .append(String.valueOf(htmlPage.isHttpsRequired())) .append("\" )"); sb.append("#set ($VTLSERVLET_URI = \"") .append(UtilMethods.encodeURIComponent(identifier.getURI())) .append("\" )"); sb.append("#set ($HTMLPAGE_REDIRECT = \"") .append(UtilMethods.espaceForVelocity(htmlPage.getRedirect())) .append("\" )"); sb.append("#set ($pageTitle = \"") .append(UtilMethods.espaceForVelocity(htmlPage.getTitle())) .append("\" )"); sb.append("#set ($pageChannel = \"").append(pageChannel).append("\" )"); sb.append("#set ($friendlyName = \"") .append(UtilMethods.espaceForVelocity(htmlPage.getFriendlyName())) .append("\" )"); Date moddate = null; if (UtilMethods.isSet(htmlPage.getModDate())) { moddate = htmlPage.getModDate(); } else { moddate = htmlPage.getStartDate(); } moddate = new Timestamp(moddate.getTime()); sb.append("#set ($HTML_PAGE_LAST_MOD_DATE= $date.toDate(\"yyyy-MM-dd HH:mm:ss.SSS\", \"") .append(moddate) .append("\"))"); sb.append("#set ($HTMLPAGE_MOD_DATE= $date.toDate(\"yyyy-MM-dd HH:mm:ss.SSS\", \"") .append(moddate) .append("\"))"); sb.append(" #end "); // get the containers for the page and stick them in context // List identifiers = InodeFactory.getChildrenClass(cmsTemplate, Identifier.class); List<Container> containerList = APILocator.getTemplateAPI() .getContainersInTemplate(cmsTemplate, APILocator.getUserAPI().getSystemUser(), false); Iterator i = containerList.iterator(); while (i.hasNext()) { Container ident = (Container) i.next(); Container c = null; if (EDIT_MODE) { c = (Container) APILocator.getVersionableAPI() .findWorkingVersion( ident.getIdentifier(), APILocator.getUserAPI().getSystemUser(), false); } else { c = (Container) APILocator.getVersionableAPI() .findLiveVersion( ident.getIdentifier(), APILocator.getUserAPI().getSystemUser(), false); } // sets container to load the container file sb.append("#set ($container") .append(ident.getIdentifier()) .append(" = \"") .append(folderPath) .append(ident.getIdentifier()) .append(".") .append(Config.getStringProperty("VELOCITY_CONTAINER_EXTENSION")) .append("\" )"); String sort = (c.getSortContentletsBy() == null) ? "tree_order" : c.getSortContentletsBy(); boolean dynamicContainer = UtilMethods.isSet(c.getLuceneQuery()); int langCounter = 0; List<Contentlet> contentlets = new ArrayList<Contentlet>(); List<Contentlet> contentletsFull = new ArrayList<Contentlet>(); if (!dynamicContainer) { Identifier idenHtmlPage = APILocator.getIdentifierAPI().find(htmlPage); Identifier idenContainer = APILocator.getIdentifierAPI().find(c); // The container doesn't have categories try { contentlets = conAPI.findPageContentlets( idenHtmlPage.getId(), idenContainer.getId(), sort, EDIT_MODE, -1, APILocator.getUserAPI().getSystemUser(), false); if (EDIT_MODE) contentletsFull = contentlets; else contentletsFull = conAPI.findPageContentlets( idenHtmlPage.getId(), idenContainer.getId(), sort, true, -1, APILocator.getUserAPI().getSystemUser(), false); } catch (Exception e) { Logger.error(PageServices.class, "Unable to retrive contentlets on page", e); } Logger.debug( PageServices.class, "HTMLPage= " + htmlPage.getInode() + " Container=" + c.getInode() + " Language=-1 Contentlets=" + contentlets.size()); } // this is to filter the contentlets list removing the repited identifiers if (contentlets.size() > 0) { Set<String> contentletIdentList = new HashSet<String>(); List<Contentlet> contentletsFilter = new ArrayList<Contentlet>(); for (Contentlet cont : contentlets) { if (!contentletIdentList.contains(cont.getIdentifier())) { contentletIdentList.add(cont.getIdentifier()); contentletsFilter.add(cont); } } contentlets = contentletsFilter; } if (contentletsFull.size() > 0) { Set<String> contentletIdentList = new HashSet<String>(); List<Contentlet> contentletsFilter = new ArrayList<Contentlet>(); for (Contentlet cont : contentletsFull) { if (!contentletIdentList.contains(cont.getIdentifier())) { contentletIdentList.add(cont.getIdentifier()); contentletsFilter.add(cont); } } contentletsFull = contentletsFilter; } StringBuilder widgetpree = new StringBuilder(); StringBuilder widgetpreeFull = new StringBuilder(); StringBuilder contentletList = new StringBuilder(); int count = 0; for (Contentlet contentlet : contentlets) { contentletList .append(count == 0 ? "" : ",") .append('"') .append(contentlet.getIdentifier()) .append('"'); if (contentlet.getStructure().getStructureType() == Structure.STRUCTURE_TYPE_WIDGET) { Field field = contentlet.getStructure().getFieldVar("widgetPreexecute"); if (field != null && UtilMethods.isSet(field.getValues())) widgetpree.append(field.getValues().trim()); } if (++count >= c.getMaxContentlets()) break; } StringBuilder contentletListFull = new StringBuilder(); int countFull = 0; for (Contentlet contentlet : contentletsFull) { contentletListFull .append(countFull == 0 ? "" : ",") .append('"') .append(contentlet.getIdentifier()) .append('"'); if (contentlet.getStructure().getStructureType() == Structure.STRUCTURE_TYPE_WIDGET) { Field field = contentlet.getStructure().getFieldVar("widgetPreexecute"); if (field != null && UtilMethods.isSet(field.getValues())) widgetpreeFull.append(field.getValues().trim()); } if (++countFull >= c.getMaxContentlets()) break; } sb.append("#if($request.session.getAttribute(\"tm_date\"))"); sb.append(widgetpreeFull); sb.append("#set ($contentletList") .append(ident.getIdentifier()) .append(" = [") .append(contentletListFull.toString()) .append("] )"); sb.append("#set ($totalSize") .append(ident.getIdentifier()) .append("=") .append(countFull) .append(")"); sb.append("#else "); sb.append(widgetpree); sb.append("#set ($contentletList") .append(ident.getIdentifier()) .append(" = [") .append(contentletList.toString()) .append("] )"); sb.append("#set ($totalSize") .append(ident.getIdentifier()) .append("=") .append(count) .append(")"); sb.append("#end "); langCounter++; } if (htmlPage.isHttpsRequired()) { sb.append(" #if(!$ADMIN_MODE && !$request.isSecure())"); sb.append(" #if($request.getQueryString())"); sb.append( " #set ($REDIRECT_URL = \"https://${request.getServerName()}$request.getAttribute('javax.servlet.forward.request_uri')?$request.getQueryString()\")"); sb.append(" #else "); sb.append( " #set ($REDIRECT_URL = \"https://${request.getServerName()}$request.getAttribute('javax.servlet.forward.request_uri')\")"); sb.append(" #end "); sb.append(" $response.sendRedirect(\"$REDIRECT_URL\")"); sb.append(" #end "); } sb.append("#if($HTMLPAGE_REDIRECT != \"\")"); sb.append(" $response.sendRedirect(\"$HTMLPAGE_REDIRECT\")"); sb.append("#end"); Identifier iden = APILocator.getIdentifierAPI().find(cmsTemplate); sb.append("#if(!$doNotParseTemplate)"); if (cmsTemplate.isDrawed()) { // We have a designed template // Setting some theme variables sb.append("#set ($dotTheme = $templatetool.theme(\"") .append(cmsTemplate.getTheme()) .append("\",\"") .append(host.getIdentifier()) .append("\"))"); sb.append("#set ($dotThemeLayout = $templatetool.themeLayout(\"") .append(cmsTemplate.getInode()) .append("\" ))"); // Merging our template sb.append("$velutil.mergeTemplate(\"$dotTheme.templatePath\")"); } else { sb.append("$velutil.mergeTemplate('") .append(folderPath) .append(iden.getInode()) .append(".") .append(Config.getStringProperty("VELOCITY_TEMPLATE_EXTENSION")) .append("')"); } sb.append("#end"); try { if (Config.getBooleanProperty("SHOW_VELOCITYFILES", false)) { String realFolderPath = (!EDIT_MODE) ? "live" + java.io.File.separator : "working" + java.io.File.separator; String velocityRootPath = Config.getStringProperty("VELOCITY_ROOT"); String filePath = realFolderPath + identifier.getInode() + "." + Config.getStringProperty("VELOCITY_HTMLPAGE_EXTENSION"); if (velocityRootPath.startsWith("/WEB-INF")) { velocityRootPath = com.liferay.util.FileUtil.getRealPath(velocityRootPath); } velocityRootPath += java.io.File.separator; java.io.BufferedOutputStream tmpOut = new java.io.BufferedOutputStream( new java.io.FileOutputStream( new java.io.File( ConfigUtils.getDynamicVelocityPath() + java.io.File.separator + filePath))); // Specify a proper character encoding OutputStreamWriter out = new OutputStreamWriter(tmpOut, UtilMethods.getCharsetConfiguration()); out.write(sb.toString()); out.flush(); out.close(); tmpOut.close(); } } catch (Exception e) { Logger.error(PageServices.class, e.toString(), e); } try { result = new ByteArrayInputStream(sb.toString().getBytes("UTF-8")); } catch (UnsupportedEncodingException e1) { result = new ByteArrayInputStream(sb.toString().getBytes()); Logger.error(ContainerServices.class, e1.getMessage(), e1); } return result; }
public static InputStream buildVelocity( Container container, Identifier identifier, boolean EDIT_MODE) { InputStream result; StringBuilder sb = new StringBuilder(); boolean isDynamic = UtilMethods.isSet(container.getLuceneQuery()); // let's write this puppy out to our file sb.append("#set($SERVER_NAME =\"$host.getHostname()\" )"); sb.append("#set($CONTAINER_IDENTIFIER_INODE = '").append(identifier.getInode()).append("')"); sb.append("#set($CONTAINER_INODE = '").append(container.getInode()).append("')"); sb.append("#set($CONTAINER_MAX_CONTENTLETS = ") .append(container.getMaxContentlets()) .append(")"); Structure st = (Structure) InodeFactory.getInode(container.getStructureInode(), Structure.class); sb.append("#set($CONTAINER_STRUCTURE_NAME = \"") .append((UtilMethods.isSet(st.getName()) ? st.getName() : "")) .append("\")"); sb.append("#set($STATIC_CONTAINER = ") .append(!UtilMethods.isSet(container.getLuceneQuery())) .append(")"); sb.append("#set($SORT_PAGE = \"").append(container.getSortContentletsBy()).append("\")"); sb.append("#set($containerInode = '").append(container.getInode()).append("')"); if (EDIT_MODE) { // Permissions to read/use the container in order to be able to add content to it and reorder // content sb.append("#set($USE_CONTAINER_PERMISSION = $USE_CONTAINER_PERMISSION") .append(identifier.getInode()) .append(")"); // Permissions to edit the container based on write permission ).append( access to the portlet sb.append("#set($EDIT_CONTAINER_PERMISSION = $EDIT_CONTAINER_PERMISSION") .append(identifier.getInode()) .append(")"); // Permissions over the structure to add new contents sb.append("#set($ADD_CONTENT_PERMISSION = $ADD_CONTENT_PERMISSION") .append(identifier.getInode()) .append(")"); } sb.append("#set($CONTENTLETS = $contentletList").append(identifier.getInode()).append(")"); sb.append("#set($CONTAINER_NUM_CONTENTLETS = $totalSize") .append(identifier.getInode()) .append(")"); sb.append("#set($CONTAINER_NAME = \"") .append(UtilMethods.espaceForVelocity(container.getTitle())) .append("\")"); sb.append("#set($CONTAINER_STRUCTURE_NAME = \"") .append(UtilMethods.espaceForVelocity(st.getName())) .append("\")"); if (UtilMethods.isSet(container.getNotes())) sb.append("#set($CONTAINER_NOTES = \"") .append(UtilMethods.espaceForVelocity(container.getNotes())) .append("\")"); else sb.append("#set($CONTAINER_NOTES = \"\")"); /* * isDynamic means that the content list will be pulled from lucene. */ if (isDynamic) { String luceneQuery = container.getLuceneQuery(); sb.append("#set($CONTENTS_PER_PAGE = \"$CONTAINER_MAX_CONTENTLETS\")"); sb.append("#if($request.getParameter(\"cont_") .append(identifier.getInode()) .append("_per_page\"))"); sb.append("#set($CONTENTS_PER_PAGE = $request.getParameter(\"cont_") .append(identifier.getInode()) .append("_per_page\"))"); sb.append("#end"); sb.append("#set($CURRENT_PAGE = \"1\")"); sb.append("#if($request.getParameter(\"cont_") .append(identifier.getInode()) .append("_page\"))"); sb.append("#set($CURRENT_PAGE = $request.getParameter(\"cont_") .append(identifier.getInode()) .append("_page\"))"); sb.append("#end"); sb.append("#set($LUCENE_QUERY = \"").append(luceneQuery).append("\")"); } // if the container needs to get its contentlets if (container.getMaxContentlets() > 0) { sb.append("#if($EDIT_MODE)"); // To edit the look, see WEB-INF/velocity/static/preview/container_controls.vtl sb.append("<div class='dotContainer'>"); sb.append("#end"); // pre loop if it exists if (UtilMethods.isSet(container.getPreLoop())) { sb.append(container.getPreLoop()); } // let's do the search of contentlets using lucene query if (isDynamic) { Structure containerStructure = (Structure) InodeFactory.getInode(container.getStructureInode(), Structure.class); sb.append("#set($contentletResultsMap") .append(identifier.getInode()) .append(" = $contents.searchWithLuceneQuery(\"") .append(containerStructure.getInode()) .append("\", ") .append("\"$LUCENE_QUERY\", ") .append("\"$SORT_PAGE\", ") .append("$CURRENT_PAGE, $CONTENTS_PER_PAGE)) "); sb.append("#set($contentletList") .append(identifier.getInode()) .append(" = $contents.getContentIdentifiersFromLuceneHits($contentletResultsMap") .append(identifier.getInode()) .append(".get(\"assets\")))"); sb.append("#set($HAS_NEXT_PAGE = $contentletResultsMap") .append(identifier.getInode()) .append(".get(\"has_next_page\"))"); sb.append("#set($HAS_PREVIOUS_PAGE = $contentletResultsMap") .append(identifier.getInode()) .append(".get(\"has_previous_page\"))"); sb.append("#set($TOTAL_CONTENTS = $contentletResultsMap") .append(identifier.getInode()) .append(".get(\"total_records_int\"))"); sb.append("#set($TOTAL_PAGES = $contentletResultsMap") .append(identifier.getInode()) .append(".get(\"total_pages_int\"))"); sb.append("#set($CONTENTLETS = $contentletList").append(identifier.getInode()).append(")"); sb.append("#set($CONTAINER_NUM_CONTENTLETS = $totalSize") .append(identifier.getInode()) .append(")"); } sb.append("#foreach ($contentletId in $contentletList") .append(identifier.getInode()) .append(")"); // ##Checking of contentlet is parseable and not throwing errors if (EDIT_MODE) { sb.append("#if($webapi.canParseContent($contentletId,true))"); } // sb.append("\n#if($webapi.canParseContent($contentletId,"+EDIT_MODE+")) "); sb.append(" #set($_show_working_=false) "); // if timemachine future enabled sb.append(" #if($request.session.getAttribute(\"tm_date\")) "); sb.append( " #set($_tmdate=$date.toDate($webapi.parseLong($request.session.getAttribute(\"tm_date\")))) "); sb.append(" #set($_ident=$webapi.findIdentifierById($contentletId)) "); // if the content has expired we rewrite the identifier so it isn't loaded sb.append( " #if($UtilMethods.isSet($_ident.sysExpireDate) && $_tmdate.after($_ident.sysExpireDate))"); sb.append(" #set($contentletId='') "); sb.append(" #end "); // if the content should be published then force to show the working version sb.append( " #if($UtilMethods.isSet($_ident.sysPublishDate) && $_tmdate.after($_ident.sysPublishDate))"); sb.append(" #set($_show_working_=true) "); sb.append(" #end "); sb.append(" #end "); sb.append("#set($CONTENT_INODE = '')"); sb.append(" #if($contentletId != '') "); sb.append(" #getContentDetail($contentletId) "); sb.append(" #end "); sb.append("#if($CONTENT_INODE != '')"); if (!EDIT_MODE) { sb.append( "#set($_hasPermissionToViewContent = $contents.doesUserHasPermission($CONTENT_INODE, 1, $user, true))"); // ##Checking permission to see content sb.append("#if($_hasPermissionToViewContent)"); } String code = container.getCode(); // ### HEADER ### String startTag = "${contentletStart}"; if (!code.contains(startTag)) { sb.append("#if($EDIT_MODE)"); sb.append("<div class=\"dotContentlet\">"); // An empty div is added here because in Internet Explorer, there is a styling issue // http://jira.dotmarketing.net/browse/DOTCMS-1974 sb.append("<div>"); sb.append(" #end "); } else { String headerString = "#if($EDIT_MODE)" + "<div class=\"dotContentlet\">" + "<div>" + "#end "; code = code.replace(startTag, headerString); } // ### END HEADER ### // ### BODY ### String endTag = "${contentletEnd}"; boolean containsEndTag = code.contains(endTag); if (containsEndTag) { String footerString = "#if($EDIT_MODE && ${contentletId.indexOf(\".structure\")}==-1)" + "$velutil.mergeTemplate('static/preview_mode/content_controls.vtl')" + "#end" + "#if($EDIT_MODE)" + "<div class=\"dotClear\"></div></div>" + "#end "; code = code.replace(endTag, footerString); } sb.append("#if($isWidget == true)"); sb.append("$widgetCode"); sb.append(" #else"); sb.append(code); sb.append(" #end "); // The empty div added for styling issue in Internet Explorer is closed here // http://jira.dotmarketing.net/browse/DOTCMS-1974 sb.append("#if($EDIT_MODE)"); sb.append("</div>"); sb.append("#end "); // ### END BODY ### // ### FOOTER ### if (!containsEndTag) { sb.append("#if($EDIT_MODE && ${contentletId.indexOf(\".structure\")}==-1)"); sb.append("#getContentDetail($contentletId)"); sb.append("$velutil.mergeTemplate('static/preview_mode/content_controls.vtl')"); sb.append("#end "); sb.append("#if($EDIT_MODE) "); sb.append("<div class=\"dotClear\"></div></div>"); sb.append("#end "); } // ### END FOOTER ### if (!EDIT_MODE) { // ##End of checking permission to see content sb.append("#end "); } // ##Ends the inner canParse call sb.append("#end "); // ##Case the contentlet is not parseable and throwing errors if (EDIT_MODE) { sb.append("#else "); sb.append("#set($CONTENT_INODE =\"$webapi.getContentInode($contentletId)\")"); sb.append( "#set($EDIT_CONTENT_PERMISSION =\"$webapi.getContentPermissions($contentletId)\")"); sb.append("<div class=\"dotContentlet\">"); sb.append(" Content Parse Error. Check your Content Code. "); sb.append("$velutil.mergeTemplate('static/preview_mode/content_controls.vtl')"); sb.append("<div class=\"dotClear\"></div></div>"); sb.append("#end "); } // ##End of foreach loop sb.append("#end "); // post loop if it exists if (UtilMethods.isSet(container.getPostLoop())) { sb.append(container.getPostLoop()); } // close our container preview mode div sb.append("#if($EDIT_MODE)"); sb.append("$velutil.mergeTemplate('static/preview_mode/container_controls.vtl')"); sb.append("</div>"); sb.append("#end "); } else { sb.append(container.getCode()); } try { String folderPath = (!EDIT_MODE) ? "live" + File.separator : "working" + File.separator; String velocityRootPath = Config.getStringProperty("VELOCITY_ROOT"); if (velocityRootPath.startsWith("/WEB-INF")) { velocityRootPath = Config.CONTEXT.getRealPath(velocityRootPath); } velocityRootPath += File.separator; String filePath = folderPath + identifier.getInode() + "." + Config.getStringProperty("VELOCITY_CONTAINER_EXTENSION"); if (Config.getBooleanProperty("SHOW_VELOCITYFILES", false)) { java.io.BufferedOutputStream tmpOut = new java.io.BufferedOutputStream( new java.io.FileOutputStream( new java.io.File( ConfigUtils.getDynamicVelocityPath() + File.separator + filePath))); // Specify a proper character encoding OutputStreamWriter out = new OutputStreamWriter(tmpOut, UtilMethods.getCharsetConfiguration()); out.write(sb.toString()); out.flush(); out.close(); tmpOut.close(); } } catch (Exception e) { Logger.error(ContentletServices.class, e.toString(), e); } try { result = new ByteArrayInputStream(sb.toString().getBytes("UTF-8")); } catch (UnsupportedEncodingException e1) { result = new ByteArrayInputStream(sb.toString().getBytes()); Logger.error(ContainerServices.class, e1.getMessage(), e1); } return result; }
public int compare(Template o1, Template o2) { try { Identifier id1 = APILocator.getIdentifierAPI().find(o1.getIdentifier()); if (id1.getHostId() == null) id1 = null; Identifier id2 = APILocator.getIdentifierAPI().find(o2.getIdentifier()); if (id2.getHostId() == null) id2 = null; if (id1 != null && id2 != null && id1.getHostId().equals(baseHostId) && id2.getHostId().equals(baseHostId)) { return o1.getTitle().compareTo(o2.getTitle()); } if (id1 != null && id1.getHostId().equals(baseHostId)) { return -1; } if (id2 != null && id2.getHostId().equals(baseHostId)) { return 1; } return id1 == null || id2 == null || id1.getHostId().equals(id2.getHostId()) ? o1.getTitle().compareTo(o2.getTitle()) : id1.getHostId().compareTo(id2.getHostId()); } catch (DotDataException e) { } return 0; }
public void processAction( ActionMapping mapping, ActionForm form, PortletConfig config, ActionRequest req, ActionResponse res) throws Exception { String cmd = req.getParameter("cmd"); String subcmd = ParamUtil.getString(req, "subcmd"); String referer = (req.getParameter("referer") != null) ? URLDecoder.decode(req.getParameter("referer"), "UTF-8") : "/c"; Logger.debug(DirectorAction.class, "DirectorAction :: referer=" + referer); // wraps request to get session object ActionRequestImpl reqImpl = (ActionRequestImpl) req; HttpServletRequest httpReq = reqImpl.getHttpServletRequest(); // gets the session object for the messages HttpSession session = httpReq.getSession(); Logger.debug(DirectorAction.class, "I'm inside the Director cmd = " + cmd); Logger.debug(DirectorAction.class, "I'm inside the Director subcmd = " + subcmd); Logger.debug(DirectorAction.class, "I'm inside the Director referer = " + referer); // get the user User user = _getUser(req); // to order menu items if (cmd != null && cmd.equals("orderMenu")) { Logger.debug(DirectorAction.class, "Director :: orderMenu"); java.util.Map params = new java.util.HashMap(); params.put("struts_action", new String[] {"/ext/folders/order_menu"}); params.put("path", new String[] {req.getParameter("path")}); params.put("pagePath", new String[] {req.getParameter("pagePath")}); if (req.getParameter("openAll") != null) { params.put("openAll", new String[] {req.getParameter("openAll")}); } params.put("hostId", new String[] {req.getParameter("hostId")}); params.put("referer", new String[] {referer}); params.put("startLevel", new String[] {req.getParameter("startLevel")}); params.put("depth", new String[] {req.getParameter("depth")}); String af = com.dotmarketing.util.PortletURLUtil.getActionURL( httpReq, WindowState.MAXIMIZED.toString(), params); _sendToReferral(req, res, af); return; } if (cmd != null && cmd.equals("orderContentlets")) { Logger.debug(DirectorAction.class, "Director :: orderContentlet"); Container container = (Container) InodeFactory.getInode(req.getParameter("containerId"), Container.class); HTMLPage htmlPage = (HTMLPage) InodeFactory.getInode(req.getParameter("pageId"), HTMLPage.class); boolean hasReadPermissionOnContainer = perAPI.doesUserHavePermission(container, PERMISSION_READ, user, false); boolean hasWritePermissionOnPage = perAPI.doesUserHavePermission(htmlPage, PERMISSION_WRITE, user, false); if (!hasReadPermissionOnContainer || !hasWritePermissionOnPage) { throw new DotSecurityException( "User has no permission to reorder content on container = " + req.getParameter("container") + " on page = " + req.getParameter("htmlPage")); } java.util.Map params = new java.util.HashMap(); params.put("struts_action", new String[] {"/ext/contentlet/order_contentlets"}); params.put("containerId", new String[] {req.getParameter("containerId")}); params.put("pageId", new String[] {req.getParameter("pageId")}); params.put("referer", new String[] {referer}); String af = com.dotmarketing.util.PortletURLUtil.getActionURL( httpReq, WindowState.MAXIMIZED.toString(), params); _sendToReferral(req, res, af); return; } if (cmd != null && cmd.equals("newHTMLPage")) { Logger.debug(DirectorAction.class, "Director :: editHTMLPage"); java.util.Map params = new java.util.HashMap(); params.put("struts_action", new String[] {"/ext/htmlpages/edit_htmlpage"}); params.put("cmd", new String[] {"edit"}); params.put("inode", new String[] {"0"}); String af = com.dotmarketing.util.PortletURLUtil.getActionURL( httpReq, WindowState.MAXIMIZED.toString(), params); _sendToReferral(req, res, af); return; } if (cmd != null && cmd.equals("editHTMLPage")) { Logger.debug(DirectorAction.class, "Director :: editHTMLPage"); HTMLPage htmlPage = (HTMLPage) InodeFactory.getInode(req.getParameter("htmlPage"), HTMLPage.class); Identifier identifier = APILocator.getIdentifierAPI().find(htmlPage); // gets the current working asset WebAsset workingHTMLPage = (WebAsset) APILocator.getVersionableAPI() .findWorkingVersion(identifier, APILocator.getUserAPI().getSystemUser(), false); if ("unlockHTMLPage".equals(subcmd)) { WebAssetFactory.unLockAsset(workingHTMLPage); } if (workingHTMLPage.isLocked() && !workingHTMLPage.getModUser().equals(user.getUserId())) { req.setAttribute(WebKeys.HTMLPAGE_EDIT, workingHTMLPage); setForward(req, "portlet.ext.director.unlock_htmlpage"); return; } else if (workingHTMLPage.isLocked()) { // it's locked by the same user WebAssetFactory.unLockAsset(workingHTMLPage); } java.util.Map params = new java.util.HashMap(); params.put("struts_action", new String[] {"/ext/htmlpages/edit_htmlpage"}); params.put("cmd", new String[] {"edit"}); params.put("inode", new String[] {workingHTMLPage.getInode() + ""}); params.put("referer", new String[] {referer}); String af = com.dotmarketing.util.PortletURLUtil.getActionURL( httpReq, WindowState.MAXIMIZED.toString(), params); _sendToReferral(req, res, af); return; } if (cmd != null && cmd.equals("viewStatistics")) { Logger.debug(DirectorAction.class, "Director :: editHTMLPage"); HTMLPage htmlPage = (HTMLPage) InodeFactory.getInode(req.getParameter("htmlPage"), HTMLPage.class); java.util.Map params = new java.util.HashMap(); params.put("struts_action", new String[] {"/ext/htmlpageviews/view_htmlpage_views"}); params.put("htmlpage", new String[] {htmlPage.getInode() + ""}); params.put("referer", new String[] {referer}); String af = com.dotmarketing.util.PortletURLUtil.getRenderURL( httpReq, WindowState.MAXIMIZED.toString(), params); _sendToReferral(req, res, af); return; } if (cmd != null && cmd.equals("editFile")) { Logger.debug(DirectorAction.class, "Director :: editFile"); String fileAssetInode = ""; if (UtilMethods.isSet(req.getParameter("file"))) fileAssetInode = req.getParameter("file"); else return; Identifier identifier = APILocator.getIdentifierAPI().findFromInode(fileAssetInode); if (identifier.getAssetType().equals("contentlet")) { try { Contentlet cont = APILocator.getContentletAPI().find(fileAssetInode, user, false); java.util.Map params = new java.util.HashMap(); params.put("struts_action", new String[] {"/ext/contentlet/edit_contentlet"}); params.put("cmd", new String[] {"edit"}); params.put("inode", new String[] {cont.getInode() + ""}); params.put("referer", new String[] {referer}); String af = com.dotmarketing.util.PortletURLUtil.getActionURL( httpReq, WindowState.MAXIMIZED.toString(), params); _sendToReferral(req, res, af); } catch (DotSecurityException e) { Logger.error(this, e.getMessage()); return; } } else { try { // gets the current working asset WebAsset workingFile = (WebAsset) APILocator.getVersionableAPI() .findWorkingVersion( identifier, APILocator.getUserAPI().getSystemUser(), false); if ("unlockFile".equals(subcmd)) { WebAssetFactory.unLockAsset(workingFile); } if (workingFile.isLocked() && !workingFile.getModUser().equals(user.getUserId())) { req.setAttribute(WebKeys.FILE_EDIT, workingFile); setForward(req, "portlet.ext.director.unlock_file"); return; } else if (workingFile.isLocked()) { // it's locked by the same user WebAssetFactory.unLockAsset(workingFile); } java.util.Map params = new java.util.HashMap(); params.put("struts_action", new String[] {"/ext/files/edit_file"}); params.put("cmd", new String[] {"edit"}); params.put("inode", new String[] {workingFile.getInode() + ""}); params.put("referer", new String[] {referer}); String af = com.dotmarketing.util.PortletURLUtil.getActionURL( httpReq, WindowState.MAXIMIZED.toString(), params); _sendToReferral(req, res, af); } catch (DotStateException e) { Logger.error(this, e.getMessage()); return; } catch (DotSecurityException e) { Logger.error(this, e.getMessage()); return; } } return; } if (cmd != null && cmd.equals("editTemplate")) { Logger.debug(DirectorAction.class, "Director :: editTemplate"); HTMLPage htmlPage = new HTMLPage(); WebAsset workingTemplate = new Template(); if (req.getParameter("htmlPage") != null) { htmlPage = (HTMLPage) InodeFactory.getInode(req.getParameter("htmlPage"), HTMLPage.class); workingTemplate = HTMLPageFactory.getHTMLPageTemplate(htmlPage, true); } else if (req.getParameter("template") != null) { workingTemplate = (Template) InodeFactory.getInode(req.getParameter("template"), Template.class); } if ("unlockTemplate".equals(subcmd)) { WebAssetFactory.unLockAsset(workingTemplate); } if (workingTemplate.isLocked() && !workingTemplate.getModUser().equals(user.getUserId())) { req.setAttribute(WebKeys.HTMLPAGE_EDIT, htmlPage); req.setAttribute(WebKeys.TEMPLATE_EDIT, workingTemplate); setForward(req, "portlet.ext.director.unlock_template"); return; } else if (workingTemplate.isLocked()) { // it's locked by the same user WebAssetFactory.unLockAsset(workingTemplate); } java.util.Map params = new java.util.HashMap(); params.put("struts_action", new String[] {"/ext/templates/edit_template"}); params.put("cmd", new String[] {"edit"}); params.put("inode", new String[] {workingTemplate.getInode() + ""}); params.put("referer", new String[] {referer}); String af = com.dotmarketing.util.PortletURLUtil.getActionURL( httpReq, WindowState.MAXIMIZED.toString(), params); _sendToReferral(req, res, af); return; } if (cmd != null && cmd.equals("publishHTMLPage")) { Logger.debug(DirectorAction.class, "Director :: publishHTMLPage"); HTMLPage htmlPage = (HTMLPage) InodeFactory.getInode(req.getParameter("htmlPage"), HTMLPage.class); java.util.Map params = new java.util.HashMap(); params.put("struts_action", new String[] {"/ext/htmlpages/publish_htmlpages"}); params.put("cmd", new String[] {"prepublish"}); params.put("publishInode", new String[] {htmlPage.getInode() + ""}); params.put("referer", new String[] {referer}); String af = com.dotmarketing.util.PortletURLUtil.getActionURL( httpReq, WindowState.MAXIMIZED.toString(), params); _sendToReferral(req, res, af); return; } if (cmd != null && cmd.equals("editContainer")) { Logger.debug(DirectorAction.class, "Director :: editContainer" + subcmd); Container container = (Container) InodeFactory.getInode(req.getParameter("container"), Container.class); Identifier identifier = APILocator.getIdentifierAPI().find(container); // gets the current working asset WebAsset workingContainer = (WebAsset) APILocator.getVersionableAPI() .findWorkingVersion(identifier, APILocator.getUserAPI().getSystemUser(), false); if ("unlockContainer".equals(subcmd)) { WebAssetFactory.unLockAsset(workingContainer); } if (workingContainer.isLocked() && !workingContainer.getModUser().equals(user.getUserId())) { req.setAttribute(WebKeys.CONTAINER_EDIT, workingContainer); setForward(req, "portlet.ext.director.unlock_container"); return; } else if (workingContainer.isLocked()) { // it's locked by the same user WebAssetFactory.unLockAsset(workingContainer); } java.util.Map params = new java.util.HashMap(); params.put("struts_action", new String[] {"/ext/containers/edit_container"}); params.put("cmd", new String[] {"edit"}); params.put("inode", new String[] {workingContainer.getInode() + ""}); params.put("referer", new String[] {referer}); String af = com.dotmarketing.util.PortletURLUtil.getActionURL( httpReq, WindowState.MAXIMIZED.toString(), params); _sendToReferral(req, res, af); return; } if (cmd != null && cmd.equals("editLink")) { Logger.debug(DirectorAction.class, "Director :: editLink"); String popup = req.getParameter("popup"); Link link = (Link) InodeFactory.getInode(req.getParameter("link"), Link.class); Identifier identifier = APILocator.getIdentifierAPI().find(link); // gets the current working asset WebAsset workingLink = (WebAsset) APILocator.getVersionableAPI() .findWorkingVersion(identifier, APILocator.getUserAPI().getSystemUser(), false); if ("unlockLink".equals(subcmd)) { WebAssetFactory.unLockAsset(workingLink); } if (workingLink.isLocked() && !workingLink.getModUser().equals(user.getUserId())) { req.setAttribute(WebKeys.LINK_EDIT, workingLink); if (UtilMethods.isSet(popup)) { Logger.debug(DirectorAction.class, "Going to SIX I have popup!!!!!!!!!!!!!!!!"); setForward(req, "portlet.ext.director.unlock_popup_link"); return; } else { Logger.debug(DirectorAction.class, "Going to FIVE I dont have popup!!!!!!!!!!!!!!!!"); setForward(req, "portlet.ext.director.unlock_link"); return; } } else if (workingLink.isLocked()) { // it's locked by the same user WebAssetFactory.unLockAsset(workingLink); } String popURL = ""; if (UtilMethods.isSet(popup)) { popURL = "_popup"; } java.util.Map params = new java.util.HashMap(); params.put("struts_action", new String[] {"/ext/links/edit_link"}); params.put("cmd", new String[] {"edit"}); params.put("inode", new String[] {workingLink.getInode() + ""}); params.put("popup", new String[] {popup}); params.put("referer", new String[] {referer}); params.put( "child", new String[] {(req.getParameter("child") != null) ? req.getParameter("child") : ""}); params.put( "page_width", new String[] { (req.getParameter("page_width") != null) ? req.getParameter("page_width") : "" }); params.put( "browse", new String[] {(req.getParameter("browse") != null) ? req.getParameter("browse") : ""}); String af = com.dotmarketing.util.PortletURLUtil.getActionURL( httpReq, WindowState.MAXIMIZED.toString(), params); _sendToReferral(req, res, af); return; } if (cmd != null && cmd.equals("addChild")) { try { Logger.debug(DirectorAction.class, "Director :: addChild"); HibernateUtil.startTransaction(); Contentlet contentlet = new Contentlet(); String cInode = req.getParameter("contentlet"); if (InodeUtils.isSet(cInode)) { contentlet = conAPI.find(cInode, user, true); } Container container = (Container) InodeFactory.getInode(req.getParameter("container"), Container.class); HTMLPage htmlPage = (HTMLPage) InodeFactory.getInode(req.getParameter("htmlPage"), HTMLPage.class); boolean hasPermissionOnContainer = perAPI.doesUserHavePermission(container, PERMISSION_READ, user, false); if (Config.getBooleanProperty("SIMPLE_PAGE_CONTENT_PERMISSIONING", true)) hasPermissionOnContainer = true; boolean hasPermissionsOnPage = perAPI.doesUserHavePermission(htmlPage, PERMISSION_CAN_ADD_CHILDREN, user, false); boolean duplicateContentCheck = false; if (!hasPermissionOnContainer || !hasPermissionsOnPage) { throw new DotSecurityException( "User has no permission to add content on container = " + req.getParameter("container") + " on page = " + req.getParameter("htmlPage")); } Identifier identifier = APILocator.getIdentifierAPI().find(contentlet); Identifier htmlPageIdentifier = APILocator.getIdentifierAPI().find(htmlPage); Identifier containerIdentifier = APILocator.getIdentifierAPI().find(container); if (InodeUtils.isSet(identifier.getInode()) && InodeUtils.isSet(htmlPageIdentifier.getInode()) && InodeUtils.isSet(containerIdentifier.getInode())) { MultiTree mTree = new MultiTree( htmlPageIdentifier.getInode(), containerIdentifier.getInode(), identifier.getInode()); java.util.List<MultiTree> treeList = MultiTreeFactory.getMultiTree(htmlPage, container); for (int i = 0; i < treeList.size(); i++) { if (treeList.get(i).getChild().equals(identifier.getInode())) { duplicateContentCheck = true; session.setAttribute( "duplicatedErrorMessage", "Content already exists in the same container on the page"); } } if (!duplicateContentCheck) { MultiTreeFactory.saveMultiTree(mTree); // Updating the last mod user and last mod date of the page htmlPage.setModDate(new Date()); htmlPage.setModUser(user.getUserId()); HibernateUtil.saveOrUpdate(htmlPage); } } else { Logger.error( this, "Error found trying to associate the contentlet inode: " + contentlet.getInode() + "(iden: " + identifier.getInode() + ") " + "to the container: " + container.getInode() + "(iden: " + containerIdentifier.getInode() + ") " + "of the page: " + htmlPage.getInode() + "(iden: " + htmlPageIdentifier.getInode() + ") " + "the system was unable to find some the identifiers (tree error?)!"); } } catch (DotRuntimeException e) { Logger.error(this, "Unable to add content to page", e); } finally { try { HibernateUtil.commitTransaction(); } catch (Exception e) { session.setAttribute( "duplicatedErrorMessage", "Content already exists in the same container on the page"); // res.sendRedirect(referer); } } _sendToReferral(req, res, referer); return; } if (cmd != null && cmd.equals("removeChild")) { try { Logger.debug(DirectorAction.class, "Director :: removeChild"); HibernateUtil.startTransaction(); Contentlet contentlet = new Contentlet(); String cInode = req.getParameter("contentlet"); if (InodeUtils.isSet(cInode)) { contentlet = conAPI.find(cInode, user, true); } Container container = (Container) InodeFactory.getInode(req.getParameter("container"), Container.class); HTMLPage htmlPage = (HTMLPage) InodeFactory.getInode(req.getParameter("htmlPage"), HTMLPage.class); boolean hasPermissionOnPage = perAPI.doesUserHavePermission(htmlPage, PERMISSION_CAN_ADD_CHILDREN, user, false); boolean hasPermissionOnContainer = perAPI.doesUserHavePermission(container, PERMISSION_READ, user, false); if (Config.getBooleanProperty("SIMPLE_PAGE_CONTENT_PERMISSIONING", true)) hasPermissionOnContainer = true; if (!hasPermissionOnContainer || !hasPermissionOnPage) { throw new DotSecurityException( "User has no permission to remove content from container = " + req.getParameter("container") + " on page = " + req.getParameter("htmlPage")); } Identifier identifier = APILocator.getIdentifierAPI().find(contentlet); Logger.debug( DirectorAction.class, "Identifier of Contentlet to be removed=" + identifier.getInode()); Contentlet contentletWorking = conAPI.findContentletByIdentifier( identifier.getInode(), false, contentlet.getLanguageId(), user, true); Contentlet liveContentlet = conAPI.findContentletByIdentifier( identifier.getInode(), false, contentlet.getLanguageId(), user, true); Logger.debug( DirectorAction.class, "\n\nContentlet Working to be removed=" + contentletWorking.getInode()); Identifier htmlPageIdentifier = APILocator.getIdentifierAPI().find(htmlPage); Identifier containerIdentifier = APILocator.getIdentifierAPI().find(container); MultiTree multiTree = MultiTreeFactory.getMultiTree(htmlPageIdentifier, containerIdentifier, identifier); Logger.debug(DirectorAction.class, "multiTree=" + multiTree); MultiTreeFactory.deleteMultiTree(multiTree); // Updating the last mod user and last mod date of the page htmlPage.setModDate(new Date()); htmlPage.setModUser(user.getUserId()); HibernateUtil.saveOrUpdate(htmlPage); } catch (DotRuntimeException e) { Logger.error(this, "Unable to remove content from page", e); } finally { HibernateUtil.commitTransaction(); } _sendToReferral(req, res, referer); return; } if (cmd != null && cmd.equals("makeHomePage")) { Logger.debug(DirectorAction.class, "Director :: makeHomePage"); if (InodeUtils.isSet(req.getParameter("htmlPage"))) { HTMLPage htmlPage = (HTMLPage) InodeFactory.getInode(req.getParameter("htmlPage"), HTMLPage.class); Folder folder = APILocator.getFolderAPI().findParentFolder(htmlPage, user, false); UserPreference up = UserPreferencesFactory.getUserPreferenceValue( user.getUserId(), WebKeys.USER_PREFERENCE_HOME_PAGE); if (up.getId() > 0) { up.setValue(htmlPage.getURI(folder)); } else { up.setUserId(user.getUserId()); up.setPreference(WebKeys.USER_PREFERENCE_HOME_PAGE); up.setValue(htmlPage.getURI(folder)); } UserPreferencesFactory.saveUserPreference(up); } else { // the user clicked on set with no page that means unsetting the page UserPreferencesFactory.deleteUserPreference( user.getUserId(), WebKeys.USER_PREFERENCE_HOME_PAGE); } _sendToReferral(req, res, referer); return; } if (cmd != null && cmd.equals("moveUp")) { Logger.debug(DirectorAction.class, "Director :: moveUp"); Contentlet contentlet = new Contentlet(); String cInode = req.getParameter("contentlet"); if (InodeUtils.isSet(cInode)) { contentlet = conAPI.find(cInode, user, true); } Container container = (Container) InodeFactory.getInode(req.getParameter("container"), Container.class); HTMLPage htmlPage = (HTMLPage) InodeFactory.getInode(req.getParameter("htmlPage"), HTMLPage.class); boolean hasPermissionOnPage = perAPI.doesUserHavePermission(htmlPage, PERMISSION_CAN_ADD_CHILDREN, user, false); boolean hasPermissionOnContainer = perAPI.doesUserHavePermission(container, PERMISSION_READ, user, false); if (Config.getBooleanProperty("SIMPLE_PAGE_CONTENT_PERMISSIONING", true)) hasPermissionOnContainer = true; if (!hasPermissionOnContainer || !hasPermissionOnPage) { throw new DotSecurityException( "User has no permission to reorder content on container = " + req.getParameter("container") + " on page = " + req.getParameter("htmlPage")); } String staticContainer = req.getParameter("static"); Logger.debug(DirectorAction.class, "staticContainer=" + staticContainer); java.util.List cletList = new ArrayList(); String sort = (container.getSortContentletsBy() == null) ? "tree_order" : container.getSortContentletsBy(); Identifier idenHtmlPage = APILocator.getIdentifierAPI().find(htmlPage); Identifier idenContainer = APILocator.getIdentifierAPI().find(container); cletList = conAPI.findPageContentlets( idenHtmlPage.getInode(), idenContainer.getInode(), sort, true, contentlet.getLanguageId(), user, false); Logger.debug(DirectorAction.class, "Number of contentlets = " + cletList.size()); int newPosition = cletList.indexOf(contentlet) - 1; if (newPosition >= 0) { idenContainer = APILocator.getIdentifierAPI().find(container); idenHtmlPage = APILocator.getIdentifierAPI().find(htmlPage); int x = 0; Iterator i = cletList.iterator(); while (i.hasNext()) { Identifier iden; MultiTree multiTree; Contentlet c = (Contentlet) i.next(); Logger.debug(DirectorAction.class, "Contentlet inode = " + c.getInode()); if (newPosition == x) { iden = APILocator.getIdentifierAPI().find(contentlet); multiTree = MultiTreeFactory.getMultiTree(idenHtmlPage, idenContainer, iden); multiTree.setTreeOrder(x); MultiTreeFactory.saveMultiTree(multiTree); x++; } if (!c.getInode().equalsIgnoreCase(contentlet.getInode())) { iden = APILocator.getIdentifierAPI().find(c); multiTree = MultiTreeFactory.getMultiTree(idenHtmlPage, idenContainer, iden); multiTree.setTreeOrder(x); MultiTreeFactory.saveMultiTree(multiTree); x++; } } } _sendToReferral(req, res, referer); return; } if (cmd != null && cmd.equals("moveDown")) { Logger.debug(DirectorAction.class, "Director :: moveDown"); Contentlet contentlet = new Contentlet(); String cInode = req.getParameter("contentlet"); if (InodeUtils.isSet(cInode)) { contentlet = conAPI.find(cInode, user, true); } Container container = (Container) InodeFactory.getInode(req.getParameter("container"), Container.class); HTMLPage htmlPage = (HTMLPage) InodeFactory.getInode(req.getParameter("htmlPage"), HTMLPage.class); String staticContainer = req.getParameter("static"); boolean hasPermissionOnPage = perAPI.doesUserHavePermission(htmlPage, PERMISSION_CAN_ADD_CHILDREN, user, false); boolean hasPermissionOnContainer = perAPI.doesUserHavePermission(container, PERMISSION_READ, user, false); if (Config.getBooleanProperty("SIMPLE_PAGE_CONTENT_PERMISSIONING", true)) hasPermissionOnContainer = true; if (!hasPermissionOnContainer || !hasPermissionOnPage) { throw new DotSecurityException( "User has no permission to reorder content on container = " + req.getParameter("container") + " on page = " + req.getParameter("htmlPage")); } Logger.debug(DirectorAction.class, "staticContainer=" + staticContainer); java.util.List cletList = new ArrayList(); String sort = (container.getSortContentletsBy() == null) ? "tree_order" : container.getSortContentletsBy(); Identifier idenHtmlPage = APILocator.getIdentifierAPI().find(htmlPage); Identifier idenContainer = APILocator.getIdentifierAPI().find(container); cletList = conAPI.findPageContentlets( idenHtmlPage.getInode(), idenContainer.getInode(), sort, true, contentlet.getLanguageId(), user, false); Logger.debug(DirectorAction.class, "Number of contentlets = " + cletList.size()); int newPosition = cletList.indexOf(contentlet) + 1; if (newPosition < cletList.size()) { idenContainer = APILocator.getIdentifierAPI().find(container); idenHtmlPage = APILocator.getIdentifierAPI().find(htmlPage); int x = 0; Iterator i = cletList.iterator(); while (i.hasNext()) { Identifier iden; MultiTree multiTree; Contentlet c = (Contentlet) i.next(); Logger.debug(DirectorAction.class, "Contentlet inode = " + c.getInode()); if (!c.getInode().equalsIgnoreCase(contentlet.getInode())) { iden = APILocator.getIdentifierAPI().find(c); multiTree = MultiTreeFactory.getMultiTree(idenHtmlPage, idenContainer, iden); multiTree.setTreeOrder(x); MultiTreeFactory.saveMultiTree(multiTree); x++; } if (newPosition == x) { iden = APILocator.getIdentifierAPI().find(contentlet); multiTree = MultiTreeFactory.getMultiTree(idenHtmlPage, idenContainer, iden); multiTree.setTreeOrder(x); MultiTreeFactory.saveMultiTree(multiTree); x++; } } } _sendToReferral(req, res, referer); return; } if (cmd != null && cmd.equals("unlock")) { Logger.debug(DirectorAction.class, "Director :: unlock Contentlet"); Contentlet contentlet = new Contentlet(); String cInode = req.getParameter("contentlet"); if (InodeUtils.isSet(cInode)) { contentlet = conAPI.find(cInode, user, true); } conAPI.unlock(contentlet, user, true); } if (cmd != null && cmd.equals("createForm")) { Logger.debug(DirectorAction.class, "Director :: createForrm"); java.util.Map params = new java.util.HashMap(); params.put("struts_action", new String[] {"/ext/structure/edit_structure"}); params.put("structureType", new String[] {Integer.toString(Structure.STRUCTURE_TYPE_FORM)}); params.put("cmd", new String[] {"null"}); String af = com.dotmarketing.util.PortletURLUtil.getActionURL( httpReq, WindowState.MAXIMIZED.toString(), params); _sendToReferral(req, res, af); return; } Contentlet contentlet = new Contentlet(); String cInode = req.getParameter("contentlet"); if (InodeUtils.isSet(cInode)) { contentlet = conAPI.find(cInode, user, true); } if (contentlet == null) { throw new DotStateException("Trying to edit an invalid contentlet - inode:" + cInode); } Container container = (Container) InodeFactory.getInode(req.getParameter("container"), Container.class); HTMLPage htmlPage = (HTMLPage) InodeFactory.getInode(req.getParameter("htmlPage"), HTMLPage.class); Logger.debug(DirectorAction.class, "contentlet=" + contentlet.getInode()); String contentletInode = ""; if (InodeUtils.isSet(contentlet.getInode())) { Identifier identifier = APILocator.getIdentifierAPI().find(contentlet); // gets the current working asset Contentlet workingContentlet = conAPI.findContentletByIdentifier( identifier.getInode(), false, contentlet.getLanguageId(), user, false); Logger.debug(DirectorAction.class, "workingContentlet=" + workingContentlet.getInode()); Logger.debug( DirectorAction.class, "workingContentlet.getModUser()=" + workingContentlet.getModUser()); Logger.debug( DirectorAction.class, "workingContentlet.isLocked()=" + workingContentlet.isLocked()); contentletInode = workingContentlet.getInode(); } else { contentletInode = contentlet.getInode(); } Logger.debug(DirectorAction.class, "Director :: Edit Contentlet"); java.util.Map params = new java.util.HashMap(); params.put("struts_action", new String[] {"/ext/contentlet/edit_contentlet"}); String cmdAux = (cmd.equals("newedit") ? cmd : "edit"); params.put("cmd", new String[] {cmdAux}); params.put("htmlpage_inode", new String[] {htmlPage.getInode() + ""}); params.put("contentcontainer_inode", new String[] {container.getInode() + ""}); params.put("inode", new String[] {contentletInode + ""}); if (InodeUtils.isSet(req.getParameter("selectedStructure"))) { params.put("selectedStructure", new String[] {req.getParameter("selectedStructure") + ""}); } params.put( "lang", new String[] {(req.getParameter("language") != null) ? req.getParameter("language") : ""}); params.put("referer", new String[] {referer}); String af = com.dotmarketing.util.PortletURLUtil.getActionURL( httpReq, WindowState.MAXIMIZED.toString(), params); _sendToReferral(req, res, af); return; }
/** * Moves a file into the given directory OR host * * @param file File to be moved * @param parent Destination Folder * @param host Destination Host * @return true if move success, false otherwise * @throws DotDataException * @throws DotStateException * @throws DotSecurityException */ private Boolean moveFile(File file, Folder parent, Host host) throws DotStateException, DotDataException, DotSecurityException { HostAPI hostAPI = APILocator.getHostAPI(); // Find file identifier Identifier identifier = com.dotmarketing.business.APILocator.getIdentifierAPI().find(file); // gets working container File workingWebAsset = (File) APILocator.getVersionableAPI() .findWorkingVersion(identifier, APILocator.getUserAPI().getSystemUser(), false); // gets live container File liveWebAsset = (File) APILocator.getVersionableAPI() .findLiveVersion(identifier, APILocator.getUserAPI().getSystemUser(), false); // checks if another identifer with the same name exists in the same Boolean fileNameExists; if (parent != null) { fileNameExists = fileNameExists(parent, file.getFileName()); } else { fileNameExists = fileNameExists(APILocator.getFolderAPI().findSystemFolder(), file.getFileName()); } if (fileNameExists) { return false; } // assets cache if ((liveWebAsset != null) && (InodeUtils.isSet(liveWebAsset.getInode()))) { LiveCache.removeAssetFromCache(liveWebAsset); } WorkingCache.removeAssetFromCache(workingWebAsset); // gets old parent Folder oldParent = APILocator.getFolderAPI() .findParentFolder(workingWebAsset, APILocator.getUserAPI().getSystemUser(), false); /*oldParent.deleteChild(workingWebAsset); if ((liveWebAsset != null) && (InodeUtils.isSet(liveWebAsset.getInode()))) { oldParent.deleteChild(liveWebAsset); } //add new Parent parent.addChild(workingWebAsset); if ((liveWebAsset != null) && (InodeUtils.isSet(liveWebAsset.getInode()))) { parent.addChild(liveWebAsset); }*/ // gets identifier for this webasset and changes the uri and persists it User systemUser; try { systemUser = APILocator.getUserAPI().getSystemUser(); if (host == null) { host = hostAPI.findParentHost(parent, systemUser, false); } } catch (DotDataException e) { Logger.error(FileFactory.class, e.getMessage(), e); throw new DotRuntimeException(e.getMessage(), e); } catch (DotSecurityException e) { Logger.error(FileFactory.class, e.getMessage(), e); throw new DotRuntimeException(e.getMessage(), e); } identifier.setHostId(host.getIdentifier()); identifier.setURI(parent != null ? workingWebAsset.getURI(parent) : workingWebAsset.getURI()); // HibernateUtil.saveOrUpdate(identifier); APILocator.getIdentifierAPI().save(identifier); if (UtilMethods.isSet(liveWebAsset)) CacheLocator.getIdentifierCache().removeFromCacheByVersionable(liveWebAsset); // IdentifierCache.addAssetToIdentifierCache(liveWebAsset); // Add to Preview and Live Cache if ((liveWebAsset != null) && (InodeUtils.isSet(liveWebAsset.getInode()))) { LiveCache.removeAssetFromCache(liveWebAsset); LiveCache.addToLiveAssetToCache(liveWebAsset); } WorkingCache.removeAssetFromCache(workingWebAsset); WorkingCache.addToWorkingAssetToCache(workingWebAsset); if (file.isShowOnMenu()) { // existing folder with different show on menu ... need to regenerate menu if (parent != null) { RefreshMenus.deleteMenu(oldParent, parent); CacheLocator.getNavToolCache().removeNav(parent.getHostId(), parent.getInode()); } else { RefreshMenus.deleteMenu(oldParent); } CacheLocator.getNavToolCache().removeNav(oldParent.getHostId(), oldParent.getInode()); } return true; }
public void publish(HttpServletRequest request, HttpServletResponse response) throws WorkflowActionFailureException { try { PublisherAPI publisherAPI = PublisherAPI.getInstance(); String _assetId = request.getParameter("assetIdentifier"); String _contentPushPublishDate = request.getParameter("remotePublishDate"); String _contentPushPublishTime = request.getParameter("remotePublishTime"); String _contentPushExpireDate = request.getParameter("remotePublishExpireDate"); String _contentPushExpireTime = request.getParameter("remotePublishExpireTime"); String _iWantTo = request.getParameter("iWantTo"); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-H-m"); Date publishDate = dateFormat.parse(_contentPushPublishDate + "-" + _contentPushPublishTime); List<String> ids = new ArrayList<String>(); try { // check for the categories if (_assetId.equals("CAT")) { ids.add(_assetId); } else { // if the asset is a folder put the inode instead of the identifier Folder folder = null; try { folder = APILocator.getFolderAPI().find(_assetId, getUser(), false); } catch (DotDataException e) { } if (folder != null && UtilMethods.isSet(folder.getInode())) { ids.add(_assetId); } else { // if the asset is not a folder and has identifier, put it, if not, put the inode Identifier iden = APILocator.getIdentifierAPI().findFromInode(_assetId); ids.add(iden.getId()); } } } catch (DotStateException e) { ids.add(_assetId); } catch (DotSecurityException e) { e.printStackTrace(); } String bundleId = UUID.randomUUID().toString(); if (_iWantTo.equals(RemotePublishAjaxAction.DIALOG_ACTION_PUBLISH) || _iWantTo.equals(RemotePublishAjaxAction.DIALOG_ACTION_PUBLISH_AND_EXPIRE)) { publisherAPI.addContentsToPublish(ids, bundleId, publishDate, getUser()); } if (_iWantTo.equals(RemotePublishAjaxAction.DIALOG_ACTION_EXPIRE) || _iWantTo.equals(RemotePublishAjaxAction.DIALOG_ACTION_PUBLISH_AND_EXPIRE)) { if ((!"".equals(_contentPushExpireDate.trim()) && !"".equals(_contentPushExpireTime.trim()))) { bundleId = UUID.randomUUID().toString(); Date expireDate = dateFormat.parse(_contentPushExpireDate + "-" + _contentPushExpireTime); publisherAPI.addContentsToUnpublish(ids, bundleId, expireDate, getUser()); } } } catch (DotPublisherException e) { Logger.debug(PushPublishActionlet.class, e.getMessage()); throw new WorkflowActionFailureException(e.getMessage()); } catch (ParseException e) { Logger.debug(PushPublishActionlet.class, e.getMessage()); throw new WorkflowActionFailureException(e.getMessage()); } catch (DotDataException e) { Logger.error(PushPublishActionlet.class, e.getMessage(), e); } }
@SuppressWarnings("unchecked") protected void doEditMode(HttpServletRequest request, HttpServletResponse response) throws Exception { String uri = request.getRequestURI(); uri = UtilMethods.cleanURI(uri); Host host = hostWebAPI.getCurrentHost(request); StringBuilder preExecuteCode = new StringBuilder(); Boolean widgetPreExecute = false; // Getting the user to check the permissions com.liferay.portal.model.User backendUser = null; try { backendUser = com.liferay.portal.util.PortalUtil.getUser(request); } catch (Exception nsue) { Logger.warn(this, "Exception trying getUser: "******"idInode", String.valueOf(id.getInode())); Logger.debug(VelocityServlet.class, "VELOCITY HTML INODE=" + id.getInode()); Template template = null; Template hostVariablesTemplate = null; // creates the context where to place the variables response.setContentType(CHARSET); Context context = VelocityUtil.getWebContext(request, response); HTMLPage htmlPage = (HTMLPage) APILocator.getVersionableAPI() .findWorkingVersion(id, APILocator.getUserAPI().getSystemUser(), false); HTMLPageAPI htmlPageAPI = APILocator.getHTMLPageAPI(); // to check user has permission to write on this page boolean hasAddChildrenPermOverHTMLPage = permissionAPI.doesUserHavePermission(htmlPage, PERMISSION_CAN_ADD_CHILDREN, backendUser); boolean hasWritePermOverHTMLPage = permissionAPI.doesUserHavePermission(htmlPage, PERMISSION_WRITE, backendUser); boolean hasPublishPermOverHTMLPage = permissionAPI.doesUserHavePermission(htmlPage, PERMISSION_PUBLISH, backendUser); context.put("ADD_CHILDREN_HTMLPAGE_PERMISSION", new Boolean(hasAddChildrenPermOverHTMLPage)); context.put("EDIT_HTMLPAGE_PERMISSION", new Boolean(hasWritePermOverHTMLPage)); context.put("PUBLISH_HTMLPAGE_PERMISSION", new Boolean(hasPublishPermOverHTMLPage)); context.put("canAddForm", new Boolean(LicenseUtil.getLevel() > 199 ? true : false)); context.put("canViewDiff", new Boolean(LicenseUtil.getLevel() > 199 ? true : false)); boolean canUserWriteOnTemplate = permissionAPI.doesUserHavePermission( htmlPageAPI.getTemplateForWorkingHTMLPage(htmlPage), PERMISSION_WRITE, backendUser) && portletAPI.hasTemplateManagerRights(backendUser); context.put("EDIT_TEMPLATE_PERMISSION", canUserWriteOnTemplate); com.dotmarketing.portlets.templates.model.Template cmsTemplate = com.dotmarketing.portlets.htmlpages.factories.HTMLPageFactory.getHTMLPageTemplate( htmlPage, true); if (cmsTemplate == null) { // DOTCMS-4051 cmsTemplate = new com.dotmarketing.portlets.templates.model.Template(); Logger.debug(VelocityServlet.class, "HTMLPAGE TEMPLATE NOT FOUND"); } Identifier templateIdentifier = APILocator.getIdentifierAPI().find(cmsTemplate); Logger.debug(VelocityServlet.class, "VELOCITY TEMPLATE INODE=" + cmsTemplate.getInode()); VelocityUtil.makeBackendContext( context, htmlPage, cmsTemplate.getInode(), id.getURI(), request, true, true, false, host); // added to show tabs context.put("previewPage", "1"); // get the containers for the page and stick them in context List<Container> containers = APILocator.getTemplateAPI() .getContainersInTemplate(cmsTemplate, APILocator.getUserAPI().getSystemUser(), false); for (Container c : containers) { context.put( String.valueOf("container" + c.getIdentifier()), "/working/" + c.getIdentifier() + "." + Config.getStringProperty("VELOCITY_CONTAINER_EXTENSION")); boolean hasWritePermissionOnContainer = permissionAPI.doesUserHavePermission(c, PERMISSION_WRITE, backendUser, false) && portletAPI.hasContainerManagerRights(backendUser); boolean hasReadPermissionOnContainer = permissionAPI.doesUserHavePermission(c, PERMISSION_READ, backendUser, false); context.put("EDIT_CONTAINER_PERMISSION" + c.getIdentifier(), hasWritePermissionOnContainer); if (Config.getBooleanProperty("SIMPLE_PAGE_CONTENT_PERMISSIONING", true)) context.put("USE_CONTAINER_PERMISSION" + c.getIdentifier(), true); else context.put("USE_CONTAINER_PERMISSION" + c.getIdentifier(), hasReadPermissionOnContainer); // to check user has permission to write this container Structure st = (Structure) InodeFactory.getInode(c.getStructureInode(), Structure.class); boolean hasWritePermOverTheStructure = permissionAPI.doesUserHavePermission(st, PERMISSION_WRITE, backendUser); context.put( "ADD_CONTENT_PERMISSION" + c.getIdentifier(), new Boolean(hasWritePermOverTheStructure)); Logger.debug( VelocityServlet.class, String.valueOf("container" + c.getIdentifier()) + "=/working/" + c.getIdentifier() + "." + Config.getStringProperty("VELOCITY_CONTAINER_EXTENSION")); String sort = (c.getSortContentletsBy() == null) ? "tree_order" : c.getSortContentletsBy(); List<Contentlet> contentlets = null; boolean staticContainer = !UtilMethods.isSet(c.getLuceneQuery()); // get contentlets only for main frame if (request.getParameter("mainFrame") != null) { if (staticContainer) { Logger.debug(VelocityServlet.class, "Static Container!!!!"); Logger.debug( VelocityServlet.class, "html=" + htmlPage.getInode() + " container=" + c.getInode()); // The container doesn't have categories Identifier idenHtmlPage = APILocator.getIdentifierAPI().find(htmlPage); Identifier idenContainer = APILocator.getIdentifierAPI().find(c); contentlets = conAPI.findPageContentlets( idenHtmlPage.getInode(), idenContainer.getInode(), sort, true, -1, backendUser, true); Logger.debug( VelocityServlet.class, "Getting contentlets for language=" + (String) request .getSession() .getAttribute(com.dotmarketing.util.WebKeys.HTMLPAGE_LANGUAGE) + " contentlets =" + contentlets.size()); } else { String luceneQuery = c.getLuceneQuery(); int limit = c.getMaxContentlets(); String sortBy = c.getSortContentletsBy(); int offset = 0; contentlets = conAPI.search(luceneQuery, limit, offset, sortBy, backendUser, true); } if (UtilMethods.isSet(contentlets) && contentlets.size() > 0) { Set<String> contentletIdentList = new HashSet<String>(); List<Contentlet> contentletsFilter = new ArrayList<Contentlet>(); for (Contentlet cont : contentlets) { if (!contentletIdentList.contains(cont.getIdentifier())) { contentletIdentList.add(cont.getIdentifier()); contentletsFilter.add(cont); } } contentlets = contentletsFilter; } List<String> contentletList = new ArrayList<String>(); if (contentlets != null) { Iterator<Contentlet> iter = contentlets.iterator(); int count = 0; while (iter.hasNext() && (count < c.getMaxContentlets())) { count++; Contentlet contentlet = (Contentlet) iter.next(); Identifier contentletIdentifier = APILocator.getIdentifierAPI().find(contentlet); boolean hasWritePermOverContentlet = permissionAPI.doesUserHavePermission(contentlet, PERMISSION_WRITE, backendUser); context.put( "EDIT_CONTENT_PERMISSION" + contentletIdentifier.getInode(), new Boolean(hasWritePermOverContentlet)); contentletList.add(String.valueOf(contentletIdentifier.getInode())); Logger.debug(this, "Adding contentlet=" + contentletIdentifier.getInode()); Structure contStructure = contentlet.getStructure(); if (contStructure.getStructureType() == Structure.STRUCTURE_TYPE_WIDGET) { Field field = contStructure.getFieldVar("widgetPreexecute"); if (field != null && UtilMethods.isSet(field.getValues())) { preExecuteCode.append(field.getValues().trim() + "\n"); widgetPreExecute = true; } } } } // sets contentletlist with all the files to load per // container context.put("contentletList" + c.getIdentifier(), contentletList); context.put("totalSize" + c.getIdentifier(), new Integer(contentletList.size())); // ### Add the structure fake contentlet ### if (contentletList.size() == 0) { Structure structure = ContainerFactory.getContainerStructure(c); contentletList.add(structure.getInode() + ""); // sets contentletlist with all the files to load per // container context.remove("contentletList" + c.getIdentifier()); context.remove("totalSize" + c.getIdentifier()); // http://jira.dotmarketing.net/browse/DOTCMS-2876 context.put("contentletList" + c.getIdentifier(), new long[0]); context.put("totalSize" + c.getIdentifier(), 0); } // ### END Add the structure fake contentlet ### } } Logger.debug( VelocityServlet.class, "Before finding template: /working/" + templateIdentifier.getInode() + "." + Config.getStringProperty("VELOCITY_TEMPLATE_EXTENSION")); Logger.debug( VelocityServlet.class, "Velocity directory:" + VelocityUtil.getEngine().getProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH)); if (request.getParameter("leftMenu") != null) { /* * try to get the messages from the session */ List<String> list = new ArrayList<String>(); if (SessionMessages.contains(request, "message")) { list.add((String) SessionMessages.get(request, "message")); SessionMessages.clear(request); } if (SessionMessages.contains(request, "custommessage")) { list.add((String) SessionMessages.get(request, "custommessage")); SessionMessages.clear(request); } if (list.size() > 0) { ArrayList<String> mymessages = new ArrayList<String>(); Iterator<String> it = list.iterator(); while (it.hasNext()) { try { String message = (String) it.next(); Company comp = PublicCompanyFactory.getDefaultCompany(); mymessages.add(LanguageUtil.get(comp.getCompanyId(), backendUser.getLocale(), message)); } catch (Exception e) { } } context.put("vmessages", mymessages); } template = VelocityUtil.getEngine().getTemplate("/preview_left_menu.vl"); } else if (request.getParameter("mainFrame") != null) { hostVariablesTemplate = VelocityUtil.getEngine() .getTemplate( "/working/" + host.getIdentifier() + "." + Config.getStringProperty("VELOCITY_HOST_EXTENSION")); template = VelocityUtil.getEngine() .getTemplate( "/working/" + templateIdentifier.getInode() + "." + Config.getStringProperty("VELOCITY_TEMPLATE_EXTENSION")); } else { // Return a resource not found right away if the page is not found, // not try to load the frames if (!InodeUtils.isSet(templateIdentifier.getInode())) throw new ResourceNotFoundException(""); template = VelocityUtil.getEngine().getTemplate("/preview_mode.vl"); } PrintWriter out = response.getWriter(); request.setAttribute("velocityContext", context); try { if (widgetPreExecute) { VelocityUtil.getEngine().evaluate(context, out, "", preExecuteCode.toString()); } if (hostVariablesTemplate != null) hostVariablesTemplate.merge(context, out); template.merge(context, out); } catch (ParseErrorException e) { out.append(e.getMessage()); } }
/** Returns the list of ids the user is trying to remote publish. */ private List<String> getIdsToPush( List<String> assetIds, String _contentFilterDate, SimpleDateFormat dateFormat) throws ParseException, DotDataException { List<String> ids = new ArrayList<String>(); for (String _assetId : assetIds) { if (_assetId != null && !_assetId.trim().isEmpty()) { if (ids.contains(_assetId)) { continue; } // check for the categories if (_assetId.contains("user_") || _assetId.contains("users_")) { // Trying to publish users // If we are trying to push users a filter date must be available if (_assetId.contains("users_")) { Date filteringDate = dateFormat.parse(_contentFilterDate); // Get users where createdate >= ? List<String> usersIds = APILocator.getUserAPI().getUsersIdsByCreationDate(filteringDate, 0, -1); if (usersIds != null) { for (String id : usersIds) { ids.add("user_" + id); } } } else { ids.add(_assetId); } } else if (_assetId.equals("CAT")) { ids.add(_assetId); } else if (_assetId.contains(".jar")) { // Check for OSGI jar bundles ids.add(_assetId); } else { // if the asset is a folder put the inode instead of the identifier try { Folder folder = null; try { folder = APILocator.getFolderAPI().find(_assetId, getUser(), false); } catch (DotSecurityException e) { Logger.error( getClass(), "User: "******" does not have permission to access folder. Folder identifier: " + _assetId); } catch (DotDataException e) { Logger.info(getClass(), "FolderAPI.find(): Identifier is null"); } if (folder != null && UtilMethods.isSet(folder.getInode())) { ids.add(_assetId); } else { // if the asset is not a folder and has identifier, put it, if not, put the inode Identifier iden = APILocator.getIdentifierAPI().findFromInode(_assetId); if (!ids.contains(iden.getId())) { // Multiples languages have the same identifier ids.add(iden.getId()); } } } catch (DotStateException e) { ids.add(_assetId); } } } } return ids; }