05.07.2012

OAF: изображение из BLOB

Имеем изображение, хранящееся в BLOB. Цель - положить его на страницу с помощью image bean.
У image bean есть стандартные атрибуты: View Instance и View Attribute. Однако, для вывода изображения из BLOB является недостаточным просто задать эти атрибуты. Нужно:
  • прописать во VO наше BLOB поле, тип по умолчанию - BlobDomain;
  • сохранить изображение в файл с уникальным именем;
  • программно задать свойство бина image, в котором указать имя файла.
Поехали. Контроллер страницы:
    public void processRequest(OAPageContext pageContext, OAWebBean webBean) {
        super.processRequest(pageContext, webBean);
        String empName = null;
        if (pageContext.getParameter("empName") != null){
            empName = pageContext.getParameter("empName"); 
        }
        OAApplicationModule am = pageContext.getApplicationModule(webBean);
        String fStr = "MyImg.jpg";
         // создаем уникальное имя файла
        fStr = pageContext.generateUniqueImageName(fStr, "temporaryImage");
        if(fStr == null || "".equals(s7.trim())){
             throw OAException.wrapperException(e);
        }
        // второй параметр - текущее пакет
        Serializable[] prm_values = {fStr,  
                                     pageContext.getTemporaryImageLocation()}
        Class[] prm_classes = {  String.class,
                                 String.class };
        // вызываем обертку над выполнением запроса
        String img_src = (String) 
             am.invokeMethod("InitUserDetails", prm_values, prm_classes);
        // находим наш бин
        OAImageBean imagebean = (OAImageBean) 
        webBean.findIndexedChildRecursive("Pic");
        if(imagebean != null)
        {
            // задаем источник данных
            imagebean.setAttributeValue(SOURCE_ATTR, img_src);
            // украшательство
            imagebean.setBorderWidth(2);
        } else
        {
            throw OAException.wrapperException(e);
        } 
    }
Метод InitUserDetails
    public String InitUserDetails(String s1, String s2){
        String ret_imgstr;
        VOImpl vo = getVO1();
        ret_imgstr = (String)vo.GetData(s1, s2);
        return ret_imgstr;
    }
И, наконец, функционал уровня VOImpl:
    public String GetData(String s1, String s2) {
        executeQuery();  
        String s3 = "";
        ImageUtil ut = null;
        if(first() == null)
            {
                 s3 = "";
            } else
            {
                 OARow oarow = (OARow)first();
                 BlobDomain blobdomain = (BlobDomain)oarow.getAttribute("Image");
                 if(blobdomain == null)
                     s3 = "";
                 else
                     ut = new ImageUtil();
                     s3 = ImageUtil.createFile(s2, blobdomain, s1);
            }
        return s3;  
    } 
ImageUtil - класс для работы с изображениями из библиотеки import.com.sun.imageio.plugins.common.ImageUtil;

Комментариев нет :