Показаны сообщения с ярлыком Java. Показать все сообщения
Показаны сообщения с ярлыком Java. Показать все сообщения

23.07.2018

Анмаршаллинг XML в класс при помощи JAXB

public JAXBElement processFile(File file){
        Class clazz = SomePojo.class;
        JAXBElement jaxbElement = null;
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            jaxbElement = unmarshaller.unmarshal(new StreamSource(file), clazz);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return jaxbElement;
    }

27.04.2017

Список полей через java reflection

private List getElementMetadata(Class clazz){
    List<Field> list = new ArrayList<>();
    if (clazz.getSuperclass() != null && !clazz.getSuperclass().equals(Object.class)) {
        List<Field> sublist = getElementMetadata(clazz.getSuperclass());
        for(Field field : sublist){
            list.add(field);
        }
    }
    Field fields[] = clazz.getDeclaredFields();
    for(Field field : fields){
        list.add(field);
    }
    return list;
}

28.08.2015

Weblogic: weblogic.jdbc.wrapper.Blob_oracle_sql_BLOB cannot be cast to oracle.sql.BLOB

Ошибка возникает потому, что типы oracle.sql сервер Weblogic обвязывает в свои из weblogic.jdbc.wrapper.
Решение 1 - отключить обвязку на уровне источника данных через консоль, галочку нужно снять:


Решение 2 (и предпочтительное) - выполнить приведение типов в коде.
Код до:
public Connection getServerConnection() {
      System.out.println("DataSource = " + this._ds);
      Connection conn = null;
      try {
  if (this.conn == null){
              conn = this._ds.getConnection();  //меняем эту строку
         }
      } catch (SQLException var4) {
         String msg = "ERROR. Cannot get connection from datasource: " + var4.getMessage();
         System.out.println(msg);
         var4.printStackTrace();
      }
      return conn;
}
Код после:
import oracle.jdbc.OracleConnection;
import weblogic.jdbc.extensions.WLConnection;

public Connection getServerConnection() {
      System.out.println("DataSource = " + this._ds);
      Connection conn = null;
      try {
  if (this.conn == null){
              conn = (((WLConnection) this._ds.getConnection()).getVendorConnection());
         }
      } catch (SQLException var4) {
         String msg = "ERROR. Cannot get connection from datasource: " + var4.getMessage();
         System.out.println(msg);
         var4.printStackTrace();
      }
      return conn;
}
Класс WLConnection можно подключить через com.bea.core.datasource_1.9.0.0.jar

08.11.2014

Создание оконного Java-приложения

Цель: создать простейшее оконное приложение на Java, выводить текст, переданный в качестве параметра.

07.07.2014

Особенность retainAM при использовании нескольких AM

Простой эксперимент позволит нам увидеть разницу между корневым и некорневыми Application Modules (AM).

10.06.2014

JBO-27122: SQL error during statement preparation

Ошибка появляется, если VO выполняется сначала с ограчением в n1 предикатов, затем в n2 предикатов, причем n2 < n1. Пример:
CausesVOImpl causeVO = getAm().getCausesVO1();
// первое выполнение
if (!causeVO.isPreparedForExecution()){
    causeVO.setMaxFetchSize(999);
}
causeVO.executeEmptyRowSet();
causeVO.setWhereClause("CAUSE_NUMBER > :1 and GROUP_ID = :2");
causeVO.setWhereClauseParam(0, causeNumber);
causeVO.setWhereClauseParam(1, groupId);
causeVO.executeQuery();

// второе выполнение
CausesVOImpl causeVO = getAm().getCausesVO1();
if (!causeVO.isPreparedForExecution()){
    causeVO.setMaxFetchSize(999);
}
causeVO.executeEmptyRowSet();
// causeVO.setWhereClause(null);
// causeVO.setWhereClauseParams(null);
causeVO.setWhereClause("GROUP_ID = :1");
causeVO.setWhereClauseParam(0, getEntityId());
try{
    causeVO.executeQuery();
}catch (Exception e){
    System.out.println(e.getMessage());
}
В приведенном примере ошибка возникнет при втором вызове executeQuery(). Как видим, setWhereClause и setWhereClauseParam не перекрывают ранее заданные значения.
Для устранения ошибки достаточно принудительно очистить ограничение (раскомментировать строки во втором выполнении)

