Link to home
Start Free TrialLog in
Avatar of ank9
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?

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
}

Open in new window

Avatar of Mick Barry
Mick Barry
Flag of Australia image

yes thats the correct way of handling it
ie. if you open something, you are responsible for closing it
Avatar of ank9
ank9

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.
only myMethod_1
Avatar of ank9

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.impl.collection.CollectionHandle$DisposableData  - [DFC_QUERY_NOT_CLOSED] Unclosed collection found during garbage collection, com.documentum.fc.client.impl.collection.TypedDataCollection@6d888e.
com.documentum.fc.impl.util.ThrowableStack: Stack when collection was obtained
            at com.documentum.fc.client.impl.collection.TypedDataCollection.newInstance(TypedDataCollection.java:31)
            at com.documentum.fc.client.DfQuery.runQuery(DfQuery.java:161)
            at com.documentum.fc.client.DfQuery.execute(DfQuery.java:205)
            at com.db.dms.utils.DmsUtils.executeQuery(Unknown Source)
            at com.db.dms.versions.DmsTemplateVersions.getLatestVersion(Unknown Source)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:585)
            at com.tibco.plugin.java.JavaMethodActivity.for(JavaMethodActivity.java:351)
            at com.tibco.plugin.java.JavaMethodActivity.eval(JavaMethodActivity.java:121)
            at com.tibco.pe.plugin.Activity.eval(Activity.java:209)
            at com.tibco.pe.core.TaskImpl.eval(TaskImpl.java:540)
            at com.tibco.pe.core.Job.a(Job.java:712)
            at com.tibco.pe.core.Job.k(Job.java:501)
            at com.tibco.pe.core.JobDispatcher$JobCourier.a(JobDispatcher.java:249)
            at com.tibco.pe.core.JobDispatcher$JobCourier.run(JobDispatcher.java:200)
That might not be the call where it's remaining open

Don't ignore exceptions if you're actually doing this:

>>
}catch(Exception e) {}
>>
Avatar of ank9

ASKER


 
Following is the complete code.
 
getLatestVersion() and getVersions() are the methods which are publicly exposed.
Avatar of ank9

ASKER

Following the code.
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;
	}
	
	

}

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of Mick Barry
Mick Barry
Flag of Australia image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of ank9

ASKER

Thanks a lot.