2016-11-19 44 views
1

你好的StackOverflow社區,Liferay的服務構建+文檔庫+ Quartz調度+ Apache的POI

要求: 我需要建議和打算如何創建Liferay的(LR)模塊,該模塊將創建XLS文件幫助從數據庫中提取信息,並在整個星期的預定時間內將它們存儲到文檔庫(DL)中的文件夾位置。

解決方案: 我解決了使用LR的Service Builder + DL + Quartz Scheduler + Apache POI。下面的代碼。

路障: 接收()方法要求,從而可以創建ThemeDisplay和ServiceContext對象RenderRequest中對象,該對象將被DLAppServiceUtil被用來創建在DL該文件。我如何去創建一個RenderRequest對象?

@Override 
public void receive(Message message) throws MessageListenerException { 
    _log.debug(">> receive()"); 

    ThemeDisplay themeDisplay = (ThemeDisplay) renderRequest.getAttribute(WebKeys.THEME_DISPLAY); 
    fileUploadByApp("folder-1", themeDisplay, renderRequest); 

    _log.debug("<< receive()"); 
} 

public void fileUploadByApp(String folderName, ThemeDisplay themeDisplay, RenderRequest renderRequest) { 

    try { 
     File file = new File("D:/liferay-portal-6.2-ce-ga6/temp/sample_" + getDateTimeBasedFilename() + ".txt"); 

     Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "utf-8")); 
     writer.write("Something"); 
     writer.close(); 

     long repositoryId = themeDisplay.getScopeGroupId(); 
     String mimeType = MimeTypesUtil.getContentType(file); 
     String title = file.getName(); 
     String description = "This file is added via programatically"; 
     String changeLog = "hi"; 
     Long parentFolderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID; 

     Folder folder = DLAppServiceUtil.getFolder(themeDisplay.getScopeGroupId(), parentFolderId, folderName); 
     ServiceContext serviceContext = ServiceContextFactory.getInstance(DLFileEntry.class.getName(), 
       renderRequest); 
     InputStream is = new FileInputStream(file); 
     DLAppServiceUtil.addFileEntry(repositoryId, folder.getFolderId(), file.getName(), mimeType, title, 
       description, changeLog, is, file.length(), serviceContext); 

    } catch (Exception e) { 
     System.out.println("Exception"); 
     e.printStackTrace(); 
    } 
} 

Project repo, click here

回答

0

首先,方法receive不需要RenderRequest對象,但你的方法fileUploadByApp。如果您仔細查看自己的方法,那麼ThemeDisplay所需的全部內容爲scopeGroupIdRenderRequest正如你所提到的,對象是創建ServiceContext所必需的,但你至少有2個解決方案。

  1. ServletContextPool獲得一些實例(如果可能的話)。
  2. 創建對象手動

在你可以設置你所需要的第二種情況,但我認爲你需要設置只scopeGroupId,也將努力爲你想要的。變化的

實施例:

@Override 
public void receive(Message message) throws MessageListenerException { 
    _log.debug(">> receive()"); 

    ServiceContext serviceContext = new ServiceContext(); 
    serviceContext.setScopeGroupId(YOUR_SCOPE_GROUP_ID); //For example YOUR_SCOPE_GROUP_ID can be received from message. 
    fileUploadByApp("folder-1", serviceContext); 

    _log.debug("<< receive()"); 
} 

public void fileUploadByApp(String folderName, ServiceContext serviceContext) { 

    try { 
     File file = new File("D:/liferay-portal-6.2-ce-ga6/temp/sample_" + getDateTimeBasedFilename() + ".txt"); 

     Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "utf-8")); 
     writer.write("Something"); 
     writer.close(); 

     long repositoryId = serviceContext.getScopeGroupId(); 
     String mimeType = MimeTypesUtil.getContentType(file); 
     String title = file.getName(); 
     String description = "This file is added via programatically"; 
     String changeLog = "hi"; 
     Long parentFolderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID; 

     Folder folder = DLAppServiceUtil.getFolder(serviceContext.getScopeGroupId(), parentFolderId, folderName); 

     InputStream is = new FileInputStream(file); 
     DLAppServiceUtil.addFileEntry(repositoryId, folder.getFolderId(), file.getName(), mimeType, title, 
       description, changeLog, is, file.length(), serviceContext); 

    } catch (Exception e) { 
     System.out.println("Exception"); 
     e.printStackTrace(); 
    } 
} 
+0

