package com.thinkbiganalytics.feedmgr.rest.model; /*- * #%L * thinkbig-feed-manager-rest-model * %% * Copyright (C) 2017 ThinkBig Analytics * %% * 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. * #L% */ import org.joda.time.DateTime; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class UploadProgress { private boolean complete; private String key; private Integer totalParts = 0; private Set<String> sections = new HashSet<>(); private Set<String> completedSections = new HashSet<>(); private Integer percentComplete = 0; private DateTime lastSectionCompleteTime; private List<UploadProgressMessage> messages; public UploadProgress() { this.completedSections = new HashSet<>(); } public UploadProgress(String key) { this(); this.key = key; } public UploadProgress(String key, Set<String> sections) { this.key = key; this.sections = sections; this.totalParts = sections.size(); } public boolean isComplete() { return complete; } public void setComplete(boolean complete) { this.complete = complete; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } public List<UploadProgressMessage> getMessages() { if(messages == null){ messages = new ArrayList<>(); } return messages; } public UploadProgressMessage getMessage(String messageKey) { return getMessages().stream().filter(uploadProgressMessage -> uploadProgressMessage.getMessageKey().equalsIgnoreCase(messageKey)).findFirst().orElse(null); } public void setMessages(List<UploadProgressMessage> messages) { this.messages = messages; } public Integer getTotalParts() { return totalParts; } public void setTotalParts(Integer totalParts) { this.totalParts = totalParts; } private Integer percent(Integer completedSections){ return Math.round(((float)completedSections / getTotalParts()) *100); } public void calculatePercentComplete(){ if(getTotalParts() >0) { Integer percent =percent(getCompletedSections().size()); if(percent > percentComplete){ percentComplete = percent; } } else { percentComplete = 0; } } /** * * @return time in millis since the last time the percentage was increased */ public Long timeSinceLastSectionComplete(){ if(lastSectionCompleteTime != null) { return DateTime.now().getMillis() - lastSectionCompleteTime.getMillis(); } return 0L; } /** * Complete a section. * @param section */ public void completeSection(String section){ completedSections.add(section); lastSectionCompleteTime = DateTime.now(); calculatePercentComplete(); } private Set<String> getCompletedSections(){ return completedSections; } public void setSections(Set<String> sections) { this.sections = sections; this.totalParts = sections.size(); } public Integer getPercentComplete() { return percentComplete; } public void setPercentComplete(Integer percentComplete) { this.percentComplete = percentComplete; } /** * update the percent complete for longer processing sections to simulate a more unified progress bar */ public void checkAndIncrementPercentage(){ Long timeSince = timeSinceLastSectionComplete(); int maxThreshold = 97; int incrementAmount = 1; if(timeSince > 500){ Integer currentPercentage = getPercentComplete(); Integer nextPercentage = percent(getCompletedSections().size() +1); if(currentPercentage !=0 && currentPercentage< nextPercentage && currentPercentage < maxThreshold){ //slow down the increment if we are close to the end setPercentComplete(currentPercentage+incrementAmount); } } } }