public CreateSequenceResponseType createSequence(RMDestination destination,
CreateSequenceType cs,
AddressingProperties maps)
throws SequenceFault {
CreateSequenceResponseType csr = RMUtils.getWSRMFactory().createCreateSequenceResponseType();
csr.setIdentifier(destination.generateSequenceIdentifier());
DestinationPolicyType dp = destination.getDestinationPolicies();
Duration supportedDuration = dp.getSequenceExpiration();
if (null == supportedDuration) {
supportedDuration = SourceSequence.PT0S;
}
Expires ex = cs.getExpires();
LOG.info("supported duration: " + supportedDuration);
if (null != ex || supportedDuration.isShorterThan(SourceSequence.PT0S)) {
Duration effectiveDuration = supportedDuration;
if (null != ex && supportedDuration.isLongerThan(ex.getValue())) {
effectiveDuration = supportedDuration;
}
ex = RMUtils.getWSRMFactory().createExpires();
ex.setValue(effectiveDuration);
csr.setExpires(ex);
}
OfferType offer = cs.getOffer();
if (null != offer) {
AcceptType accept = RMUtils.getWSRMFactory().createAcceptType();
if (dp.isAcceptOffers()) {
RMSource source = destination.getHandler().getSource();
LOG.fine("Accepting inbound sequence offer");
AttributedURI to = VersionTransformer.convert(maps.getTo());
accept.setAcksTo(RMUtils.createReference(to.getValue()));
SourceSequence seq = new SourceSequence(offer.getIdentifier(),
null,
csr.getIdentifier());
seq.setExpires(offer.getExpires());
seq.setTarget(VersionTransformer.convert(cs.getAcksTo()));
source.addSequence(seq);
source.setCurrent(csr.getIdentifier(), seq);
LOG.fine("Making offered sequence the current sequence for responses to "
+ csr.getIdentifier().getValue());
} else {
LOG.fine("Refusing inbound sequence offer");
accept.setAcksTo(RMUtils.createReference(Names.WSA_NONE_ADDRESS));
}
csr.setAccept(accept);
}
DestinationSequence seq = new DestinationSequence(csr.getIdentifier(), cs.getAcksTo(), destination);
seq.setCorrelationID(maps.getMessageID().getValue());
destination.addSequence(seq);
return csr;
}