/*
* Copyright 2012 Research Studios Austria Forschungsges.m.b.H.
*
* 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 won.node.camel.processor;
import org.apache.camel.Processor;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import won.cryptography.service.RandomNumberService;
import won.node.protocol.MatcherProtocolMatcherServiceClientSide;
import won.node.service.DataAccessService;
import won.protocol.jms.MessagingService;
import won.protocol.message.WonMessage;
import won.protocol.message.processor.camel.WonCamelConstants;
import won.protocol.model.Need;
import won.protocol.model.OwnerApplication;
import won.protocol.repository.*;
import won.protocol.service.LinkedDataService;
import won.protocol.service.WonNodeInformationService;
import won.protocol.util.RdfUtils;
import won.protocol.util.linkeddata.LinkedDataSource;
import java.net.URI;
import java.util.*;
import java.util.concurrent.ExecutorService;
/**
* User: syim
* Date: 02.03.2015
*/
public abstract class AbstractCamelProcessor implements Processor
{
protected Logger logger = org.slf4j.LoggerFactory.getLogger(this.getClass());
@Autowired
protected MessagingService messagingService;
@Autowired
protected DataAccessService dataService;
@Autowired
protected DatasetHolderRepository datasetHolderRepository;
@Autowired
protected NeedRepository needRepository;
@Autowired
protected ConnectionContainerRepository connectionContainerRepository;
@Autowired
protected NeedEventContainerRepository needEventContainerRepository;
@Autowired
protected ConnectionRepository connectionRepository;
@Autowired
protected ConnectionEventContainerRepository connectionEventContainerRepository;
@Autowired
protected FacetRepository facetRepository;
@Autowired
protected OwnerApplicationRepository ownerApplicationRepository;
@Autowired
protected MessageEventRepository messageEventRepository;
@Autowired
protected LinkedDataService linkedDataService;
@Autowired
protected WonNodeInformationService wonNodeInformationService;
@Autowired
protected LinkedDataSource linkedDataSource;
@Autowired
protected MatcherProtocolMatcherServiceClientSide matcherProtocolMatcherClient;
@Autowired
protected RandomNumberService randomNumberService;
@Autowired
protected ExecutorService executorService;
protected void sendMessageToOwner(WonMessage message, URI needURI, String fallbackOwnerApplicationId){
Need need = needRepository.findOneByNeedURI(needURI);
List<OwnerApplication> ownerApplications = need != null ? need.getAuthorizedApplications() : Collections.EMPTY_LIST;
List<String> ownerApplicationIds = toStringIds(ownerApplications);
//if no owner application ids are authorized, we use the fallback specified (if any)
if (ownerApplicationIds.isEmpty() && fallbackOwnerApplicationId != null) {
ownerApplicationIds.add(fallbackOwnerApplicationId);
}
Map headerMap = new HashMap<String, Object>();
headerMap.put(WonCamelConstants.OWNER_APPLICATIONS, ownerApplicationIds);
messagingService.sendInOnlyMessage(null, headerMap, RdfUtils.writeDatasetToString(message.getCompleteDataset(),
WonCamelConstants.RDF_LANGUAGE_FOR_MESSAGE),
"seda:OwnerProtocolOut");
}
protected void sendMessageToOwner(WonMessage message, List<String> ownerApplicationIds){
Map headerMap = new HashMap<String, Object>();
headerMap.put("protocol","OwnerProtocol");
headerMap.put(WonCamelConstants.OWNER_APPLICATIONS, ownerApplicationIds);
messagingService.sendInOnlyMessage(null, headerMap, RdfUtils.writeDatasetToString(message.getCompleteDataset(),
WonCamelConstants.RDF_LANGUAGE_FOR_MESSAGE),
"seda:OwnerProtocolOut");
}
protected void sendMessageToOwner(WonMessage message, String... ownerApplicationIds){
Map headerMap = new HashMap<String, Object>();
headerMap.put(WonCamelConstants.OWNER_APPLICATIONS, Arrays.asList(ownerApplicationIds));
messagingService.sendInOnlyMessage(null, headerMap, RdfUtils.writeDatasetToString(message.getCompleteDataset(),WonCamelConstants.RDF_LANGUAGE_FOR_MESSAGE),
"seda:OwnerProtocolOut");
}
protected void sendMessageToNode(WonMessage message){
Map headerMap = new HashMap<String, Object>();
headerMap.put(WonCamelConstants.MESSAGE_HEADER, message);
messagingService.sendInOnlyMessage(null, headerMap, null,
"seda:NeedProtocolOut");
}
/**
* Processes the system message (allowing facet implementations) and delivers it, depending on its receiver settings.
*
* @param message
*/
protected void sendSystemMessage(WonMessage message){
Map headerMap = new HashMap<String, Object>();
headerMap.put(WonCamelConstants.MESSAGE_HEADER, message);
messagingService.sendInOnlyMessage(null, headerMap, null,
"seda:SystemMessageIn");
}
/**
* Sends a system message to the owner without facet processing. Useful for Response messages.
* @param message
*/
protected void sendSystemMessageToOwner(WonMessage message) {
sendSystemMessageToOwner(message, null);
}
/**
* Sends a system message to the owner without facet processing. Useful for Response messages.
*
* Allows for adding the ownerApplicationId to the exchange used during creation and
* sending of the system message. This is useful for cases in which the owner application
* cannot determined otherwise, which can happen when need creation fails.
*
* If that value is non-null, it is set as the 'ownerApplicationId' header, which is used in
* AbstractCamelProcessor#sendMessageToOwner(..) as a fallback to determine the recipients of
* the message to be sent.
*
* @param message
* @param ownerApplicationId
*/
protected void sendSystemMessageToOwner(WonMessage message, String ownerApplicationId){
Map headerMap = new HashMap<String, Object>();
headerMap.put(WonCamelConstants.MESSAGE_HEADER, message);
if (ownerApplicationId != null){
headerMap.put(WonCamelConstants.OWNER_APPLICATION_ID, ownerApplicationId);
}
messagingService.sendInOnlyMessage(null, headerMap, null,
"seda:SystemMessageToOwner");
}
protected List<String> toStringIds(final List<OwnerApplication> ownerApplications) {
List<String> ownerApplicationIds = new ArrayList<String>(ownerApplications.size());
for(OwnerApplication app: ownerApplications){
ownerApplicationIds.add(app.getOwnerApplicationId());
}
return ownerApplicationIds;
}
}