Upload a download souborů v Oracle Identity Manageru
Cílem tohoto článku je ukázat způsob, kterým lze v Oracle Identity manageru (Sun Identity Manageru) provádět upload a download souborů z klientského počítače na server.
Stažení souborů (File download)
Předpokládejme následující scénář: Na serveru, kde je nasazen Identity Manager je umístěn soubor, jehož download chceme provést. Tento soubor obsahuje např. Export nějakých dat, které vytvořilo naše workflow.
Cílem tohoto článku je ukázat způsob, kterým lze v Oracle Identity manageru (Sun Identity Manageru) provádět upload a download souborů z klientského počítače na server.
Stažení souborů (File download)
Předpokládejme následující scénář: Na serveru, kde je nasazen Identity Manager je umístěn soubor, jehož download chceme provést. Tento soubor obsahuje např. Export nějakých dat, které vytvořilo naše workflow.
voříme si následující jsp stránku, kterou umístíme např. do adresáře idm-staging/bcv/download.jsp:
<%@ include file="../includes/getSessionAdmin.jsp" %> <%@ page import="javax.servlet.ServletOutputStream, java.io.*" %> <% final String CONTENT_TEXTXML = "text/xml"; final String CONTENT_TEXTHTML = "text/html"; final String CONTENT_DISPOS = "Content-Disposition"; final String CONTENT_TYPE_XML = "application/x-download;charset=utf-8"; final String ERROR = "<p class=\"errortxt\">Permision denied. Click the Back button on the browser to continue</p>"; ServletOutputStream out2 = null; InputStream is = null; File file = new File(request.getParameter("fileName")); try { out2 = response.getOutputStream(); is = new FileInputStream(file); byte[] bytes = new byte[1024]; int bytesRead; StringBuffer hdr = new StringBuffer(64); hdr.append("attachment; filename=\"").append("roles.csv").append('"'); response.setHeader(CONTENT_DISPOS,hdr.toString()); response.setContentType(CONTENT_TYPE_XML); while ((bytesRead = is.read(bytes)) != -1) { out2.write(bytes, 0, bytesRead); } } catch (Exception e) { // send a server error response response.setContentType(CONTENT_TEXTHTML); out.print(ERROR); } finally { try { is.close(); } catch (Exception e) {} try { out2.close(); } catch (Exception e) {} } %>
Všimněme si, že stránka očekává jako parametr cestu k souboru, který se má stáhnout. Vytvoříme tedy formulář, který bude obsahovat odkaz na námi vytvořenou jsp stránku:
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE Configuration PUBLIC 'waveset.dtd' 'waveset.dtd'> <Configuration id='#ID#UserForm:Export Download' name='Export Download - Identity Management' wstype='UserForm'> <Extension> <Form name='Export Download' noDefaultButtons="true"> <Display class='HtmlPage'/> <Field name='Nadpis'> <Display class='Title'> <Property name='value' value='UI_SELECT_ROLES_FOR_EXPORT_TITLE'/> </Display> </Field> <Field name='link'> <Display class='Link'> <Property name="URL" value="bcv/download.jsp"/> <Property name='label' value='Stazeni souboru' /> <Property name='arguments'> <map> <s>fileName</s> <ref>cesta_k_souboru</ref> </map> </Property> </Display> </Field> <Field button='true'> <Display class='Button'> <Property name='name' value='variables.formButton'/> <Property name='label' value='File download'/> <Property name='command' value='Cancel'/> <Property name='value' value='cancel'/> </Display> </Field> </Form> </Extension> <MemberObjectGroups> <ObjectRef type='ObjectGroup' id='#ID#Top' name='Top'/> </MemberObjectGroups> </Configuration>
Nahrání souboru (File upload)
Abychom co nejvíce šetřili s pamětí, zkopírujeme si nejprve soubor na disk serveru, na kterém je nasazen Identity manager. Poté zpracujeme data, která jsou v souboru a poté soubor z disku smažeme.
Vytvoříme si workflow, které na svém vstupu nejprve zobrazí následující formulář:
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE Configuration PUBLIC 'waveset.dtd' 'waveset.dtd'> <Configuration id='#ID#UserForm:Identity Management Import' name='Identity Management Import' wstype='UserForm'> <Extension> <Form name='Roles Import' noDefaultButtons="true"> <Display class='HtmlPage'/> <Field name='Nadpis'> <Display class='Title'> <Property name='value' value='Import dat'/> </Display> </Field> <Field name=':f.basicInfo'> <Field> <Display class='Label'> <Property name='title' value='FILE' /> </Display> </Field> <Field name='variables.fileUpload'> <Display class='FileUpload'> <Property name='noNewRow' value='true' /> </Display> <Expansion> <invoke name="saveToFile" class="eu.bcvsolutions.idm.utils.Utils"> <ref>variables.fileUpload</ref> <rule name="getPathToImportFile"/> </invoke> </Expansion> </Field> <Field name="buttons"> <Field button='true'> <Display class='Button'> <Property name='name' value='variables.formButton'/> <Property name='label' value='Upload'/> <Property name='command' value='Save'/> <Property name='value' value='import'/> </Display> </Field> <Field button='true'> <Display class='Button'> <Property name='name' value='variables.formButton'/> <Property name='label' value='Cancel'/> <Property name='command' value='Cancel'/> <Property name='value' value='cancel'/> </Display> </Field> </Field> </Field> </Form> </Extension> <MemberObjectGroups> <ObjectRef type='ObjectGroup' id='#ID#Top' name='Top'/> </MemberObjectGroups> </Configuration>
Poté, co uživatel zadá cestu k souboru a odešle formulář, dojde k zavolání funkce (kód v jazyce Java), která zajistí uložení dat na disk serveru:
public static String saveToFile(DataSource dataSource, String filePath) { InputStream istream = null; BufferedWriter bufferedWriter = null; try { //Create reader istream = ((DataSource) dataSource).getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(istream); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); //Create writer bufferedWriter = new BufferedWriter(new FileWriter(new File(filePath))); //Copy file String line; boolean appendNewLine = false; while ((line = bufferedReader.readLine()) != null) { if (appendNewLine) { bufferedWriter.append("\n"); } else { appendNewLine = true; } bufferedWriter.append(line); } bufferedWriter.flush(); return filePath; } catch (IOException ex) { Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex); return null; } finally { try { istream.close(); } catch (IOException ex) { Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex); return null; } try { bufferedWriter.close(); } catch (IOException ex) { Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex); return null; } } }
Poté, co se data uloží do souboru, pokračuje workflow dále. V něm je možné uploadovaná data dále zpracovávat. V našem případě jsme importovaly data ve formátu CSV, ta byla dále zpracována. Po zpracování dat jsme soubor z disku serveru smazali. V našem případě jsme si museli dát pozor na pojmenování uploadovaného souboru. Pro název souboru jsme proto použili prefix + počet milisekund od 1.11970 :-)