/* * Copyright (C) 2014 Shashank Tulsyan * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package neembuu.release1.ui.actions; import neembuu.release1.api.ui.LinkGroupUICreator; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import neembuu.release1.api.IndefiniteTask; import neembuu.release1.api.RealFileProvider; import neembuu.release1.api.linkgroup.LinkGroup; import neembuu.release1.api.linkgroup.LinkGroupMakers; import neembuu.release1.api.linkhandler.TrialLinkHandler; import neembuu.release1.api.linkgroup.TrialLinkGroup; import neembuu.release1.api.linkgroup.LinkGrouperResults; import neembuu.release1.api.linkparser.LinkParserResult; import neembuu.release1.api.settings.Settings; import neembuu.release1.api.ui.AddLinkUI; import neembuu.release1.api.ui.IndefiniteTaskUI; import neembuu.release1.api.ui.ExpandableUIContainer; import neembuu.release1.api.ui.MainComponent; import neembuu.release1.api.ui.linkpanel.OpenableEUI; import neembuu.release1.api.ui.access.MinimalistFileSystem; import neembuu.release1.defaultImpl.linkgroup.LinkGrouperImpl; import neembuu.release1.defaultImpl.LinkParserImpl; import neembuu.release1.ui.linkcontainer.LinksContainer; import neembuu.release1.ui.linkpanel.Link_UI_Factory; import neembuu.vfs.progresscontrol.DownloadSpeedProvider; /** * * @author Shashank Tulsyan */ public class AddLinkAction implements Runnable, LinkGroupUICreator { private final IndefiniteTaskUI indefiniteTaskUI; private final ExpandableUIContainer luic1; private final MainComponent mainComponent; private RealFileProvider realFileProvider; private MinimalistFileSystem minimalistFileSystem; private final AddLinkUI addLinkUI; private final Settings settings; public AddLinkAction(IndefiniteTaskUI indefiniteTaskUI, ExpandableUIContainer luic1, MainComponent mainComponent, AddLinkUI addLinkUI,Settings settings) { this.addLinkUI = addLinkUI; this.settings = settings; this.indefiniteTaskUI = indefiniteTaskUI; this.luic1 = luic1; this.mainComponent = mainComponent; } public void initialize(RealFileProvider realFileProvider, MinimalistFileSystem minimalistFileSystem){ this.realFileProvider = realFileProvider; this.minimalistFileSystem = minimalistFileSystem; } boolean open = false; public void open(boolean open){ this.open = open; } @Override public void run() { final String linkParagraph = addLinkUI.getLinksText(); addLinkUI.setLinksText(null);//links would be re-entered in a short while // if there are any failures. But before reshowing the UI // old links must be removed, to prevent the operation being repeated // if user pressed (+) twice addLinkUI.addLinksPanelEnable(true); LinkParserImpl linkParserImpl = new LinkParserImpl(indefiniteTaskUI); LinkParserResult linkParserResult = linkParserImpl.process(linkParagraph); LinkGrouperResults grouperResults = null; if(!linkParserResult.results().isEmpty()){ IndefiniteTask makingFiles = indefiniteTaskUI.showIndefiniteProgress("Making files"); grouperResults = groupLinks(linkParserResult); makingFiles.done(); List<LinkGroup> sessions = saveLinks(grouperResults,linkParserResult); printState(grouperResults); createUIFor(sessions,this.open); } } private void residualLinks(LinkGrouperResults results, LinkParserResult linkParserResult, List<TrialLinkGroup> failedSessionInit){ addLinkUI.setLinksText(makeResidualParagraph(results,linkParserResult,failedSessionInit)); if(addLinkUI.getLinksText()!=null && addLinkUI.getLinksText().length()>0){ addLinkUI.addLinkProgressSet("There are links which could not be added due to some error"); }else{ addLinkUI.addLinksPanelShow(false); addLinkUI.addLinkProgressSet(""); } } private LinkGrouperResults groupLinks(LinkParserResult linkParserResult){ LinkGrouperImpl linkGrouper = new LinkGrouperImpl(); LinkGrouperResults results = linkGrouper.group(linkParserResult); return results; } private List<LinkGroup> saveLinks(LinkGrouperResults results,LinkParserResult linkParserResult){ List<LinkGroup> lgs = new ArrayList<>(); List<TrialLinkGroup> failed = new ArrayList<>(); for (TrialLinkGroup tlg : results.complete_linkPackages()) { try{ LinkGroup lg = LinkGroupMakers.make(tlg); if(lg==null){throw new NullPointerException();} lgs.add(lg); }catch(Exception a){ a.printStackTrace(); failed.add(tlg); } } residualLinks(results,linkParserResult,failed); return lgs; } private void printState(LinkGrouperResults results){ System.out.println("+++Saving feature yet to be implemented+++"); System.out.println("+++done+++"); for(TrialLinkGroup lg : results.complete_linkPackages()){ System.out.println(lg); } System.out.println("+++incomplete+++"); for(TrialLinkGroup lg : results.incomplete_linkPackages()){ System.out.println(lg); } System.out.println("+++unhandlable+++"); for(TrialLinkHandler trialLinkHandler : results.unhandleAbleLinks()){ System.out.println("Could not handle the link -> "+trialLinkHandler); } } @Override //@ThreadSafe public void createUIFor(List<LinkGroup> sessions,boolean shouldOpen){ for(LinkGroup linkGroup : sessions){ OpenableEUI openableEUI = Link_UI_Factory.make( luic1, mainComponent, realFileProvider, minimalistFileSystem,linkGroup,new DownloadSpeedProvider(){ @Override public double getDownloadSpeed_KiBps(){return 56;}}, this,settings,indefiniteTaskUI); if(openableEUI==null){return;} ((LinksContainer)luic1).addUI(openableEUI, 0); if(shouldOpen){ openableEUI.open(); } } } private String makeResidualParagraph(LinkGrouperResults grouperResults, LinkParserResult parserResult,List<TrialLinkGroup> failedSessionInit){ List<String> links = new LinkedList<String>(); for(String line : parserResult.getFailedLines() ){ links.add(line); } for(TrialLinkHandler tlh : parserResult.getFailedLinks()){ links.add(tlh.getReferenceLinkString()); } for (TrialLinkHandler tlh : grouperResults.unhandleAbleLinks()) { links.add(tlh.getReferenceLinkString()); } for(TrialLinkGroup lg: grouperResults.incomplete_linkPackages()){ for (TrialLinkHandler tlh : lg.getFailedLinks()) { links.add(tlh.getReferenceLinkString()); } } for (TrialLinkGroup lg: failedSessionInit) { for (TrialLinkHandler tlh : lg.getAbsorbedLinks()) { links.add(tlh.getReferenceLinkString()); } } links = removeDuplicatesFromResidualPara(links); String c = ""; int cnt=0; for(String l : links){ if(cnt==0){ c=l; }else { c+="\n"+l; }cnt++; } return c; } private List<String> removeDuplicatesFromResidualPara(List<String> links){ List<String> links_non_dup = new LinkedList<>(); for (String link : links) { boolean found = false; for (String link_non_dup : links_non_dup) { if(link_non_dup.trim().equals(link.trim())){ found = true; } } if(!found){ links_non_dup.add(link); } } return links_non_dup; } }