Search in sources :

Example 6 with RecordList

use of jp.ossc.nimbus.beans.dataset.RecordList in project nimbus by nimbus-org.

the class DatabaseHostResolverService method reloadHostMap.

public void reloadHostMap() throws Exception {
    hostMap.clear();
    RecordList result = (RecordList) persistentManager.loadQuery(connectionFactory.getConnection(), selectSql, null, new RecordList());
    for (int i = 0; i < result.size(); i++) {
        Record record = (Record) result.get(i);
        try {
            InetAddress inetAddress = InetAddress.getByName(record.getStringProperty(1));
            hostMap.put(record.getStringProperty(0), inetAddress);
        } catch (UnknownHostException e) {
            throw new IllegalArgumentException(e);
        }
    }
}
Also used : RecordList(jp.ossc.nimbus.beans.dataset.RecordList) UnknownHostException(java.net.UnknownHostException) Record(jp.ossc.nimbus.beans.dataset.Record) InetAddress(java.net.InetAddress)

Example 7 with RecordList

use of jp.ossc.nimbus.beans.dataset.RecordList in project nimbus by nimbus-org.

the class DefaultPersistentManagerService method fillOutput.

private Object fillOutput(ResultSet resultSet, Object output, Map outputMapping, boolean isCursor) throws PersistentException {
    if (output == null) {
        if (isCursor) {
            output = new LinkedHashMap();
        } else {
            output = new ArrayList();
        }
    }
    try {
        final ResultSetMetaData metadata = resultSet.getMetaData();
        final int colCount = metadata.getColumnCount();
        boolean isOutputMappingFromMetaData = false;
        if (outputMapping == null && (output instanceof RecordList || output instanceof Record || !(output instanceof List))) {
            outputMapping = new LinkedHashMap();
            for (int i = 1; i <= colCount; i++) {
                outputMapping.put(metadata.getColumnName(i), metadata.getColumnName(i).toUpperCase());
            }
            isOutputMappingFromMetaData = true;
        }
        if (output instanceof DataSet) {
            final Set headerSet = new LinkedHashSet();
            final Map recordListMap = new LinkedHashMap();
            final Map recordListPropMap = new LinkedHashMap();
            Iterator itr = outputMapping.entrySet().iterator();
            while (itr.hasNext()) {
                final Map.Entry entry = (Map.Entry) itr.next();
                final Property prop = propertyAccess.getProperty((String) entry.getValue());
                if (prop instanceof NestedProperty) {
                    Object obj = ((NestedProperty) prop).getThisProperty().getProperty(output);
                    if (obj instanceof RecordList) {
                        recordListMap.put(entry.getKey(), (RecordList) obj);
                        recordListPropMap.put(entry.getKey(), ((NestedProperty) prop).getNestedProperty());
                    } else {
                        headerSet.add(entry.getKey());
                    }
                } else {
                    throw new PersistentException("Output bean fill error.");
                }
            }
            final Map recordMap = new HashMap();
            while (true) {
                if (!isCursor) {
                    if (!resultSet.next()) {
                        break;
                    }
                }
                if (headerSet.size() != 0) {
                    itr = headerSet.iterator();
                    while (itr.hasNext()) {
                        final String columnName = (String) itr.next();
                        setValue(output, (String) outputMapping.get(columnName), resultSet, columnName, isOutputMappingFromMetaData);
                    }
                    headerSet.clear();
                }
                recordMap.clear();
                itr = recordListMap.entrySet().iterator();
                while (itr.hasNext()) {
                    final Map.Entry entry = (Map.Entry) itr.next();
                    final RecordList list = (RecordList) entry.getValue();
                    Record record = (Record) recordMap.get(list);
                    if (record == null) {
                        record = list.createRecord();
                        recordMap.put(list, record);
                        list.addRecord(record);
                    }
                    Property prop = (Property) recordListPropMap.get(entry.getKey());
                    prop.setProperty(record, getValue(record, prop, resultSet, (String) entry.getKey()));
                }
                if (isCursor) {
                    break;
                }
            }
            return output;
        } else if (output instanceof RecordList) {
            RecordList list = (RecordList) output;
            if (list.getSchema() == null) {
                list.setSchema(createSchema(metadata));
            }
            while (true) {
                if (!isCursor) {
                    if (!resultSet.next()) {
                        break;
                    }
                }
                final Record record = list.createRecord();
                final Iterator itr = outputMapping.entrySet().iterator();
                while (itr.hasNext()) {
                    final Map.Entry entry = (Map.Entry) itr.next();
                    setValue(record, (String) entry.getValue(), resultSet, (String) entry.getKey(), isOutputMappingFromMetaData);
                }
                list.addRecord(record);
                if (isCursor) {
                    break;
                }
            }
            return list;
        } else if (output instanceof List) {
            List list = (List) output;
            while (true) {
                if (!isCursor) {
                    if (!resultSet.next()) {
                        break;
                    }
                }
                final Map record = new LinkedHashMap();
                for (int i = 1; i <= colCount; i++) {
                    record.put(metadata.getColumnName(i), resultSet.getObject(i));
                }
                list.add(record);
                if (isCursor) {
                    break;
                }
            }
            return list;
        } else if (output instanceof Class) {
            final Class outputClass = (Class) output;
            if (Record.class.isAssignableFrom(outputClass)) {
                if (!isCursor) {
                    if (!resultSet.next()) {
                        return null;
                    }
                }
                Record record = null;
                try {
                    record = (Record) outputClass.newInstance();
                    if (record.getSchema() == null) {
                        record.setSchema(createSchema(metadata));
                    }
                } catch (InstantiationException e) {
                    throw new PersistentException("Output bean instantiate error.", e);
                } catch (IllegalAccessException e) {
                    throw new PersistentException("Output bean instantiate error.", e);
                }
                final Iterator itr = outputMapping.entrySet().iterator();
                while (itr.hasNext()) {
                    final Map.Entry entry = (Map.Entry) itr.next();
                    setValue(record, (String) entry.getValue(), resultSet, (String) entry.getKey(), isOutputMappingFromMetaData);
                }
                return record;
            } else if (RecordList.class.isAssignableFrom(outputClass)) {
                RecordList list = null;
                try {
                    list = (RecordList) outputClass.newInstance();
                    if (list.getSchema() == null) {
                        list.setSchema(createSchema(metadata));
                    }
                } catch (InstantiationException e) {
                    throw new PersistentException("Output bean instantiate error.", e);
                } catch (IllegalAccessException e) {
                    throw new PersistentException("Output bean instantiate error.", e);
                }
                while (true) {
                    if (!isCursor) {
                        if (!resultSet.next()) {
                            break;
                        }
                    }
                    final Record record = list.createRecord();
                    final Iterator itr = outputMapping.entrySet().iterator();
                    while (itr.hasNext()) {
                        final Map.Entry entry = (Map.Entry) itr.next();
                        setValue(record, (String) entry.getValue(), resultSet, (String) entry.getKey(), isOutputMappingFromMetaData);
                    }
                    list.addRecord(record);
                    if (isCursor) {
                        break;
                    }
                }
                return list;
            } else if (outputClass.isArray()) {
                List list = new ArrayList();
                while (true) {
                    Object bean = fillOutput(resultSet, outputClass.getComponentType(), outputMapping, isCursor);
                    if (bean == null && (resultSet.isAfterLast() || resultSet.getRow() == 0)) {
                        break;
                    }
                    list.add(bean);
                    if (isCursor) {
                        break;
                    }
                }
                return listToArray(list, outputClass.getComponentType());
            } else if (String.class.equals(outputClass) || outputClass.isPrimitive() || Number.class.isAssignableFrom(outputClass)) {
                if (!isCursor) {
                    if (!resultSet.next()) {
                        return null;
                    }
                }
                return getValue(outputClass, resultSet, 1);
            } else {
                if (isCursor) {
                    Object bean = null;
                    try {
                        bean = outputClass.newInstance();
                    } catch (InstantiationException e) {
                        throw new PersistentException("Output bean instantiate error.", e);
                    } catch (IllegalAccessException e) {
                        throw new PersistentException("Output bean instantiate error.", e);
                    }
                    final Iterator itr = outputMapping.entrySet().iterator();
                    while (itr.hasNext()) {
                        final Map.Entry entry = (Map.Entry) itr.next();
                        setValue(bean, (String) entry.getValue(), resultSet, (String) entry.getKey(), isOutputMappingFromMetaData);
                    }
                    return bean;
                } else {
                    final List list = new ArrayList();
                    while (resultSet.next()) {
                        Object bean = null;
                        try {
                            bean = outputClass.newInstance();
                        } catch (InstantiationException e) {
                            if (isOutputMappingFromMetaData && outputMapping.size() == 1 && list.size() == 0) {
                                return getValue(outputClass, resultSet, 1);
                            }
                            throw new PersistentException("Output bean instantiate error.", e);
                        } catch (IllegalAccessException e) {
                            if (isOutputMappingFromMetaData && outputMapping.size() == 1 && list.size() == 0) {
                                return getValue(outputClass, resultSet, 1);
                            }
                            throw new PersistentException("Output bean instantiate error.", e);
                        }
                        final Iterator itr = outputMapping.entrySet().iterator();
                        while (itr.hasNext()) {
                            final Map.Entry entry = (Map.Entry) itr.next();
                            try {
                                setValue(bean, (String) entry.getValue(), resultSet, (String) entry.getKey(), isOutputMappingFromMetaData);
                            } catch (PersistentException e) {
                                if (isOutputMappingFromMetaData && outputMapping.size() == 1 && list.size() == 0) {
                                    return getValue(outputClass, resultSet, 1);
                                }
                                throw e;
                            }
                        }
                        list.add(bean);
                    }
                    return list;
                }
            }
        } else {
            if (!isCursor) {
                if (!resultSet.next()) {
                    return null;
                }
            }
            if (output instanceof Record) {
                Record record = (Record) output;
                if (record.getSchema() == null) {
                    record.setSchema(createSchema(metadata));
                }
            }
            final Iterator itr = outputMapping.entrySet().iterator();
            while (itr.hasNext()) {
                final Map.Entry entry = (Map.Entry) itr.next();
                setValue(output, (String) entry.getValue(), resultSet, (String) entry.getKey(), isOutputMappingFromMetaData);
            }
            return output;
        }
    } catch (IllegalArgumentException e) {
        throw new PersistentException("Output bean fill error.", e);
    } catch (NoSuchPropertyException e) {
        throw new PersistentException("Output bean fill error.", e);
    } catch (InvocationTargetException e) {
        throw new PersistentException("Output bean fill error.", e.getTargetException());
    } catch (SQLException e) {
        throw new PersistentException("Output bean fill error.", e);
    }
}
Also used : LinkedHashSet(java.util.LinkedHashSet) ResultSet(java.sql.ResultSet) LinkedHashSet(java.util.LinkedHashSet) DataSet(jp.ossc.nimbus.beans.dataset.DataSet) Set(java.util.Set) DataSet(jp.ossc.nimbus.beans.dataset.DataSet) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) SQLException(java.sql.SQLException) ArrayList(java.util.ArrayList) LinkedHashMap(java.util.LinkedHashMap) ResultSetMetaData(java.sql.ResultSetMetaData) Iterator(java.util.Iterator) Record(jp.ossc.nimbus.beans.dataset.Record) RecordList(jp.ossc.nimbus.beans.dataset.RecordList) ArrayList(java.util.ArrayList) List(java.util.List) NestedProperty(jp.ossc.nimbus.beans.NestedProperty) Property(jp.ossc.nimbus.beans.Property) NestedProperty(jp.ossc.nimbus.beans.NestedProperty) InvocationTargetException(java.lang.reflect.InvocationTargetException) RecordList(jp.ossc.nimbus.beans.dataset.RecordList) NoSuchPropertyException(jp.ossc.nimbus.beans.NoSuchPropertyException) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Map(java.util.Map)