08.06.2014

Отчет из данных ViewObject

Мы можем выдать пользователю отчет сразу по нажатию кнопки, без создания конкаррента. Такое удобно, например, при выгрузке в Excel результатов с поисковой формы.

Ключевые моменты.
1) Формирование XMLNode c данными из VO. Первый параметр - глубина структуры XML.
XMLNode xmlNode = (XMLNode)reportVO.writeXML(4, XMLInterface.XML_OPT_ALL_ROWS);
2) Добавление доп.параметров в XML (параметры шапки)
XMLNode xmlNode = (XMLNode)am.invokeMethod("fillWithVODataset");
XMLDocument doc = xmlNode.getDocument();
Element elem = doc.createElement("ReportInfo");
Element elemPeriod = doc.createElement("SomeParameter");
Text startPeriodVal = doc.createTextNode((String)someBean.getValue(pageContext));
elemPeriod.appendChild(startPeriodVal);
elem.appendChild(elemPeriod);
XMLNode firstChild = (XMLNode)xmlNode.getFirstChild();
// xmlNode пуст, если VO был пуст
if (firstChild != null){
  XMLNode parent = (XMLNode)firstChild.getParentNode();
  parent.appendChild(elem); 
}else{
  // добавляем элемент в корень
  xmlNode.appendChild(elem);
}
3) Натягиваем данные на существующий шаблон XDO
select lb.file_data
from xdo_templates_b tmp,
        xdo_lobs lb
where tmp.template_code = :1
   and tmp.application_short_name = :2
   and lb.application_short_name = tmp.application_short_name
   and lb.lob_code = tmp.data_source_code
   and lb.lob_type = 'TEMPLATE'
   and sysdate between tmp.start_date and nvl(tmp.end_date,sysdate)
4) Формируем выходной поток с помощью класса oracle.apps.xdo.template.FOProcessor

Шаблон для нашего отчета будет иметь особенности. Имя группы будет составлено как Имя_VO || 'Row'. Например, если VO отчета назывался ReportVO, то группа будет названа ReportVORow. Имена элементов будут совпадать с именами атрибутов VO. Отдельная группа - вручную добавленные параметры шапки:
<dataStructure>
  <group name="reportVORow" source="reportVORow">
   <element name="ATTR1" value="ATTR1"/>
   <element name="ATTR2" value="ATTR2"/>
   ...
  <group name="ReportInfo" source="ReportInfo">
   <element name="SomeParameter" value="SomeParameter"/>
   ...

23.04.2014

Загрузка и распарсивание файла xls с помощью Java-based concurrent

Цель: прочитать файл электронной таблицы Excel 95-2003 и загрузить результат в таблицу БД Oracle 11g. В нашем примере мы хотим прочитать данные из одной ячейки и положить их в таблицу create table HF_TMP (val VARCHAR2(50))
Алгоритм решения:
1. Загрузка файла через пользовательский интерфейс. Применяется messageFileUploadBean с типом данных BLOB. 

