File attachment using Adf faces, EJB3 and Oracle XE database Part III
Continued...
Click on Parameters and define input parameter and return parameter as follows.
Create a new java file, and in Managed Beans, provide that file path and name here as
Add a page and a return activity in your taskflow as
Designing Attachment form
Create attachment page and design it as follows
Click on Design view, click on "Attach File" button provide actionListener for button and add showPopupBehaviour inside the button
Implement actionListener as below
Now we need to call attachment-task-flow from edit person page, open person-detail-task-flow and design it as follows
Calling attachment-task-flow from edit person page
Open person-detail-task-flow, and open the page make following modifications in "Attachment" button
Provide Action method and returnListener method in edit-person-task-flow manageBean as
Running the file attachment use case followings are the snaps for file uploading and saving it into database
Now when you click on Save button in add/edit person the attachment also get save into the database. You can also add more files to the person. The functionality of file attachment is completed
The other functionalities like downloading file, deleting file will come on next section.
To be continue -->
Comming up next download and deleting associated files
Step III: Creating taskflow for file-uploading popup
Design the list of employees like following
Design the list of employees like following
List of employees page |
Here the “New” button will open new tab for creating “Person”, “Refresh” button simply executes the "Execute" function and “Detail” will open new table populating selected record data for editing.
The edit/new person screen should be like follwing
add/edit person screen |
In add/edit person screen, "Save" button updates or inserts new record into the database, close button will close the tab and "Attachment" button opens the popup for file attachment.
Lets design the taskflow for fileAttachment
Create the new taskflow for Attachment
Click on overview and select General, uncheck “Use Page fragements”
Click on overview and select General, uncheck “Use Page fragements”
Click on Parameters and define input parameter and return parameter as follows.
Create a new java file, and in Managed Beans, provide that file path and name here as
Add a page and a return activity in your taskflow as
Designing Attachment form
Create attachment page and design it as follows
Add a table and buttons as above, Select the value for table and row selection as single. |
Bind table with backingBean property. |
Creating File brows popup
Create popup and inside popup add dialog |
Add ActionListener for Save File button |
public void commitUpload(ActionEvent actionEvent) { List if (attachmentList == null) attachmentList = new ArrayList attachmentList.add(acchmentEntity1); System.out.println("commit upload"); AdfFacesContext.getCurrentInstance().getPageFlowScope().put("attachmentList", attachmentList); hideUploadWindow(); } |
/** Hide upload method **/ private void hideUploadWindow() { FacesContext context = FacesContext.getCurrentInstance(); ExtendedRenderKitService service = Service.getRenderKitService(context, ExtendedRenderKitService.class); //callling javascript function service.addScript(context, "hidePopup();"); } |
Add ActionListener for Cancel button |
public void cancelUpload(ActionEvent actionEvent) { hideUploadWindow(); } |
Add valueChangeListener and BindingFor Input file |
private RichInputFile inputFile; private Attachment acchmentEntity1; public void setInputFile(RichInputFile inputFile) { this.inputFile = inputFile; } public RichInputFile getInputFile() { return inputFile; } public void onUploading(ValueChangeEvent valueChangeEvent) { UploadedFile file = (UploadedFile)valueChangeEvent.getNewValue(); String fileName = file.getFilename(); BlobDomain blobDomain = createBlobDomain(file); byte[] dataContent = blobDomain.getStorageByteArray(); acchmentEntity1 = new Attachment(); acchmentEntity1.setFileContent(dataContent); acchmentEntity1.setFileName(fileName); } private BlobDomain createBlobDomain(UploadedFile file) { InputStream in = null; BlobDomain blobDomain = null; OutputStream out = null; try { in = file.getInputStream(); blobDomain = new BlobDomain(); out = blobDomain.getBinaryOutputStream(); byte[] buffer = new byte[8192]; int bytesRead = 0; while ((bytesRead = in.read(buffer, 0, 8192)) != -1) { out.write(buffer, 0, bytesRead); } } catch (IOException e) { e.printStackTrace(); } catch (SQLException e) { e.fillInStackTrace(); } finally { try { in.close(); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } } return blobDomain; } |
Add javascript function, and in form tag provide usesUpload="true", here in my case "uploadWindow" is the name of my popup |
Here is the code for my popup |
Inside Attach file button add showPopupBehaviour provide your popupId in popupId attribute. The code for your button should looks like as above. |
public void openPopup(ActionEvent actionEvent) { inputFile.resetValue(); inputFile.setValue(null); } |
Call the return activity on "Done" button for returing from the taskflow |
Provide the input parameter attachmentList from page flow, we will next set this value from backingBean of person-detail-task-flow Provide Run as dialog true, and display type as Inline-popup |
Open person-detail-task-flow, and open the page make following modifications in "Attachment" button
Provide Action method and returnListener method in edit-person-task-flow manageBean as
/** PersonDetailBackingBean.java **/ public String launchAttachment() { Person person = (Person)getCurrentRowDataProvider("findPersonByIdIterator"); getPageFlowSceop().put("attachmentList_", person.getAttachments()); return "to_attachment"; } public void handleReturn(ReturnEvent returnEvent) { Map m = returnEvent.getReturnParameters(); List Person person = (Person)getCurrentRowDataProvider("findPersonByIdIterator"); person.setAttachments(attachmentList); } /** * Reference * http://soadev.blogspot.com/2010/03/adf-model-how-to-programmatically.html */ protected BindingContainer getBindings() { return (BindingContainer)JSFUtils.resolveExpression("#{bindings}"); } protected Object getCurrentRowDataProvider(String iteratorName) { BindingContainer bindings = getBindings(); DCIteratorBinding dcib = (DCIteratorBinding)bindings.get(iteratorName); RowSetIterator iter = dcib.getRowSetIterator(); DCDataRow row = (DCDataRow)iter.getCurrentRow(); return row.getDataProvider(); } |
Bindings of person_detail should looks like above. |
And for the save button in person edit screen it should be binded with datacontrol method "savePerson" |
Saving person will also save the attachments which are associated with it. |
The other functionalities like downloading file, deleting file will come on next section.
To be continue -->
Comming up next download and deleting associated files
Comments
Post a Comment