public EnumeratorResponse start(String channelName, EnumeratorType enumType, Date startDate, Date endDate,
Long timeout, String enumName, HashMap<String, String> queryArgs) throws ObjectEnumeratorException, ScspExecutionException {
// Throw exception if Object Enumerator session already started
if (this.enumUuid != null){
throw new ObjectEnumeratorException("Enumerator session already in progress");
}
if (this.startScspQueryArgs == null) {
this.startScspQueryArgs = new ScspQueryArgs();
}
if (channelName == null) {
if (this.channelName == null) {
throw new ObjectEnumeratorException("Channel name cannot be null");
}
}
else {
this.channelName = channelName;
}
// The Publisher defaults to type METADATA
if (enumType == null) {
if (! startScspQueryArgs.containsName(EnumeratorQueryArgs.TYPE.getName())){
this.enumType = EnumeratorType.ENUM_TYPE_METADATA;
startScspQueryArgs.setValue(EnumeratorQueryArgs.TYPE.getName(), this.enumType.getName());
}
}
else {
this.enumType = enumType;
if (startScspQueryArgs.containsName(EnumeratorQueryArgs.TYPE.getName())){
startScspQueryArgs.remove(EnumeratorQueryArgs.TYPE.getName());
}
startScspQueryArgs.setValue(EnumeratorQueryArgs.TYPE.getName(), this.enumType.getName());
}
if (startDate != null) {
if (this.enumType.equals(EnumeratorType.ENUM_TYPE_EVENT)) {
throw new ObjectEnumeratorException("Start and end dates cannot be used with Event type object enumerators");
}
else {
this.startDate= startDate;
if (startScspQueryArgs.containsName(EnumeratorQueryArgs.START_DATE.getName())){
startScspQueryArgs.remove(EnumeratorQueryArgs.START_DATE.getName());
}
startScspQueryArgs.setValue(EnumeratorQueryArgs.START_DATE.getName(), getDateAsISO8601(this.startDate));
}
}
if (endDate != null) {
if (this.enumType.equals(EnumeratorType.ENUM_TYPE_EVENT)) {
throw new ObjectEnumeratorException("Start and end dates cannot be used with Event type object enumerators");
}
else {
this.endDate = endDate;
if (startScspQueryArgs.containsName(EnumeratorQueryArgs.END_DATE.getName())){
startScspQueryArgs.remove(EnumeratorQueryArgs.END_DATE.getName());
}
startScspQueryArgs.setValue(EnumeratorQueryArgs.END_DATE.getName(), getDateAsISO8601(this.endDate));
}
}
if (timeout == null) {
if (! startScspQueryArgs.containsName(EnumeratorQueryArgs.TIMEOUT.getName())){
this.timeout = ObjectEnumerator.DEFAULT_TIMEOUT;
startScspQueryArgs.setValue(EnumeratorQueryArgs.TIMEOUT.getName(), this.timeout.toString());
}
}
else {
this.timeout = timeout;
if (startScspQueryArgs.containsName(EnumeratorQueryArgs.TIMEOUT.getName())){
startScspQueryArgs.remove(EnumeratorQueryArgs.TIMEOUT.getName());
}
startScspQueryArgs.setValue(EnumeratorQueryArgs.TIMEOUT.getName(), this.timeout.toString());
}
if (enumName != null) {
this.enumName = enumName;
if (startScspQueryArgs.containsName(EnumeratorQueryArgs.CONTEXT.getName())){
startScspQueryArgs.remove(EnumeratorQueryArgs.CONTEXT.getName());
}
startScspQueryArgs.setValue(EnumeratorQueryArgs.CONTEXT.getName(), this.enumName);
}
// If there are additional query arguments, add them at the end.
if (queryArgs != null && queryArgs.size() > 0){
// Validate additional query arguments
Set<Map.Entry<String, String>> mapSet = queryArgs.entrySet();
for (Iterator<Map.Entry<String, String>> mapSetIter = mapSet.iterator(); mapSetIter.hasNext();){
Map.Entry<String, String> mapEntry = mapSetIter.next();
if (! EnumeratorQueryArgs.isValidQueryArgForStart(mapEntry.getKey())){
throw new ObjectEnumeratorException("Invalid query argument passed to start: " + mapEntry.getKey());
}
}
startScspQueryArgs.addAll(queryArgs);
}