Example 8 with RecordList

use of jp.ossc.nimbus.beans.dataset.RecordList in project nimbus by nimbus-org.

the class DefaultPersistentManagerService method persistQueryInternal.

private int persistQueryInternal(String sql, PreparedStatement statement, Object input, List inputProps, boolean isBatch) throws PersistentException {
    if (input instanceof DataSet) {
        if (inputProps == null) {
            throw new PersistentException("Input bean get error.");
        }
        final List beans = new ArrayList();
        final List properties = new ArrayList();
        int count = -1;
        try {
            final Iterator itr = inputProps.iterator();
            while (itr.hasNext()) {
                final Object propStr = itr.next();
                final Property prop = propertyAccess.getProperty(propStr.toString());
                if (prop instanceof NestedProperty) {
                    Object obj = ((NestedProperty) prop).getThisProperty().getProperty(input);
                    if (obj instanceof RecordList) {
                        final int size = ((RecordList) obj).size();
                        if (count == -1) {
                            count = size;
                        } else if (count != size) {
                            throw new PersistentException("Input bean get error.");
                        }
                    }
                    beans.add(obj);
                    properties.add(((NestedProperty) prop).getNestedProperty());
                } else {
                    throw new PersistentException("Input bean get error.");
                }
            }
        } catch (NoSuchPropertyException e) {
            throw new PersistentException("Input bean get error.", e);
        } catch (InvocationTargetException e) {
            throw new PersistentException("Input bean get error.", e.getTargetException());
        }
        if (count == 0) {
            return 0;
        }
        if (count == -1) {
            try {
                for (int i = 0, imax = beans.size(); i < imax; i++) {
                    Object param = ((Property) properties.get(i)).getProperty(beans.get(i));
                    setObject(statement, i + 1, param);
                }
            } catch (NoSuchPropertyException e) {
                throw new PersistentException("Input bean get error.", e);
            } catch (InvocationTargetException e) {
                throw new PersistentException("Input bean get error.", e.getTargetException());
            }
            try {
                if (isBatch) {
                    statement.addBatch();
                    return -1;
                } else {
                    return statement.executeUpdate();
                }
            } catch (SQLException e) {
                throw new PersistentException("SQL execute error : " + sql, e);
            }
        } else {
            for (int i = 0; i < count; i++) {
                try {
                    for (int j = 0, jmax = beans.size(); j < jmax; j++) {
                        Object bean = beans.get(j);
                        if (bean instanceof RecordList) {
                            bean = ((RecordList) bean).get(i);
                        }
                        Object param = ((Property) properties.get(j)).getProperty(bean);
                        setObject(statement, j + 1, param);
                    }
                } catch (NoSuchPropertyException e) {
                    throw new PersistentException("Input bean get error.", e);
                } catch (InvocationTargetException e) {
                    throw new PersistentException("Input bean get error.", e.getTargetException());
                }
                try {
                    statement.addBatch();
                } catch (SQLException e) {
                    throw new PersistentException("SQL add batch error : " + sql, e);
                }
            }
            if (isBatch) {
                return -1;
            } else {
                int[] updateCounts = null;
                try {
                    updateCounts = statement.executeBatch();
                } catch (SQLException e) {
                    throw new PersistentException("SQL execute error : " + sql, e);
                }
                int result = 0;
                for (int i = 0; i < updateCounts.length; i++) {
                    if (updateCounts[i] > 0) {
                        result += updateCounts[i];
                    }
                }
                if (result == 0) {
                    try {
                        result = statement.getUpdateCount();
                    } catch (SQLException e) {
                    }
                }
                return result;
            }
        }
    } else if ((input instanceof List) || (input != null && input.getClass().isArray())) {
        List list = null;
        if (input instanceof List) {
            list = (List) input;
        } else {
            list = (List) Arrays.asList((Object[]) input);
        }
        if (inputProps != null) {
            if (list.size() == 0) {
                return 0;
            }
            for (int j = 0, jmax = list.size(); j < jmax; j++) {
                Object bean = list.get(j);
                try {
                    for (int i = 0, imax = inputProps.size(); i < imax; i++) {
                        Object param = propertyAccess.get(bean, inputProps.get(i).toString());
                        setObject(statement, i + 1, param);
                    }
                } catch (NoSuchPropertyException e) {
                    throw new PersistentException("Input bean get error.", e);
                } catch (InvocationTargetException e) {
                    throw new PersistentException("Input bean get error.", e.getTargetException());
                }
                try {
                    statement.addBatch();
                } catch (SQLException e) {
                    throw new PersistentException("SQL add batch error : " + sql, e);
                }
            }
            if (isBatch) {
                return -1;
            } else {
                int[] updateCounts = null;
                try {
                    updateCounts = statement.executeBatch();
                } catch (SQLException e) {
                    throw new PersistentException("SQL execute error : " + sql, e);
                }
                int result = 0;
                for (int i = 0; i < updateCounts.length; i++) {
                    if (updateCounts[i] > 0) {
                        result += updateCounts[i];
                    }
                }
                if (result == 0) {
                    try {
                        result = statement.getUpdateCount();
                    } catch (SQLException e) {
                    }
                }
                return result;
            }
        } else {
            if (list.size() == 0) {
                return 0;
            }
            int result = 0;
            for (int i = 0, imax = list.size(); i < imax; i++) {
                Object bean = list.get(i);
                if (bean instanceof Map) {
                    try {
                        Iterator propItr = ((Map) bean).keySet().iterator();
                        int j = 0;
                        while (propItr.hasNext()) {
                            Object param = propertyAccess.get(bean, propItr.next().toString());
                            setObject(statement, ++j, param);
                        }
                    } catch (NoSuchPropertyException e) {
                        throw new PersistentException("Input bean get error.", e);
                    } catch (InvocationTargetException e) {
                        throw new PersistentException("Input bean get error.", e.getTargetException());
                    }
                    try {
                        statement.addBatch();
                    } catch (SQLException e) {
                        throw new PersistentException("SQL add batch error : " + sql, e);
                    }
                    if (i == imax - 1) {
                        if (isBatch) {
                            result = -1;
                        } else {
                            int updateCount = 0;
                            int[] updateCounts = null;
                            try {
                                updateCounts = statement.executeBatch();
                            } catch (SQLException e) {
                                throw new PersistentException("SQL execute error : " + sql, e);
                            }
                            for (int j = 0; j < updateCounts.length; j++) {
                                if (updateCounts[j] > 0) {
                                    updateCount += updateCounts[j];
                                }
                            }
                            if (updateCount == 0) {
                                try {
                                    updateCount = statement.getUpdateCount();
                                } catch (SQLException e) {
                                }
                            }
                            result = updateCount;
                        }
                    }
                } else {
                    setObject(statement, i + 1, bean);
                    if (i == imax - 1) {
                        if (isBatch) {
                            try {
                                statement.addBatch();
                            } catch (SQLException e) {
                                throw new PersistentException("SQL add batch error : " + sql, e);
                            }
                            result = -1;
                        } else {
                            try {
                                result = statement.executeUpdate();
                            } catch (SQLException e) {
                                throw new PersistentException("SQL execute error : " + sql, e);
                            }
                        }
                    }
                }
            }
            return result;
        }
    } else {
        try {
            if (input != null) {
                if (inputProps != null) {
                    for (int i = 0, imax = inputProps.size(); i < imax; i++) {
                        Object param = propertyAccess.get(input, inputProps.get(i).toString());
                        setObject(statement, i + 1, param);
                    }
                } else {
                    if (input instanceof Map) {
                        Iterator propItr = ((Map) input).keySet().iterator();
                        int i = 0;
                        while (propItr.hasNext()) {
                            Object param = propertyAccess.get(input, propItr.next().toString());
                            setObject(statement, ++i, param);
                        }
                    } else {
                        setObject(statement, 1, input);
                    }
                }
            } else {
                if (inputProps != null) {
                    for (int i = 0, imax = inputProps.size(); i < imax; i++) {
                        setObject(statement, i + 1, null);
                    }
                } else {
                    int parameterCount = 0;
                    try {
                        ParameterMetaData paramMetaData = statement.getParameterMetaData();
                        parameterCount = paramMetaData.getParameterCount();
                    } catch (SQLException e) {
                        throw new PersistentException("Illegal sql : " + sql, e);
                    } catch (IncompatibleClassChangeError e) {
                    }
                    if (parameterCount != 0) {
                        setObject(statement, 1, input);
                    }
                }
            }
        } catch (NoSuchPropertyException e) {
            throw new PersistentException("Input bean get error.", e);
        } catch (InvocationTargetException e) {
            throw new PersistentException("Input bean get error.", e.getTargetException());
        }
        if (isBatch) {
            try {
                statement.addBatch();
            } catch (SQLException e) {
                throw new PersistentException("SQL add batch error : " + sql, e);
            }
            return -1;
        } else {
            try {
                return statement.executeUpdate();
            } catch (SQLException e) {
                throw new PersistentException("SQL execute error : " + sql, e);
            }
        }
    }
}
Also used : DataSet(jp.ossc.nimbus.beans.dataset.DataSet) SQLException(java.sql.SQLException) ArrayList(java.util.ArrayList) InvocationTargetException(java.lang.reflect.InvocationTargetException) RecordList(jp.ossc.nimbus.beans.dataset.RecordList) Iterator(java.util.Iterator) NoSuchPropertyException(jp.ossc.nimbus.beans.NoSuchPropertyException) RecordList(jp.ossc.nimbus.beans.dataset.RecordList) ArrayList(java.util.ArrayList) List(java.util.List) NestedProperty(jp.ossc.nimbus.beans.NestedProperty) Property(jp.ossc.nimbus.beans.Property) NestedProperty(jp.ossc.nimbus.beans.NestedProperty) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Map(java.util.Map) ParameterMetaData(java.sql.ParameterMetaData)

