/** Only used by cache implementations */ protected void cacheInit() { if (simpleCache != null || cacheWithWhereClause != null) return; String where = context.getEntityAttribute("where"); String cacheKey = context.getEntityAttribute(CACHE_KEY); String lookupKey = context.getEntityAttribute(CACHE_LOOKUP); if (cacheKey != null && lookupKey == null) { throw new DataImportHandlerException( DataImportHandlerException.SEVERE, "'cacheKey' is specified for the entity " + entityName + " but 'cacheLookup' is missing"); } if (where == null && cacheKey == null) { simpleCache = new HashMap<String, List<Map<String, Object>>>(); } else { if (where != null) { String[] splits = where.split("="); cachePk = splits[0]; cacheVariableName = splits[1].trim(); } else { cachePk = cacheKey; cacheVariableName = lookupKey; } cacheWithWhereClause = new HashMap<String, Map<Object, List<Map<String, Object>>>>(); } }
/** * If the where clause is present the cache is sql Vs Map of key Vs List of Rows. Only used by * cache implementations. * * @param query the query string for which cached data is to be returned * @return the cached row corresponding to the given query after all variables have been resolved */ protected Map<String, Object> getIdCacheData(String query) { Map<Object, List<Map<String, Object>>> rowIdVsRows = cacheWithWhereClause.get(query); List<Map<String, Object>> rows = null; Object key = context.resolve(cacheVariableName); if (key == null) { throw new DataImportHandlerException( DataImportHandlerException.WARN, "The cache lookup value : " + cacheVariableName + " is resolved to be null in the entity :" + context.getEntityAttribute("name")); } if (rowIdVsRows != null) { rows = rowIdVsRows.get(key); if (rows == null) return null; dataSourceRowCache = new ArrayList<Map<String, Object>>(rows); return getFromRowCacheTransformed(); } else { rows = getAllNonCachedRows(); if (rows.isEmpty()) { return null; } else { rowIdVsRows = new HashMap<Object, List<Map<String, Object>>>(); for (Map<String, Object> row : rows) { Object k = row.get(cachePk); if (k == null) { throw new DataImportHandlerException( DataImportHandlerException.WARN, "No value available for the cache key : " + cachePk + " in the entity : " + context.getEntityAttribute("name")); } if (!k.getClass().equals(key.getClass())) { throw new DataImportHandlerException( DataImportHandlerException.WARN, "The key in the cache type : " + k.getClass().getName() + "is not same as the lookup value type " + key.getClass().getName() + " in the entity " + context.getEntityAttribute("name")); } if (rowIdVsRows.get(k) == null) rowIdVsRows.put(k, new ArrayList<Map<String, Object>>()); rowIdVsRows.get(k).add(row); } cacheWithWhereClause.put(query, rowIdVsRows); if (!rowIdVsRows.containsKey(key)) return null; dataSourceRowCache = new ArrayList<Map<String, Object>>(rowIdVsRows.get(key)); if (dataSourceRowCache.isEmpty()) { dataSourceRowCache = null; return null; } return getFromRowCacheTransformed(); } } }
/** first time init call. do one-time operations here */ protected void firstInit(Context context) { entityName = context.getEntityAttribute("name"); String s = context.getEntityAttribute(ON_ERROR); if (s != null) onError = s; isFirstInit = false; }