感謝GLW。提供的代碼有助於加入點。我已經添加了解決方案作爲答案。 – MrC0mm0n

0

由於GLW。提供的代碼有助於加入點。除了您提供的代碼片段之外,我還能使用下面的解決方案。

// Repository ID of the document library, figured is out by the output from 
// _log.debug("repositoryId: " + repositoryId); 
// in 
// fileUploadByApp(folderName, themeDisplay, renderRequest). 
// I found the entry in 'ddmcontent' table of LR's default DB 
private long siteARepoId = ?????; 
// Found this in 'company' table of LR's default DB 
private long LRCompanyId = ?????; 
private String sAdminRole = "Administrator"; 

@Override 
public void receive(Message message) throws MessageListenerException { 
    _log.debug(">> receive()"); 

    ServiceContext serviceContext = new ServiceContext(); 
    serviceContext.setScopeGroupId(siteARepoId); 
    fileUploadByApp(DLFolderLocation, serviceContext); 

    _log.debug("<< receive()"); 
} 

public void fileUploadByApp(String folderName, ServiceContext serviceContext) { 
    _log.debug(">> fileUploadByApp(folderName, serviceContext)"); 

    try { 
     File file = new File(LRTempLocation + "excel_" + getDateTimeBasedFilename() + ".xlsx"); 

     createExcel(file); 

     long repositoryId = serviceContext.getScopeGroupId(); 
     String mimeType = MimeTypesUtil.getContentType(file); 
     String title = file.getName(); 
     String description = "This file is added via programatically"; 
     String changeLog = "hi"; 
     Long parentFolderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID; 

     _log.debug("repositoryId: " + repositoryId); 
     _log.debug("fileName: " + file.getName()); 
     _log.debug("mimeType: " + mimeType); 
     _log.debug("title: " + title); 
     _log.debug("description: " + description); 
     _log.debug("changeLog: " + changeLog); 
     _log.debug("fileLength: " + file.length()); 
     _log.debug("serviceContext: " + serviceContext); 

     Folder folder = DLAppLocalServiceUtil.getFolder(repositoryId, parentFolderId, folderName); 

     _log.debug("folderId: " + folder.getFolderId()); 

     InputStream is = new FileInputStream(file); 

     _log.debug("inputStream: " + is); 

     // Initializing PermissionChecker, without the below the exception 
     // occurs 
     // Caused by: com.liferay.portal.security.auth.PrincipalException: 
     // PermissionChecker not initialized 
     // Source: 
     // http://www.open.gr/blog/2014/05/permissionchecker-not-initialised-scheduler-job 
     Company companyqq = CompanyLocalServiceUtil.getCompanyById(LRCompanyId); 
     Role adminRole = RoleLocalServiceUtil.getRole(companyqq.getCompanyId(), sAdminRole); 
     List<User> adminUsers = UserLocalServiceUtil.getRoleUsers(adminRole.getRoleId()); 
     PrincipalThreadLocal.setName(adminUsers.get(0).getUserId()); 
     PermissionChecker permissionChecker = PermissionCheckerFactoryUtil.create(adminUsers.get(0), true); 
     PermissionThreadLocal.setPermissionChecker(permissionChecker); 

     // Adding the file entry to the Document Library 
     DLAppServiceUtil.addFileEntry(repositoryId, folder.getFolderId(), file.getName(), mimeType, title, 
       description, changeLog, is, file.length(), serviceContext); 

    } catch (Exception e) { 
     System.out.println("Exception"); 
     e.printStackTrace(); 
    } 

    _log.debug("<< fileUploadByApp(folderName, serviceContext)"); 
} 

Project Link, click here