ank9
asked on
Java/DFC question related to Collections
I have written a some Java code in DFC 6.5 SP1.
I am creating a collection in one method and passing that collection as a parameter to another method
I am closing the collection only in myMethod_1() where it was created and not in myMethod_2().
Is this the correct way of doing this? Or do I need to close Collection in myMethod_2() as well?
I am creating a collection in one method and passing that collection as a parameter to another method
I am closing the collection only in myMethod_1() where it was created and not in myMethod_2().
Is this the correct way of doing this? Or do I need to close Collection in myMethod_2() as well?
public void myMethod_1() {
try {
IDfCollection col = executeQuery(...);
myMethod_2(col);
}catch(Exception e) {}
finally {
col.close();
}
}
public void myMethod_2(IDfCollection col) {
// do some operations but do not close the colelction
}
ASKER
Thank you.
I think I did not explain it properly.
Actually, the query was that should I be closing it in myMethod_2() as well. Or is closing in myMethod_1() sufficient.
I think I did not explain it properly.
Actually, the query was that should I be closing it in myMethod_2() as well. Or is closing in myMethod_1() sufficient.
only myMethod_1
ASKER
Thank You.
I also felt the same. But I am getting this in the logs. So makes me wonder where it is open.
1206329 [Resource Housekeeper] ERROR com.documentum.fc.client.i
com.documentum.fc.impl.uti
at com.documentum.fc.client.i
at com.documentum.fc.client.D
at com.documentum.fc.client.D
at com.db.dms.utils.DmsUtils.
at com.db.dms.versions.DmsTem
at sun.reflect.NativeMethodAc
at sun.reflect.NativeMethodAc
at sun.reflect.DelegatingMeth
at java.lang.reflect.Method.i
at com.tibco.plugin.java.Java
at com.tibco.plugin.java.Java
at com.tibco.pe.plugin.Activi
at com.tibco.pe.core.TaskImpl
at com.tibco.pe.core.Job.a(Jo
at com.tibco.pe.core.Job.k(Jo
at com.tibco.pe.core.JobDispa
at com.tibco.pe.core.JobDispa
That might not be the call where it's remaining open
Don't ignore exceptions if you're actually doing this:
>>
}catch(Exception e) {}
>>
Don't ignore exceptions if you're actually doing this:
>>
}catch(Exception e) {}
>>
ASKER
Following is the complete code.
getLatestVersion() and getVersions() are the methods which are publicly exposed.
ASKER
Following the code.
getVersions() is the publicly exposed method.
getVersions() is the publicly exposed method.
public class DmsTemplateVersions implements Serializable {
public VersionsIOHolder[] getVersions(VersionsIOHolder[] versionsIOHolderArray) {
IDfSessionManager smgr = DFCUtil.newInstance().getSessionManager();
IDfSession session = DFCUtil.newInstance().getDocbaseSession(smgr);
String sqWhereClausePart = "";
ArrayList<VersionsIOHolder> versionsIOHolderList = new ArrayList<VersionsIOHolder>(Arrays.asList((VersionsIOHolder[])versionsIOHolderArray));
IDfCollection resultsCollection = null;
try {
Iterator versionsIOHolderItr = versionsIOHolderList.iterator();
HashMap<String, String> queriesMap = new HashMap<String, String>();
while (versionsIOHolderItr.hasNext()) {
VersionsIOHolder versionsIOHolder = (VersionsIOHolder) versionsIOHolderItr.next();
String objectType = versionsIOHolder.getObjectType();
MetadataHolder[] metadataHolderArray = versionsIOHolder.getMetadataHolderArray();
ArrayList<MetadataHolder> metadataHolderList = null;
if(metadataHolderArray != null) {
metadataHolderList = new ArrayList<MetadataHolder>(Arrays.asList((MetadataHolder[]) metadataHolderArray));
}
sqWhereClausePart = createSqWhereClausePart(metadataHolderList);
boolean objectTypeExists = queriesMap.containsKey(objectType);
if (objectTypeExists) {
String queryFromMap = queriesMap.get(objectType);
if(metadataHolderArray != null) {
sqWhereClausePart = " OR " + sqWhereClausePart;
}
queryFromMap = queryFromMap.substring(0, queryFromMap.length() - 1);
queryFromMap = queryFromMap + sqWhereClausePart + ")";
queriesMap.put(objectType, queryFromMap);
} else {
String sq = createSq(objectType, sqWhereClausePart);
String selectFromClause = createSelectFromClause(objectType, sq, metadataHolderList);
String query = selectFromClause + " ( " + sq + " )";
queriesMap.put(objectType, query);
}
}
Iterator queriesItr = queriesMap.entrySet().iterator();
while (queriesItr.hasNext()) {
Map.Entry pairs = (Map.Entry) queriesItr.next();
String objectType = (String) pairs.getKey();
String query = (String) pairs.getValue();
resultsCollection = DmsUtils.newInstance().executeQuery(session, query);
getVersionsIOHolder(objectType, resultsCollection,versionsIOHolderArray);
}
}catch(Exception e) {
throw new RuntimeException(e);
}finally {
try {
resultsCollection.close();
}catch(DfException dfe) {
DfLogger.error(this,"error",null,dfe);
}
if(smgr!=null && session!=null) {
smgr.release(session);
}
}
return versionsIOHolderArray;
}
private void getVersionsIOHolder(String objectType, IDfCollection resultsCol, VersionsIOHolder[] versionsIOHolderArray ) {
ArrayList<VersionsIOHolder> versionsIOHolderList = null;
HashMap<String, HashMap<String, String>> chronicleIdMap = new HashMap<String, HashMap<String, String>>();
HashMap<String, String> objectIdAndVerMap = null;
HashMap<String, ArrayList<MetadataHolder>> chronicleIdMetadataMap = new HashMap<String, ArrayList<MetadataHolder>>();
ArrayList<MetadataHolder> metadataHolderList = null;
try {
int i = 0;
while (resultsCol.next()) {
String iChronicleId = resultsCol.getString("i_chronicle_id");
String objectId = resultsCol.getString("r_object_id");
String version = resultsCol.getAllRepeatingStrings("r_version_label", ",");
if (version.contains("CURRENT")) {
version = orderCurrentVersion(version);
Enumeration<Attribute> attrEnum = resultsCol.enumAttrs();
while (attrEnum.hasMoreElements()) {
Attribute attribute = (Attribute) attrEnum.nextElement();
String attrName = attribute.getName();
String attrValue = resultsCol.getString(attrName);
if (!attrName.equals("r_object_id") && !attrName.equals("r_version_label")
&& !attrName.equals("r_object_type") && !attrName.equals("i_chronicle_id")) {
MetadataHolder metadataHolder = new MetadataHolder();
metadataHolder.setAttributeName(attrName);
metadataHolder.setAttributeValue(attrValue);
metadataHolderList = chronicleIdMetadataMap.get(iChronicleId);
if (metadataHolderList == null) {
metadataHolderList = new ArrayList<MetadataHolder>();
}
metadataHolderList.add(metadataHolder);
chronicleIdMetadataMap.put(iChronicleId, metadataHolderList);
}
}
if(!chronicleIdMetadataMap.containsKey(iChronicleId)){
chronicleIdMetadataMap.put(iChronicleId, new ArrayList<MetadataHolder>());
}
}
objectIdAndVerMap = chronicleIdMap.get(iChronicleId);
if (objectIdAndVerMap == null) {
objectIdAndVerMap = new HashMap<String, String>();
}
objectIdAndVerMap.put(objectId, version);
chronicleIdMap.put(iChronicleId, objectIdAndVerMap);
}
} catch (DfException dfe) {
throw new RuntimeException(dfe);
}
updateInputAndSetVersionHolder(chronicleIdMetadataMap,chronicleIdMap,versionsIOHolderArray, objectType);
}
private void updateInputAndSetVersionHolder(Map chronicleIdMetadataMap,
Map chronicleIdMap,VersionsIOHolder[] versionsIOHolderArray, String objectType ){
for (int i = 0; i < versionsIOHolderArray.length; i++) {
if(objectType.equals(versionsIOHolderArray[i].getObjectType()) ){
MetadataHolder metaDataHldr[] = versionsIOHolderArray[i].getMetadataHolderArray();
String chronicalId = matchedChronicalId(metaDataHldr,chronicleIdMetadataMap);
Map docIdAndVersion = (Map) chronicleIdMap.get(chronicalId);
if(docIdAndVersion==null){
throw new DfRuntimeException("Document Not found for " + objectType + " [ " + Arrays.asList(metaDataHldr) + "]" );
}
versionsIOHolderArray[i].setDocIdAndVerHolderArray( setDocIdAndVersionHolder( docIdAndVersion ) );
}
}
}
private String matchedChronicalId(MetadataHolder metaDataHldr[],Map chronicleIdMetadataMap){
Iterator it = chronicleIdMetadataMap.keySet().iterator();
while ( it.hasNext()) {
String chronicalId = (String) it.next();
List<MetadataHolder> lst = (List) chronicleIdMetadataMap.get(chronicalId);
MetadataHolder metaDataHldrDb[]= lst.toArray(new MetadataHolder[lst.size()]);
if(matchMetaData(metaDataHldr,metaDataHldrDb) ){
return chronicalId;
}
}
return null;
}
private boolean matchMetaData(MetadataHolder metaDataHldr[], MetadataHolder metaDataHldrDb[]){
for (int i = 0; i < metaDataHldrDb.length; i++) {
int matchCount = 0;
for (int j = 0; j < metaDataHldr.length; j++) {
if( metaDataHldrDb[i].equals( metaDataHldr[j] ) ){
matchCount++;
}
}
if(matchCount<1) return false;
}
return true;
}
private DocIdAndVerHolder[] setDocIdAndVersionHolder( Map docIdAndVersion){
if(docIdAndVersion == null) {
throw new DfRuntimeException("Metadata is not correct.");
}
ArrayList lst = new ArrayList<DocIdAndVerHolder>();
Iterator it = docIdAndVersion.keySet().iterator();
while (it.hasNext()) {
String objectId = (String) it.next();
String version = (String) docIdAndVersion.get(objectId);
DocIdAndVerHolder hldr = new DocIdAndVerHolder();
hldr.setDocumentId(objectId);
hldr.setVersion(version);
lst.add(hldr);
}
return (DocIdAndVerHolder[]) lst.toArray(new DocIdAndVerHolder[lst.size()]);
}
public String createSelectFromClause(String objectType, String sqWhereClausePart,
ArrayList<MetadataHolder> metadataHolderList) {
String query = "";
String selectClause = "SELECT r_object_id, r_version_label, r_object_type, i_chronicle_id, ";
if(metadataHolderList != null) {
Iterator<MetadataHolder> metadaHolderItr = metadataHolderList.iterator();
while (metadaHolderItr.hasNext()) {
MetadataHolder metadataHolder = metadaHolderItr.next();
String attributeName = metadataHolder.getAttributeName();
selectClause = selectClause + attributeName + ",";
}
}
if(metadataHolderList != null) {
selectClause = selectClause.substring(0, selectClause.length() - 1);
}else {
selectClause = selectClause.substring(0, selectClause.length() - 2);
}
query = selectClause + " FROM " + objectType+ " (ALL) WHERE i_chronicle_id IN ";
return query;
}
public String createSq(String objectType, String sqWhereClausePart) {
String sq = "SELECT i_chronicle_id FROM " + objectType;
if(sqWhereClausePart != null) {
sq = sq + " WHERE "+ sqWhereClausePart;
}
return sq;
}
public String createSqWhereClausePart(ArrayList<MetadataHolder> metadataHolderList) {
String sqWhereClausePart = null;
if(metadataHolderList != null) {
Iterator<MetadataHolder> metadaHolderItr = metadataHolderList.iterator();
int i = 1;
int itrLength = metadataHolderList.size();
while (metadaHolderItr.hasNext()) {
MetadataHolder metadataHolder = metadaHolderItr.next();
String attributeName = metadataHolder.getAttributeName();
String attributeValue = metadataHolder.getAttributeValue();
if (i == 1) {
sqWhereClausePart = "(";
}
sqWhereClausePart = sqWhereClausePart + " " + attributeName + "='"
+ attributeValue + "'" + " AND";
if (i == itrLength) {
sqWhereClausePart = sqWhereClausePart.substring(0,
sqWhereClausePart.length() - 3);
sqWhereClausePart = sqWhereClausePart + ")";
}
i++;
}
}
return sqWhereClausePart;
}
private String orderCurrentVersion(String version) {
String[] split = version.split(",");
if(split[0].equalsIgnoreCase("CURRENT")) {
version = split[1]+","+split[0];
} else {
version = split[0]+","+split[1];
}
return version;
}
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks a lot.
ie. if you open something, you are responsible for closing it