При нажатии кнопки Загрузить происходит вставка записи в таблицу загрузок вместе с бинарным файлов Excel в blob-поле, присваивание upload_id и запуск Java-based канкарента, в который этот upload_id передается.
CO:
Serializable[] aserializable = { uploadId };
Class[] aclass = { uploadId.getClass() };
String requestId = (String)am.invokeMethod("sendConcurrentRequest", aserializable, aclass);
am.getTransaction().commit();
AM:
public void sendConcurrentRequest(Number uploadId) throws RequestSubmissionException {
  ConcurrentRequest cpRequest = new ConcurrentRequest(this.getOADBTransaction().getJdbcConnection());
  Vector requestParameters = new Vector(1);
  requestParameters.add(uploadId.stringValue());
  int requestId = cpRequest.submitRequest(UploadHistFactBean.APPLICATION_SHORT_NAME, UploadHistFactBean.CONCURRENT_PROGRAM_NAME, null, null, false, requestParameters);
}
2. Работа канкарента
    // считываем BLOB
    public InputStream getFileForUploadId(){
        StringBuffer strBuf = new StringBuffer();
        InputStream dataStream = null;
        String lQuery = "select file_data from DATA_UPLOADS where request_id = :1";
        String res = "";
        try
        {
          OracleCallableStatement statement = (OracleCallableStatement)connection.prepareCall(lQuery);
          statement.setInt(1, requestId);
          ResultSet resultSet = statement.executeQuery();
          while (resultSet.next()) {                  
              BLOB blob = ((OracleResultSet)resultSet).getBLOB(1);
              dataStream = blob.getBinaryStream();
          }       
        } catch (SQLException e)
        {
          throw OAException.wrapperException(e);
        }
        return dataStream;
    }
    public void initialize(CpContext cpContext) throws SQLException,
                                                       XMLParseException,
                                                       SAXException,
                                                       IOException,
                                                       InstantiationException,
                                                       IllegalAccessException,
                                                       ClassNotFoundException,
                                                       NoSuchMethodException,
                                                       InvocationTargetException     {
        connection = cpContext.getJDBCConnection();
        requestId = cpContext.getReqDetails().getRequestId();
        logFile = cpContext.getLogFile();
        reqCompletion = cpContext.getReqCompletion();
        NameValueType parameter;
        while (cpParameters.hasMoreElements()) {
         parameter = cpParameters.nextParameter();
          if ("p_upload_id".equalsIgnoreCase(parametr.getName())) {
          this.uploadId = Integer.valueOf(parametr.getValue()).intValue();
        }
    }
    public void runProgram(CpContext cpContext) {
        try {
            initialize(cpContext);
            HashMap<String, String> inputParameters = new HashMap<String, String>();
            inputParameters.put(DataInput.PARAMETER_PREFIX + "1",                                   "oracle.apps.xxmy.test.bean.TemplateXML");
            InputStream file = getFileForUploadId();

            { логика по распарсиванию файла Excel }
            connection.commit();

            // Успешно завершим конкаррент
            Message normComplMessage = new Message("FND", "CONC-CP SUCCESSFUL TERMINATION");
            reqCompletion.setCompletion(ReqCompletion.NORMAL, normComplMessage.getMessageText(cpContext.getResourceStore()));
        } catch (Exception e) {
            // Если произошла ошибка, нужно выставить конкаренту ошибочный статус и выдать в лог стек ошибки
            reqCompletion.setCompletion(ReqCompletion.ERROR, e.getMessage());
            StringWriter errStringWriter = new StringWriter();
            PrintWriter errPrintWriter = new PrintWriter(errStringWriter, true);
            e.printStackTrace(errPrintWriter);
            logFile.writeln(errStringWriter.toString(), LogFile.ERROR);
        } finally {
            cpContext.releaseJDBCConnection();
        }
    }
3. Распарсивание XLS с помощью библиотеки POI. Шаблон oracle.apps.xxmy.test.bean.TemplateXML из шага 2 содержит набор параметров для вызова API вставки в таблицу с указанием данных о том, в каких ячейках брать значения. В нашем случае:
<?xml version="1.0" encoding='windows-1251'?>
<upload method="XXMY_TEST_PKG.upload_excel">
 <element name="test" type="single">
  <location src="sheet" sheet="Sheet1" row="0" col="0"/>
 </element>
</upload>
Пробегаясь по структуре данных и файлу данных, мы формируем вызов API:
begin XXMY_TEST_PKG.upload_excel(P_TEST => :1, P_REQUEST_ID => :2, P_UPLOAD_ID => :3, P_UPLOAD_METHOD => :4); end;
Имея коллекции параметров и их значений, выполняем вызов:
    public void doDbUpload() throws SQLException {
        OracleCallableStatement statement = (OracleCallableStatement)connection.prepareCall(this.query);
        ArrayList<Integer> keyList = new ArrayList<Integer>();
        keyList.addAll(uploadParameters.keySet());
        Collections.sort(keyList);
        Iterator<Integer> parameterIterator = keyList.iterator();
        while (parameterIterator.hasNext()) {
            Integer parameterIndex = parameterIterator.next();
            UploadParameter parameter = this.uploadParameters.get(parameterIndex);
            statement.setString(parameterIndex.intValue(), parameter.getValue());
        }
        statement.execute();
        statement.close();
    }
Всё. Данные из файла отправляются в таблицу.

09.09.2013

Канкарент на основе Java-класса

По шагам:
1. Создаем наш класс
package oracle.apps.test;

import java.io.IOException;

import java.io.PrintWriter;
import java.io.StringWriter;

import java.lang.reflect.InvocationTargetException;

import java.sql.Connection;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;

import oracle.apps.fnd.common.Message;
import oracle.apps.fnd.cp.request.CpContext;
import oracle.apps.fnd.cp.request.JavaConcurrentProgram;
import oracle.apps.fnd.cp.request.LogFile;
import oracle.apps.fnd.cp.request.ReqCompletion;

public class MyJavaTest implements JavaConcurrentProgram {
    public static final String APPLICATION_SHORT_NAME = "XXXX";
    public static final String CONCURRENT_PROGRAM_NAME = "MY_CONC_PROGRAM";
    
    private Connection connection;
    private int requestId;
    private LogFile logFile;
    private ReqCompletion reqCompletion;

    public void initialize(CpContext cpContext) throws SQLException, 
                                                       XMLParseException, 
                                                       SAXException, 
                                                       IOException, 
                                                       InstantiationException, 
                                                       IllegalAccessException, 
                                                       ClassNotFoundException, 
                                                       NoSuchMethodException, 
                                                       InvocationTargetException {
        connection = cpContext.getJDBCConnection();
        requestId = cpContext.getReqDetails().getRequestId();
        logFile = cpContext.getLogFile();
        reqCompletion = cpContext.getReqCompletion();

        Enumeration params = cpContext.getReqDetails().getParaInfo().elements();
        String Value = (String)params.nextElement();
        int fileId = Integer.parseInt(Value);
        // some code
    }

    public void runProgram(CpContext cpContext) {
        try {
            initialize(cpContext);
            // some code
            connection.commit();

            // успешное заверщение канкарента
            Message normComplMessage = new Message("FND", "CONC-CP SUCCESSFUL TERMINATION");
            reqCompletion.setCompletion(ReqCompletion.NORMAL, normComplMessage.getMessageText(cpContext.getResourceStore()));
        } catch (Exception e) {
            reqCompletion.setCompletion(ReqCompletion.ERROR, e.getMessage());
            StringWriter errStringWriter = new StringWriter();
            PrintWriter errPrintWriter = new PrintWriter(errStringWriter, true);
            e.printStackTrace(errPrintWriter);
            logFile.writeln(errStringWriter.toString(), LogFile.ERROR);
        } finally {
            cpContext.releaseJDBCConnection();
        }
    }

}
2. Создаем канкарент


26.03.2013

OAF: Атрибут VO как хинт к бину image

Возникла задача присвоить значкам типа image различные всплывающие подсказки из ViewObject. Один из вариантов реализации  - через JavaScript.

11.03.2013

Использование JavaScript в OAF

Примеры использования JS в Oracle Applications Framework. Вызов JAVA-методов из кода JavaScript

20.11.2012

Баг при открытии JDeveloper

Признаки: не закрываются вкладки, не производится переход на методы. Лечение тривиально, при помощи notepad

05.07.2012

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

Имеем изображение, хранящееся в BLOB. Цель - положить его на страницу с помощью image bean.