Example 9 with RecordList

use of jp.ossc.nimbus.beans.dataset.RecordList in project nimbus by nimbus-org.

the class DatabaseSharedContextKeyDistributorService method startService.

public void startService() throws Exception {
    if (connectionFactoryServiceName != null) {
        connectionFactory = (ConnectionFactory) ServiceManagerFactory.getServiceObject(connectionFactoryServiceName);
    }
    if (connectionFactory == null) {
        throw new IllegalArgumentException("ConnectionFactory is null.");
    }
    if (persistentManagerServiceName != null) {
        persistentManager = (PersistentManager) ServiceManagerFactory.getServiceObject(persistentManagerServiceName);
    }
    if (persistentManager == null) {
        throw new IllegalArgumentException("PersistentManager is null.");
    }
    Connection con = null;
    try {
        con = connectionFactory.getConnection();
        List keyList = null;
        if (databaseRecord == null) {
            if (keyClass == null) {
                keyList = new RecordList();
            }
        } else {
            keyList = new RecordList(null, databaseRecord.getRecordSchema());
        }
        Object[] keys = null;
        if (keyList == null) {
            keys = (Object[]) persistentManager.loadQuery(con, keySelectQuery, null, Array.newInstance(keyClass, 0).getClass());
        } else {
            persistentManager.loadQuery(con, keySelectQuery, null, keyList);
            keys = keyList.toArray();
        }
        if (keys == null || keys.length == 0) {
            throw new IllegalArgumentException("Not found key record. keySelectQuery=" + keySelectQuery);
        }
        Map tmpKeyIndexMap = new HashMap();
        if (keyList == null) {
            for (int i = 0; i < keys.length; i++) {
                tmpKeyIndexMap.put(keys[i], new Integer(i));
            }
        } else {
            PropertyAccess propertyAccess = new PropertyAccess();
            for (int i = 0; i < keys.length; i++) {
                Object key = null;
                if (keyClass == null) {
                    key = propertyAccess.get(keys[i], keyPropertyName);
                } else {
                    key = keyClass.newInstance();
                    for (Iterator itr = keyPropertyMappings.entrySet().iterator(); itr.hasNext(); ) {
                        Map.Entry propMapping = (Map.Entry) itr.next();
                        propertyAccess.set(key, (String) propMapping.getValue(), propertyAccess.get(keys[i], (String) propMapping.getKey()));
                    }
                }
                tmpKeyIndexMap.put(key, new Integer(i));
            }
        }
        keyIndexMap = tmpKeyIndexMap;
    } finally {
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
            }
        }
    }
}
Also used : HashMap(java.util.HashMap) SQLException(java.sql.SQLException) Connection(java.sql.Connection) PropertyAccess(jp.ossc.nimbus.beans.PropertyAccess) RecordList(jp.ossc.nimbus.beans.dataset.RecordList) Iterator(java.util.Iterator) RecordList(jp.ossc.nimbus.beans.dataset.RecordList) List(java.util.List) HashMap(java.util.HashMap) Map(java.util.Map)

