/* | |
* Copyright 2001-2008 The Apache Software Foundation. | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
* | |
*/ | |
package org.apache.juddi.api.impl; | |
import java.util.ArrayList; | |
import java.util.Date; | |
import java.util.LinkedList; | |
import java.util.List; | |
import javax.persistence.EntityManager; | |
import javax.xml.ws.Holder; | |
import org.apache.commons.configuration.ConfigurationException; | |
import org.apache.commons.logging.Log; | |
import org.apache.commons.logging.LogFactory; | |
import org.apache.juddi.config.AppConfig; | |
import org.apache.juddi.config.Property; | |
import org.apache.juddi.mapping.MappingModelToApi; | |
import org.apache.juddi.model.BindingTemplate; | |
import org.apache.juddi.query.FetchBindingTemplatesQuery; | |
import org.apache.juddi.query.FetchBusinessEntitiesQuery; | |
import org.apache.juddi.query.FetchBusinessServicesQuery; | |
import org.apache.juddi.query.FetchTModelsQuery; | |
import org.apache.juddi.query.FindBindingByCategoryGroupQuery; | |
import org.apache.juddi.query.FindBindingByCategoryQuery; | |
import org.apache.juddi.query.FindBindingByTModelKeyQuery; | |
import org.apache.juddi.query.FindBusinessByCategoryGroupQuery; | |
import org.apache.juddi.query.FindBusinessByCategoryQuery; | |
import org.apache.juddi.query.FindBusinessByCombinedCategoryQuery; | |
import org.apache.juddi.query.FindBusinessByDiscoveryURLQuery; | |
import org.apache.juddi.query.FindBusinessByIdentifierQuery; | |
import org.apache.juddi.query.FindBusinessByNameQuery; | |
import org.apache.juddi.query.FindBusinessByTModelKeyQuery; | |
import org.apache.juddi.query.FindServiceByCategoryGroupQuery; | |
import org.apache.juddi.query.FindServiceByCategoryQuery; | |
import org.apache.juddi.query.FindServiceByCombinedCategoryQuery; | |
import org.apache.juddi.query.FindServiceByNameQuery; | |
import org.apache.juddi.query.FindServiceByTModelKeyQuery; | |
import org.apache.juddi.query.FindTModelByCategoryGroupQuery; | |
import org.apache.juddi.query.FindTModelByCategoryQuery; | |
import org.apache.juddi.query.FindTModelByIdentifierQuery; | |
import org.apache.juddi.query.FindTModelByNameQuery; | |
import org.apache.juddi.query.util.FindQualifiers; | |
import org.apache.juddi.v3.error.ErrorMessage; | |
import org.apache.juddi.v3.error.InvalidKeyPassedException; | |
import org.uddi.api_v3.BindingDetail; | |
import org.uddi.api_v3.BusinessList; | |
import org.uddi.api_v3.Direction; | |
import org.uddi.api_v3.FindBinding; | |
import org.uddi.api_v3.FindBusiness; | |
import org.uddi.api_v3.FindRelatedBusinesses; | |
import org.uddi.api_v3.FindService; | |
import org.uddi.api_v3.FindTModel; | |
import org.uddi.api_v3.ListDescription; | |
import org.uddi.api_v3.Name; | |
import org.uddi.api_v3.RelatedBusinessesList; | |
import org.uddi.api_v3.ServiceList; | |
import org.uddi.api_v3.TModelBag; | |
import org.uddi.api_v3.TModelList; | |
import org.uddi.v3_service.DispositionReportFaultMessage; | |
/**Co | |
* Used to factor out inquiry functionality as it is used in more than one spot. | |
* | |
* @author <a href="mailto:jfaath@apache.org">Jeff Faath</a> | |
*/ | |
public class InquiryHelper { | |
private static Log logger = LogFactory.getLog(InquiryHelper.class); | |
public static List<Object> findBinding(FindBinding body, FindQualifiers findQualifiers, EntityManager em) throws DispositionReportFaultMessage { | |
List<Object> keysFound = new LinkedList<Object>(); | |
if (body.getServiceKey()!=null && body.getServiceKey().length() > 0) { | |
keysFound = findBindingsByServiceKey(em, body.getServiceKey(), keysFound); | |
} | |
if (body.getTModelBag() == null) | |
body.setTModelBag(new TModelBag()); | |
// First perform the embedded FindTModel search which will augment the tModel bag with any resulting tModel keys. | |
doFindTModelEmbeddedSearch(em, body.getFindQualifiers(), body.getFindTModel(), body.getTModelBag()); | |
keysFound = FindBindingByTModelKeyQuery.select(em, findQualifiers, body.getTModelBag(), body.getServiceKey(), keysFound); | |
keysFound = FindBindingByCategoryQuery.select(em, findQualifiers, body.getCategoryBag(), body.getServiceKey(), keysFound); | |
keysFound = FindBindingByCategoryGroupQuery.select(em, findQualifiers, body.getCategoryBag(), body.getServiceKey(), keysFound); | |
return keysFound; | |
} | |
public static BindingDetail getBindingDetailFromKeys(FindBinding body, FindQualifiers findQualifiers, EntityManager em, List<?> keysFound) throws DispositionReportFaultMessage { | |
return getBindingDetailFromKeys(body, findQualifiers, em, keysFound, null, null, null, null); | |
} | |
public static BindingDetail getBindingDetailFromKeys(FindBinding body, FindQualifiers findQualifiers, EntityManager em, List<?> keysFound, | |
Date modifiedAfter, Date modifiedBefore, Holder<Integer> subscriptionStartIndex, Integer subscriptionMaxRows) | |
throws DispositionReportFaultMessage { | |
BindingDetail result = new BindingDetail(); | |
ListDescription listDesc = new ListDescription(); | |
result.setListDescription(listDesc); | |
// Sort and retrieve the final results with paging taken into account | |
List<?> queryResults = FetchBindingTemplatesQuery.select(em, findQualifiers, keysFound, body.getMaxRows(), body.getListHead(), listDesc); | |
// Set the currentIndex to 0 or the value of the subscriptionStartIndex | |
int currentIndex = 0; | |
if (subscriptionStartIndex != null && subscriptionStartIndex.value != null) | |
currentIndex = subscriptionStartIndex.value; | |
int returnedRowCount = 0; | |
while (currentIndex < queryResults.size()) { | |
Object item = queryResults.get(currentIndex); | |
org.apache.juddi.model.BindingTemplate modelBindingTemplate = (org.apache.juddi.model.BindingTemplate)item; | |
org.uddi.api_v3.BindingTemplate apiBindingTemplate = new org.uddi.api_v3.BindingTemplate(); | |
if (modifiedAfter != null && modifiedAfter.after(modelBindingTemplate.getModifiedIncludingChildren())) { | |
currentIndex++; | |
continue; | |
} | |
if (modifiedBefore != null && modifiedBefore.before(modelBindingTemplate.getModifiedIncludingChildren())) { | |
currentIndex++; | |
continue; | |
} | |
MappingModelToApi.mapBindingTemplate(modelBindingTemplate, apiBindingTemplate); | |
result.getBindingTemplate().add(apiBindingTemplate); | |
returnedRowCount++; | |
// If the returned rows equals the max allowed, we can end the loop (applies to subscription calls only) | |
if (subscriptionMaxRows != null) { | |
if (returnedRowCount == subscriptionMaxRows) | |
break; | |
} | |
currentIndex++; | |
} | |
// If the loop was broken prematurely (max row count hit) we set the subscriptionStartIndex to the next index to start with. | |
// Otherwise, set it to null so the subscription call won't trigger chunk token generation. | |
if (currentIndex < (queryResults.size() - 1)) { | |
if (subscriptionStartIndex != null) | |
subscriptionStartIndex.value = currentIndex + 1; | |
result.setTruncated(Boolean.TRUE); | |
} | |
else { | |
if (subscriptionStartIndex != null) | |
subscriptionStartIndex.value = null; | |
result.setTruncated(Boolean.FALSE); | |
} | |
result.getListDescription().setListHead(currentIndex); | |
result.getListDescription().setActualCount(result.getBindingTemplate().size()); | |
result.getListDescription().setIncludeCount(returnedRowCount); | |
return result; | |
} | |
public static List<Object> findBusiness(FindBusiness body, FindQualifiers findQualifiers, EntityManager em) throws DispositionReportFaultMessage { | |
List<Object> keysFound = null; | |
// First perform the embedded FindTModel search which will augment the tModel bag with any resulting tModel keys. | |
if (body.getTModelBag() == null) | |
body.setTModelBag(new TModelBag()); | |
doFindTModelEmbeddedSearch(em, body.getFindQualifiers(), body.getFindTModel(), body.getTModelBag()); | |
// The embedded find_relatedBusinesses search is performed first. This is done the same as the actual API call, except the resulting business keys are | |
// extracted and placed in the keysFound array to restrict future searches to only those keys. | |
if (body.getFindRelatedBusinesses() != null) { | |
FindRelatedBusinesses frb = body.getFindRelatedBusinesses(); | |
org.uddi.api_v3.RelatedBusinessInfos relatedBusinessInfos = new org.uddi.api_v3.RelatedBusinessInfos(); | |
if (body.getFindRelatedBusinesses().getBusinessKey() != null ) { | |
getRelatedBusinesses(em, Direction.FROM_KEY, frb.getBusinessKey(), frb.getKeyedReference(), relatedBusinessInfos); | |
getRelatedBusinesses(em, Direction.TO_KEY, frb.getBusinessKey(), frb.getKeyedReference(), relatedBusinessInfos); | |
} | |
else if (body.getFindRelatedBusinesses().getFromKey() != null) | |
getRelatedBusinesses(em, Direction.FROM_KEY, frb.getFromKey(), frb.getKeyedReference(), relatedBusinessInfos); | |
else if (body.getFindRelatedBusinesses().getToKey() != null) | |
getRelatedBusinesses(em, Direction.TO_KEY, frb.getToKey(), frb.getKeyedReference(), relatedBusinessInfos); | |
List<Object> relatedBusinessKeys = new ArrayList<Object>(0); | |
for (org.uddi.api_v3.RelatedBusinessInfo rbi : relatedBusinessInfos.getRelatedBusinessInfo()) | |
relatedBusinessKeys.add(rbi.getBusinessKey()); | |
keysFound = relatedBusinessKeys; | |
} | |
keysFound = FindBusinessByTModelKeyQuery.select(em, findQualifiers, body.getTModelBag(), keysFound); | |
keysFound = FindBusinessByIdentifierQuery.select(em, findQualifiers, body.getIdentifierBag(), keysFound); | |
keysFound = FindBusinessByDiscoveryURLQuery.select(em, findQualifiers, body.getDiscoveryURLs(), keysFound); | |
if (findQualifiers.isCombineCategoryBags()) { | |
keysFound = FindBusinessByCombinedCategoryQuery.select(em, findQualifiers, body.getCategoryBag(), keysFound); | |
} else { | |
keysFound = FindBusinessByCategoryQuery.select(em, findQualifiers, body.getCategoryBag(), keysFound); | |
} | |
keysFound = FindBusinessByCategoryGroupQuery.select(em, findQualifiers, body.getCategoryBag(), keysFound); | |
keysFound = FindBusinessByNameQuery.select(em, findQualifiers, body.getName(), keysFound); | |
// If there no keys in the bag then remove the empty TModelBag | |
if (body.getTModelBag().getTModelKey().size()==0) body.setTModelBag(null); | |
return keysFound; | |
} | |
public static BusinessList getBusinessListFromKeys(FindBusiness body, FindQualifiers findQualifiers, EntityManager em, List<?> keysFound) throws DispositionReportFaultMessage { | |
return getBusinessListFromKeys(body, findQualifiers, em, keysFound, null, null, null, null); | |
} | |
public static BusinessList getBusinessListFromKeys(FindBusiness body, FindQualifiers findQualifiers, EntityManager em, List<?> keysFound, | |
Date modifiedAfter, Date modifiedBefore, Holder<Integer> subscriptionStartIndex, Integer subscriptionMaxRows) | |
throws DispositionReportFaultMessage { | |
BusinessList result = new BusinessList(); | |
ListDescription listDesc = new ListDescription(); | |
result.setListDescription(listDesc); | |
// Sort and retrieve the final results taking paging into account | |
List<?> queryResults = FetchBusinessEntitiesQuery.select(em, findQualifiers, keysFound, body.getMaxRows(), body.getListHead(), listDesc); | |
boolean enabled = true; | |
try { | |
//AppConfig.reloadConfig(); | |
enabled= AppConfig.getConfiguration().getBoolean(Property.JUDDI_ENABLE_FIND_BUSINESS_TMODEL_BAG_FILTERING, true); | |
} catch (ConfigurationException ex) { | |
logger.error(ex); | |
} | |
if (enabled) { | |
logger.info("FindBusiness by tModelBag is enabled! Loaded from " + AppConfig.getConfigFileURL()); | |
List<?> serviceResults = null; | |
for (int i = 0; i < queryResults.size(); i++) { | |
org.apache.juddi.model.BusinessEntity be = (org.apache.juddi.model.BusinessEntity) queryResults.get(i); | |
List<Object> keysIn = new ArrayList<Object>(); | |
List<org.apache.juddi.model.BusinessService> services = be.getBusinessServices(); | |
for (int j = 0; j < services.size(); j++) { | |
keysIn.add(services.get(j).getEntityKey()); | |
} | |
serviceResults = FindServiceByTModelKeyQuery.select(em, findQualifiers, body.getTModelBag(), null, keysIn); | |
if (serviceResults == null) { | |
be.setBusinessServices(null); | |
} else { | |
ListDescription ldesc = new ListDescription(); | |
result.setListDescription(listDesc); | |
List<?> srvcs = FetchBusinessServicesQuery.select(em, findQualifiers, serviceResults, body.getMaxRows(), | |
body.getListHead(), ldesc); | |
be.setBusinessServices((List<org.apache.juddi.model.BusinessService>) srvcs); | |
} | |
} | |
} | |
if (queryResults != null && queryResults.size() > 0) | |
result.setBusinessInfos(new org.uddi.api_v3.BusinessInfos()); | |
// Set the currentIndex to 0 or the value of the subscriptionStartIndex | |
int currentIndex = 0; | |
if (subscriptionStartIndex != null && subscriptionStartIndex.value != null) | |
currentIndex = subscriptionStartIndex.value; | |
int returnedRowCount = 0; | |
while (queryResults!=null && currentIndex < queryResults.size()) { | |
Object item = queryResults.get(currentIndex); | |
org.apache.juddi.model.BusinessEntity modelBusinessEntity = (org.apache.juddi.model.BusinessEntity)item; | |
org.uddi.api_v3.BusinessInfo apiBusinessInfo = new org.uddi.api_v3.BusinessInfo(); | |
if (modifiedAfter != null && modifiedAfter.after(modelBusinessEntity.getModifiedIncludingChildren())){ | |
currentIndex++; | |
continue; | |
} | |
if (modifiedBefore != null && modifiedBefore.before(modelBusinessEntity.getModifiedIncludingChildren())) { | |
currentIndex++; | |
continue; | |
} | |
MappingModelToApi.mapBusinessInfo(modelBusinessEntity, apiBusinessInfo); | |
result.getBusinessInfos().getBusinessInfo().add(apiBusinessInfo); | |
returnedRowCount++; | |
// If the returned rows equals the max allowed, we can end the loop (applies to subscription calls only) | |
if (subscriptionMaxRows != null) { | |
if (returnedRowCount == subscriptionMaxRows) | |
break; | |
} | |
currentIndex++; | |
} | |
// If the loop was broken prematurely (max row count hit) we set the subscriptionStartIndex to the next index to start with. | |
// Otherwise, set it to null so the subscription call won't trigger chunk token generation. | |
if (queryResults!=null && currentIndex < (queryResults.size() - 1)) { | |
if (subscriptionStartIndex != null) | |
subscriptionStartIndex.value = currentIndex + 1; | |
result.setTruncated(Boolean.TRUE); | |
} | |
else { | |
if (subscriptionStartIndex != null) | |
subscriptionStartIndex.value = null; | |
result.setTruncated(Boolean.FALSE); | |
} | |
return result; | |
} | |
public static List<?> findService(FindService body, FindQualifiers findQualifiers, EntityManager em) throws DispositionReportFaultMessage { | |
List<Object> keysFound = null; | |
// First perform the embedded FindTModel search which will augment the tModel bag with any resulting tModel keys. | |
if (body.getTModelBag() == null) | |
body.setTModelBag(new TModelBag()); | |
doFindTModelEmbeddedSearch(em, body.getFindQualifiers(), body.getFindTModel(), body.getTModelBag()); | |
keysFound = FindServiceByTModelKeyQuery.select(em, findQualifiers, body.getTModelBag(), body.getBusinessKey(), keysFound); | |
if (findQualifiers.isCombineCategoryBags()) { | |
keysFound = FindServiceByCombinedCategoryQuery.select(em, findQualifiers, body.getCategoryBag(), body.getBusinessKey(), keysFound); | |
} else { | |
keysFound = FindServiceByCategoryQuery.select(em, findQualifiers, body.getCategoryBag(), body.getBusinessKey(), keysFound); | |
} | |
keysFound = FindServiceByCategoryGroupQuery.select(em, findQualifiers, body.getCategoryBag(), body.getBusinessKey(), keysFound); | |
if (body.getFindTModel()==null && body.getCategoryBag()==null && | |
( body.getTModelBag()==null || body.getTModelBag().getTModelKey().size() == 0) | |
&& body.getName().size() == 0 && body.getBusinessKey() != null) { | |
//support searching for all services for a business | |
findQualifiers.setApproximateMatch(true); | |
body.getName().add(new Name("%", null)); | |
} | |
keysFound = FindServiceByNameQuery.select(em, findQualifiers, body.getName(), body.getBusinessKey(), keysFound); | |
if (body.getTModelBag().getTModelKey().size()==0) body.setTModelBag(null); | |
return keysFound; | |
} | |
public static ServiceList getServiceListFromKeys(FindService body, FindQualifiers findQualifiers, EntityManager em, List<?> keysFound) throws DispositionReportFaultMessage { | |
return getServiceListFromKeys(body, findQualifiers, em, keysFound, null, null, null, null); | |
} | |
public static ServiceList getServiceListFromKeys(FindService body, FindQualifiers findQualifiers, EntityManager em, List<?> keysFound, | |
Date modifiedAfter, Date modifiedBefore, Holder<Integer> subscriptionStartIndex, Integer subscriptionMaxRows) | |
throws DispositionReportFaultMessage { | |
ServiceList result = new ServiceList(); | |
ListDescription listDesc = new ListDescription(); | |
result.setListDescription(listDesc); | |
// Sort and retrieve the final results taking paging into account | |
List<?> queryResults = FetchBusinessServicesQuery.select(em, findQualifiers, keysFound, body.getMaxRows(), body.getListHead(), listDesc); | |
if (queryResults != null && queryResults.size() > 0) | |
result.setServiceInfos(new org.uddi.api_v3.ServiceInfos()); | |
// Set the currentIndex to 0 or the value of the subscriptionStartIndex | |
int currentIndex = 0; | |
if (subscriptionStartIndex != null && subscriptionStartIndex.value != null) | |
currentIndex = subscriptionStartIndex.value; | |
int returnedRowCount = 0; | |
if (logger.isDebugEnabled()) logger.debug("Period = " + modifiedAfter + " ---- " + modifiedBefore); | |
while (queryResults!=null && currentIndex < queryResults.size()) { | |
Object item = queryResults.get(currentIndex); | |
org.apache.juddi.model.BusinessService modelBusinessService = (org.apache.juddi.model.BusinessService)item; | |
org.uddi.api_v3.ServiceInfo apiServiceInfo = new org.uddi.api_v3.ServiceInfo(); | |
logger.debug(modelBusinessService.getEntityKey() + " is modified " + modelBusinessService.getModifiedIncludingChildren() + " " + modelBusinessService.getModifiedIncludingChildren().getTime() ); | |
if (modifiedAfter != null && modifiedAfter.after(modelBusinessService.getModifiedIncludingChildren())) { | |
currentIndex++; | |
continue; | |
} | |
if (modifiedBefore != null && modifiedBefore.before(modelBusinessService.getModifiedIncludingChildren())) { | |
currentIndex++; | |
continue; | |
} | |
MappingModelToApi.mapServiceInfo(modelBusinessService, apiServiceInfo); | |
result.getServiceInfos().getServiceInfo().add(apiServiceInfo); | |
returnedRowCount++; | |
// If the returned rows equals the max allowed, we can end the loop (applies to subscription calls only) | |
if (subscriptionMaxRows != null) { | |
if (returnedRowCount == subscriptionMaxRows) | |
break; | |
} | |
currentIndex++; | |
} | |
// If the loop was broken prematurely (max row count hit) we set the subscriptionStartIndex to the next index to start with. | |
// Otherwise, set it to null so the subscription call won't trigger chunk token generation. | |
if (queryResults!=null && currentIndex < (queryResults.size() - 1)) { | |
if (subscriptionStartIndex != null) | |
subscriptionStartIndex.value = currentIndex + 1; | |
result.setTruncated(Boolean.TRUE); | |
} | |
else { | |
if (subscriptionStartIndex != null) | |
subscriptionStartIndex.value = null; | |
result.setTruncated(Boolean.FALSE); | |
} | |
return result; | |
} | |
public static List<Object> findTModel(FindTModel body, FindQualifiers findQualifiers, EntityManager em) throws DispositionReportFaultMessage { | |
List<Object> keysFound = null; | |
keysFound = FindTModelByIdentifierQuery.select(em, findQualifiers, body.getIdentifierBag(), keysFound); | |
keysFound = FindTModelByCategoryQuery.select(em, findQualifiers, body.getCategoryBag(), keysFound); | |
keysFound = FindTModelByCategoryGroupQuery.select(em, findQualifiers, body.getCategoryBag(), keysFound); | |
keysFound = FindTModelByNameQuery.select(em, findQualifiers, body.getName(), keysFound); | |
return keysFound; | |
} | |
public static TModelList getTModelListFromKeys(FindTModel body, FindQualifiers findQualifiers, EntityManager em, List<?> keysFound) throws DispositionReportFaultMessage { | |
return getTModelListFromKeys(body, findQualifiers, em, keysFound, null, null, null, null); | |
} | |
public static TModelList getTModelListFromKeys(FindTModel body, FindQualifiers findQualifiers, EntityManager em, List<?> keysFound, | |
Date modifiedAfter, Date modifiedBefore, Holder<Integer> subscriptionStartIndex, Integer subscriptionMaxRows) | |
throws DispositionReportFaultMessage { | |
TModelList result = new TModelList(); | |
ListDescription listDesc = new ListDescription(); | |
result.setListDescription(listDesc); | |
// Sort and retrieve the final results taking paging into account | |
List<?> queryResults = FetchTModelsQuery.select(em, findQualifiers, keysFound, body.getMaxRows(), body.getListHead(), listDesc); | |
if (queryResults != null && queryResults.size() > 0) | |
result.setTModelInfos(new org.uddi.api_v3.TModelInfos()); | |
// Set the currentIndex to 0 or the value of the subscriptionStartIndex | |
int currentIndex = 0; | |
if (subscriptionStartIndex != null && subscriptionStartIndex.value != null) | |
currentIndex = subscriptionStartIndex.value; | |
int returnedRowCount = 0; | |
while (queryResults!=null && currentIndex < queryResults.size()) { | |
Object item = queryResults.get(currentIndex); | |
org.apache.juddi.model.Tmodel modelTModel = (org.apache.juddi.model.Tmodel)item; | |
org.uddi.api_v3.TModelInfo apiTModelInfo = new org.uddi.api_v3.TModelInfo(); | |
if (modifiedAfter != null && modifiedAfter.after(modelTModel.getModifiedIncludingChildren())) { | |
currentIndex++; | |
continue; | |
} | |
if (modifiedBefore != null && modifiedBefore.before(modelTModel.getModifiedIncludingChildren())) { | |
currentIndex++; | |
continue; | |
} | |
MappingModelToApi.mapTModelInfo(modelTModel, apiTModelInfo); | |
result.getTModelInfos().getTModelInfo().add(apiTModelInfo); | |
returnedRowCount++; | |
// If the returned rows equals the max allowed, we can end the loop (applies to subscription calls only) | |
if (subscriptionMaxRows != null) { | |
if (returnedRowCount == subscriptionMaxRows) | |
break; | |
} | |
currentIndex++; | |
} | |
// If the loop was broken prematurely (max row count hit) we set the subscriptionStartIndex to the next index to start with. | |
// Otherwise, set it to null so the subscription call won't trigger chunk token generation. | |
if (queryResults!=null && currentIndex < (queryResults.size() - 1)) { | |
if (subscriptionStartIndex != null) | |
subscriptionStartIndex.value = currentIndex + 1; | |
result.setTruncated(Boolean.TRUE); | |
} | |
else { | |
if (subscriptionStartIndex != null) | |
subscriptionStartIndex.value = null; | |
result.setTruncated(Boolean.FALSE); | |
} | |
return result; | |
} | |
/* | |
* Retrieves related businesses based on the focal business and the direction (fromKey or toKey). The focal business is retrieved and then the | |
* appropriate publisher assertion collection is examined for matches. The assertion must be "completed" and if a keyedReference is passed, it must | |
* match exactly. Successful assertion matches are mapped to a RelationBusinessInfo structure and added to the passed in RelationalBusinessInfos | |
* structure. | |
*/ | |
public static void getRelatedBusinesses(EntityManager em, | |
Direction direction, | |
String focalKey, | |
org.uddi.api_v3.KeyedReference keyedRef, | |
org.uddi.api_v3.RelatedBusinessInfos relatedBusinessInfos) | |
throws DispositionReportFaultMessage { | |
getRelatedBusinesses(em, direction, focalKey, keyedRef, relatedBusinessInfos, null, null); | |
} | |
public static void getRelatedBusinesses(EntityManager em, | |
Direction direction, | |
String focalKey, | |
org.uddi.api_v3.KeyedReference keyedRef, | |
org.uddi.api_v3.RelatedBusinessInfos relatedBusinessInfos, | |
Date modifiedAfter, | |
Date modifiedBefore) | |
throws DispositionReportFaultMessage { | |
if (relatedBusinessInfos == null) | |
relatedBusinessInfos = new org.uddi.api_v3.RelatedBusinessInfos(); | |
org.apache.juddi.model.BusinessEntity focalBusiness = null; | |
try { | |
focalBusiness = em.find(org.apache.juddi.model.BusinessEntity.class, focalKey); | |
} catch (ClassCastException e) {} | |
if (focalBusiness == null) | |
throw new InvalidKeyPassedException(new ErrorMessage("errors.invalidkey.BusinessNotFound", focalKey)); | |
List<org.apache.juddi.model.PublisherAssertion> pubAssertList = null; | |
if (direction == Direction.FROM_KEY) | |
pubAssertList = focalBusiness.getPublisherAssertionsForFromKey(); | |
else | |
pubAssertList = focalBusiness.getPublisherAssertionsForToKey(); | |
if (pubAssertList != null) { | |
for (org.apache.juddi.model.PublisherAssertion modelPublisherAssertion : pubAssertList) { | |
if ("true".equalsIgnoreCase(modelPublisherAssertion.getFromCheck()) && "true".equalsIgnoreCase(modelPublisherAssertion.getToCheck())) { | |
if (keyedRef != null) { | |
if(!keyedRef.getTModelKey().equals(modelPublisherAssertion.getTmodelKey()) || | |
!keyedRef.getKeyName().equals(modelPublisherAssertion.getKeyName()) || | |
!keyedRef.getKeyValue().equals(modelPublisherAssertion.getKeyValue())) { | |
continue; | |
} | |
} | |
org.apache.juddi.model.BusinessEntity modelRelatedBusiness = null; | |
if (direction == Direction.FROM_KEY) | |
modelRelatedBusiness = em.find(org.apache.juddi.model.BusinessEntity.class, modelPublisherAssertion.getId().getToKey()); | |
else | |
modelRelatedBusiness = em.find(org.apache.juddi.model.BusinessEntity.class, modelPublisherAssertion.getId().getFromKey()); | |
if (modifiedAfter != null && modifiedAfter.after(modelRelatedBusiness.getModifiedIncludingChildren())) | |
continue; | |
if (modifiedBefore != null && modifiedBefore.before(modelRelatedBusiness.getModifiedIncludingChildren())) | |
continue; | |
org.uddi.api_v3.RelatedBusinessInfo apiRelatedBusinessInfo = new org.uddi.api_v3.RelatedBusinessInfo(); | |
MappingModelToApi.mapRelatedBusinessInfo(modelPublisherAssertion, modelRelatedBusiness, direction, apiRelatedBusinessInfo); | |
relatedBusinessInfos.getRelatedBusinessInfo().add(apiRelatedBusinessInfo); | |
} | |
} | |
} | |
} | |
public static RelatedBusinessesList getRelatedBusinessesList(FindRelatedBusinesses body, EntityManager em) throws DispositionReportFaultMessage { | |
return getRelatedBusinessesList(body, em, null, null); | |
} | |
public static RelatedBusinessesList getRelatedBusinessesList(FindRelatedBusinesses body, EntityManager em, Date modifiedAfter, Date modifiedBefore) throws DispositionReportFaultMessage { | |
RelatedBusinessesList result = new RelatedBusinessesList(); | |
result.setBusinessKey(body.getBusinessKey()); | |
ListDescription listDesc = new ListDescription(); | |
result.setListDescription(listDesc); | |
// Either one of the businessKey, fromKey or toKey will be passed. This is considered the "focal" business to which related businesses must be | |
// found. Rather than use a query, it seems simpler to take advantage of the model's publisher assertion collections. | |
org.uddi.api_v3.RelatedBusinessInfos relatedBusinessInfos = new org.uddi.api_v3.RelatedBusinessInfos(); | |
if (body.getBusinessKey() != null ) { | |
InquiryHelper.getRelatedBusinesses(em, Direction.FROM_KEY, body.getBusinessKey(), body.getKeyedReference(), relatedBusinessInfos, modifiedAfter, modifiedBefore); | |
InquiryHelper.getRelatedBusinesses(em, Direction.TO_KEY, body.getBusinessKey(), body.getKeyedReference(), relatedBusinessInfos, modifiedAfter, modifiedBefore); | |
} | |
else if (body.getFromKey() != null) { | |
InquiryHelper.getRelatedBusinesses(em, Direction.FROM_KEY, body.getFromKey(), body.getKeyedReference(), relatedBusinessInfos, modifiedAfter, modifiedBefore); | |
result.setBusinessKey(body.getFromKey()); | |
} else if (body.getToKey() != null) { | |
InquiryHelper.getRelatedBusinesses(em, Direction.TO_KEY, body.getToKey(), body.getKeyedReference(), relatedBusinessInfos, modifiedAfter, modifiedBefore); | |
result.setBusinessKey(body.getToKey()); | |
} | |
if (relatedBusinessInfos.getRelatedBusinessInfo().size() > 0) { | |
// TODO: Do proper pagination! | |
listDesc.setActualCount(relatedBusinessInfos.getRelatedBusinessInfo().size()); | |
listDesc.setIncludeCount(relatedBusinessInfos.getRelatedBusinessInfo().size()); | |
listDesc.setListHead(1); | |
result.setRelatedBusinessInfos(relatedBusinessInfos); | |
} | |
return result; | |
} | |
/** | |
* Performs the necessary queries for the find_tModel search and adds resulting tModel keys to the tModelBag provided. | |
*/ | |
private static void doFindTModelEmbeddedSearch(EntityManager em, | |
org.uddi.api_v3.FindQualifiers fq, | |
FindTModel findTmodel, | |
TModelBag tmodelBag) | |
throws DispositionReportFaultMessage { | |
if (findTmodel != null && tmodelBag != null) { | |
org.apache.juddi.query.util.FindQualifiers findQualifiers = new org.apache.juddi.query.util.FindQualifiers(); | |
findQualifiers.mapApiFindQualifiers(findTmodel.getFindQualifiers()); | |
List<Object> tmodelKeysFound = null; | |
tmodelKeysFound = FindTModelByIdentifierQuery.select(em, findQualifiers, findTmodel.getIdentifierBag(), tmodelKeysFound); | |
tmodelKeysFound = FindTModelByCategoryQuery.select(em, findQualifiers, findTmodel.getCategoryBag(), tmodelKeysFound); | |
tmodelKeysFound = FindTModelByCategoryGroupQuery.select(em, findQualifiers, findTmodel.getCategoryBag(), tmodelKeysFound); | |
tmodelKeysFound = FindTModelByNameQuery.select(em, findQualifiers, findTmodel.getName(), tmodelKeysFound); | |
if (tmodelKeysFound != null && tmodelKeysFound.size() > 0) { | |
for (Object item : tmodelKeysFound) | |
tmodelBag.getTModelKey().add((String)item); | |
} | |
} | |
} | |
private static List<Object> findBindingsByServiceKey(EntityManager em, String serviceKey, List<Object> keysFound) { | |
org.apache.juddi.model.BusinessService modelBusinessService=em.find(org.apache.juddi.model.BusinessService.class, serviceKey); | |
for (BindingTemplate bt : modelBusinessService.getBindingTemplates()){ | |
keysFound.add(bt.getEntityKey()); | |
} | |
return keysFound; | |
} | |
} |