aslcore/src/org/gcube/application/framework/core/cache/factories/MetadataCacheEntryFactory.java

104 lines
5.1 KiB
Java

package org.gcube.application.framework.core.cache.factories;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.axis.message.addressing.Address;
import org.apache.axis.message.addressing.EndpointReference;
import org.apache.axis.message.addressing.EndpointReferenceType;
import org.gcube.application.framework.core.cache.RIsManager;
import org.gcube.application.framework.core.security.ServiceContextManager;
import org.gcube.application.framework.core.util.CacheEntryConstants;
import org.gcube.application.framework.core.util.QueryString;
import org.gcube.common.core.scope.GCUBEScope;
import org.gcube.common.core.utils.logging.GCUBELog;
import org.gcube.informationsystem.cache.SrvType;
import org.gcube.metadatamanagement.metadatamanager.stubs.CreateManagerResponse;
import org.gcube.metadatamanagement.metadatamanager.stubs.GetElementItemResponse;
import org.gcube.metadatamanagement.metadatamanager.stubs.GetElementsResponse;
import org.gcube.metadatamanagement.metadatamanager.stubs.InformationObjectIDList;
import org.gcube.metadatamanagement.metadatamanager.stubs.MetadataManagerFactoryPortType;
import org.gcube.metadatamanagement.metadatamanager.stubs.MetadataManagerPortType;
import org.gcube.metadatamanagement.metadatamanager.stubs.MetadataObjectList;
import org.gcube.metadatamanagement.metadatamanager.stubs.service.MetadataManagerFactoryServiceAddressingLocator;
import org.gcube.metadatamanagement.metadatamanager.stubs.service.MetadataManagerServiceAddressingLocator;
import org.gcube.metadatamanagement.mmlibrary.model.BaseMetadata;
import net.sf.ehcache.constructs.blocking.CacheEntryFactory;
/**
* @author Valia Tsagkalidou (NKUA)
*
*/
public class MetadataCacheEntryFactory implements CacheEntryFactory {
/**
* An atomic integer to get the CMS EPRs round-robin
*/
protected static AtomicInteger mcId = new AtomicInteger(0);
/** Object logger. */
protected final GCUBELog logger = new GCUBELog(this);
/**
* @param key a QueryString representing pairs of keys and values. Needed keys are "vre", "metadataColID", "oid"
* @return the metadata object of the corresponding ID
*/
public Object createEntry(Object key) throws Exception {
QueryString query = (QueryString) key;
try {
MetadataManagerPortType metaManager = null;
EndpointReference[] mcURIs = RIsManager.getInstance().getISCache(GCUBEScope.getScope(query.get(CacheEntryConstants.vre))).getEPRsFor("MetadataManagement", "MetadataManager", SrvType.FACTORY.name());
logger.info("Number of available mms factories: " + mcURIs.length);
for(int i=0; i < mcURIs.length; i++)
{
try {
MetadataManagerServiceAddressingLocator instanceLocator = new MetadataManagerServiceAddressingLocator();
MetadataManagerFactoryPortType mcFactory = null;
EndpointReferenceType endpoint = new EndpointReferenceType();
endpoint.setAddress(new Address(mcURIs[mcId.getAndIncrement()%mcURIs.length].getAddress().toString()));
MetadataManagerFactoryServiceAddressingLocator mcflocator = new MetadataManagerFactoryServiceAddressingLocator();
mcFactory = mcflocator.getMetadataManagerFactoryPortTypePort(endpoint);
mcFactory = ServiceContextManager.applySecurity(mcFactory, GCUBEScope.getScope(query.get(CacheEntryConstants.vre)), ApplicationCredentials.getInstance().getCredential(query.get(CacheEntryConstants.vre)));
CreateManagerResponse createResponsefromcollection = mcFactory.createManagerFromCollection(query.get(CacheEntryConstants.metadataColID));
EndpointReferenceType instanceEPR = createResponsefromcollection.getEndpointReference();
metaManager = instanceLocator.getMetadataManagerPortTypePort(instanceEPR);
break;
}
catch (Exception e) {
logger.error("",e);
}
}
try {
metaManager = ServiceContextManager.applySecurity(metaManager, GCUBEScope.getScope(query.get(CacheEntryConstants.vre)), ApplicationCredentials.getInstance().getCredential(query.get(CacheEntryConstants.vre)));
} catch (Exception e) {
logger.error("",e);
}
logger.info("get metadata for oid: " + query.get(CacheEntryConstants.oid) + " and metadta col ID: " + query.get(CacheEntryConstants.metadataColID));
String[] oids = new String[1];
oids[0] = query.get(CacheEntryConstants.oid);
InformationObjectIDList oidsList = new InformationObjectIDList(oids);
GetElementsResponse elements = metaManager.getElements(oidsList);
for(int i=0; i < elements.getGetElementsItemResponse().length; i++)
{
GetElementItemResponse element = elements.getGetElementsItemResponse(i);
MetadataObjectList moList = element.getMetadataObjectList();
if (moList != null) {
for(int j=0; j < moList.getMetadataObject().length; j++)
{
String metadataXML = moList.getMetadataObject(0);
logger.debug("metadata:" + metadataXML);
if(metadataXML != null)
return metadataXML;
}
}
}
} catch (Exception e) {
logger.error("",e);
}
return null;
}
}