Example 10 with RecordList

use of jp.ossc.nimbus.beans.dataset.RecordList in project nimbus by nimbus-org.

the class DataSetServletRequestParameterConverter method convert.

/**
 * 指定されたオブジェクトを変換する。<p>
 *
 * @param obj 変換対象のオブジェクト
 * @return 変換後のオブジェクト
 * @exception ConvertException 変換に失敗した場合
 */
public Object convert(Object obj) throws ConvertException {
    if (!(obj instanceof ServletRequest)) {
        return null;
    }
    ServletRequest request = (ServletRequest) obj;
    final Map paramMap = request.getParameterMap();
    if (paramMap == null || paramMap.size() == 0) {
        return null;
    }
    String defaultDsName = request.getParameter(dataSetParameterName);
    if ((defaultDsName == null || defaultDsName.length() == 0) && request instanceof HttpServletRequest) {
        HttpServletRequest httpReq = (HttpServletRequest) request;
        String path = httpReq.getServletPath();
        if (httpReq.getPathInfo() != null) {
            path = path + httpReq.getPathInfo();
        }
        if (path != null) {
            int index = path.lastIndexOf('.');
            if (index != -1) {
                path = path.substring(0, index);
            }
            defaultDsName = dataSetPathPrefix + path;
        }
    }
    final Map currentDsMap = new HashMap();
    final Iterator entries = paramMap.entrySet().iterator();
    while (entries.hasNext()) {
        final Map.Entry entry = (Map.Entry) entries.next();
        final String key = (String) entry.getKey();
        final int index = key.indexOf(datasetDelimiter);
        if (index == -1 || index == key.length() - 1) {
            continue;
        }
        String dsName = null;
        if (index == 0) {
            dsName = defaultDsName;
        } else {
            dsName = key.substring(0, index);
        }
        if (dsName == null) {
            continue;
        }
        DataSet ds = (DataSet) currentDsMap.get(dsName);
        if (ds == null) {
            if (dataSetMap.containsKey(dsName)) {
                ds = ((DataSet) dataSetMap.get(dsName)).cloneSchema();
            } else if (beanFlowInvokerFactory != null && beanFlowInvokerFactory.containsFlow(dsName)) {
                final BeanFlowInvoker beanFlowInvoker = beanFlowInvokerFactory.createFlow(dsName);
                Object ret = null;
                try {
                    ret = beanFlowInvoker.invokeFlow(null);
                } catch (Exception e) {
                    throw new ConvertException("Exception occured in BeanFlow '" + dsName + "'", e);
                }
                if (!(ret instanceof DataSet)) {
                    throw new ConvertException("Result of BeanFlow '" + dsName + "' is not DataSet.");
                }
                ds = (DataSet) ret;
            } else {
                if (isIgnoreUnknownParameter) {
                    continue;
                } else {
                    throw new ConvertException("Unknown DataSet : " + dsName);
                }
            }
            currentDsMap.put(dsName, ds);
        }
        final String propStr = key.substring(index + 1);
        Property prop = (Property) propertyCache.get(propStr);
        if (prop == null) {
            try {
                prop = PropertyFactory.createProperty(propStr);
                if (isIgnoreUnknownParameter) {
                    prop.setIgnoreNullProperty(true);
                }
            } catch (IllegalArgumentException e) {
                throw new ConvertException("Parameter '" + key + "' is illegal.", e);
            }
            Property old = (Property) propertyCache.putIfAbsent(propStr, prop);
            if (old != null) {
                prop = old;
            }
        }
        final String[] vals = (String[]) entry.getValue();
        try {
            if (prop instanceof NestedProperty) {
                Property thisProp = ((NestedProperty) prop).getThisProperty();
                if (thisProp instanceof NestedProperty) {
                    Property nestedProp = ((NestedProperty) prop).getNestedProperty();
                    Property nestedProp2 = ((NestedProperty) thisProp).getNestedProperty();
                    if (nestedProp2 instanceof IndexedProperty) {
                        Property thisProp2 = ((NestedProperty) thisProp).getThisProperty();
                        Object thisObj = thisProp2.getProperty(ds);
                        if (thisObj == null) {
                            if (isIgnoreUnknownParameter) {
                                continue;
                            } else {
                                throw new ConvertException("Parameter '" + key + "' is illegal.");
                            }
                        }
                        if (thisObj instanceof RecordList) {
                            setRecordListProperty((RecordList) thisObj, nestedProp.getPropertyName(), ((IndexedProperty) nestedProp2).getIndex(), vals);
                        } else {
                            // ありえない
                            prop.setProperty(ds, vals[vals.length - 1]);
                        }
                    } else {
                        Object thisObj = thisProp.getProperty(ds);
                        if (thisObj == null) {
                            if (isIgnoreUnknownParameter) {
                                continue;
                            } else {
                                throw new ConvertException("Parameter '" + key + "' is illegal.");
                            }
                        }
                        if (thisObj instanceof RecordList) {
                            setRecordListProperty((RecordList) thisObj, nestedProp.getPropertyName(), vals);
                        } else if (thisObj instanceof Record) {
                            setRecordProperty((Record) thisObj, nestedProp.getPropertyName(), nestedProp.getPropertyType(thisObj), vals);
                        } else {
                            nestedProp.setProperty(thisObj, vals[vals.length - 1]);
                        }
                    }
                } else {
                    Object thisObj = thisProp.getProperty(ds);
                    if (thisObj == null) {
                        if (isIgnoreUnknownParameter) {
                            continue;
                        } else {
                            throw new ConvertException("Parameter '" + key + "' is illegal.");
                        }
                    }
                    Property nestedProp = ((NestedProperty) prop).getNestedProperty();
                    if (thisObj instanceof RecordList) {
                        setRecordListProperty((RecordList) thisObj, nestedProp.getPropertyName(), vals);
                    } else if (thisObj instanceof Record) {
                        setRecordProperty((Record) thisObj, nestedProp.getPropertyName(), nestedProp.getPropertyType(thisObj), vals);
                    } else {
                        nestedProp.setProperty(thisObj, vals[vals.length - 1]);
                    }
                }
            } else {
                throw new ConvertException("Parameter '" + key + "' is illegal.");
            }
        } catch (PropertySetException e) {
            Throwable cause = e.getCause();
            if (cause instanceof ConvertException) {
                throw (ConvertException) cause;
            }
            if (isIgnoreUnknownParameter) {
                continue;
            } else {
                throw new ConvertException("Parameter '" + key + "' is illegal.", e);
            }
        } catch (NoSuchPropertyException e) {
            if (isIgnoreUnknownParameter) {
                continue;
            } else {
                throw new ConvertException("Parameter '" + key + "' is illegal.", e);
            }
        } catch (InvocationTargetException e) {
            throw new ConvertException("Parameter '" + key + "' is illegal.", e.getTargetException());
        }
    }
    if (currentDsMap.size() == 0) {
        return null;
    } else if (currentDsMap.size() == 1) {
        return currentDsMap.values().iterator().next();
    } else {
        return currentDsMap;
    }
}
Also used : ServletRequest(javax.servlet.ServletRequest) HttpServletRequest(javax.servlet.http.HttpServletRequest) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap) DataSet(jp.ossc.nimbus.beans.dataset.DataSet) BeanFlowInvoker(jp.ossc.nimbus.service.beancontrol.interfaces.BeanFlowInvoker) HttpServletRequest(javax.servlet.http.HttpServletRequest) Iterator(java.util.Iterator) Record(jp.ossc.nimbus.beans.dataset.Record) NestedProperty(jp.ossc.nimbus.beans.NestedProperty) Property(jp.ossc.nimbus.beans.Property) IndexedProperty(jp.ossc.nimbus.beans.IndexedProperty) NestedProperty(jp.ossc.nimbus.beans.NestedProperty) PropertySetException(jp.ossc.nimbus.beans.dataset.PropertySetException) InvocationTargetException(java.lang.reflect.InvocationTargetException) NoSuchPropertyException(jp.ossc.nimbus.beans.NoSuchPropertyException) InvocationTargetException(java.lang.reflect.InvocationTargetException) PropertySetException(jp.ossc.nimbus.beans.dataset.PropertySetException) RecordList(jp.ossc.nimbus.beans.dataset.RecordList) IndexedProperty(jp.ossc.nimbus.beans.IndexedProperty) NoSuchPropertyException(jp.ossc.nimbus.beans.NoSuchPropertyException) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap) ConcurrentMap(java.util.concurrent.ConcurrentMap) Map(java.util.Map)

Aggregations

RecordList (jp.ossc.nimbus.beans.dataset.RecordList)15 Record (jp.ossc.nimbus.beans.dataset.Record)10 DataSet (jp.ossc.nimbus.beans.dataset.DataSet)8 InvocationTargetException (java.lang.reflect.InvocationTargetException)7 Iterator (java.util.Iterator)7 HashMap (java.util.HashMap)6 List (java.util.List)6 Map (java.util.Map)6 NoSuchPropertyException (jp.ossc.nimbus.beans.NoSuchPropertyException)5 SQLException (java.sql.SQLException)4 Property (jp.ossc.nimbus.beans.Property)4 ArrayList (java.util.ArrayList)3 NestedProperty (jp.ossc.nimbus.beans.NestedProperty)3 Header (jp.ossc.nimbus.beans.dataset.Header)3 Connection (java.sql.Connection)2 LinkedHashMap (java.util.LinkedHashMap)2 RecordSchema (jp.ossc.nimbus.beans.dataset.RecordSchema)2 RecordSet (jp.ossc.nimbus.recset.RecordSet)2 ConnectionFactoryException (jp.ossc.nimbus.service.connection.ConnectionFactoryException)2 PersistentException (jp.ossc.nimbus.service.connection.PersistentException)2