public boolean handleErrors() throws PluginException {
   if (externalDownloadStop()) {
     return false;
   }
   if (getFileSize() > 0 && totalLinkBytesLoaded != getFileSize()) {
     if (totalLinkBytesLoaded > getFileSize()) {
       /*
        * workaround for old bug deep in this downloadsystem. more data got loaded (maybe just counting bug) than filesize. but in
        * most cases the file is okay! WONTFIX because new downloadsystem is on its way
        */
       logger.severe("Filesize: " + getFileSize() + " Loaded: " + totalLinkBytesLoaded);
       if (caughtPluginException == null) {
         downloadable.setLinkStatus(LinkStatus.FINISHED);
       }
       return true;
     }
     logger.severe("Filesize: " + getFileSize() + " Loaded: " + totalLinkBytesLoaded);
     logger.severe("DOWNLOAD INCOMPLETE DUE TO FILESIZECHECK");
     if (caughtPluginException != null) {
       throw caughtPluginException;
     }
     throw new PluginException(
         LinkStatus.ERROR_DOWNLOAD_INCOMPLETE, _JDT.T.download_error_message_incomplete());
   }
   if (caughtPluginException == null) {
     downloadable.setLinkStatus(LinkStatus.FINISHED);
     downloadable.setVerifiedFileSize(outputCompleteFile.length());
     return true;
   } else {
     throw caughtPluginException;
   }
 }
 private void finalizeDownload(final File outputPartFile, final File outputCompleteFile)
     throws Exception {
   if (downloadable.rename(outputPartFile, outputCompleteFile)) {
     try {
         /* set current timestamp as lastModified timestamp */
       outputCompleteFile.setLastModified(System.currentTimeMillis());
     } catch (final Throwable ignore) {
       LogSource.exception(logger, ignore);
     }
   } else {
     throw new PluginException(
         LinkStatus.ERROR_DOWNLOAD_FAILED,
         _JDT.T.system_download_errors_couldnotrename(),
         LinkStatus.VALUE_LOCAL_IO_ERROR);
   }
 }
public enum VariousCrawledLinkFlags implements MatchesInterface<CrawledLink> {
  DOWNLOAD_LIST_DUPE(_JDT.T.DOWNLOAD_LIST_DUPE()) {
    public boolean matches(CrawledLink link) {
      return link != null && DownloadController.getInstance().hasDownloadLinkByID(link.getLinkID());
    }
  };

  private final String translation;

  private VariousCrawledLinkFlags(String translation) {
    this.translation = translation;
  }

  public String getTranslation() {
    return translation;
  }
}
 public String getNewPackageName(String nameFactory, String oldPackageName, String host) {
   if (StringUtils.isEmpty(nameFactory)) {
     if (!StringUtils.isEmpty(oldPackageName)) {
       return oldPackageName;
     }
     return host;
   }
   if (!StringUtils.isEmpty(oldPackageName)) {
     nameFactory = nameFactory.replaceAll("\\{PACKAGENAME\\}", oldPackageName);
   } else {
     nameFactory =
         nameFactory.replaceAll(
             "\\{PACKAGENAME\\}", _JDT.T.LinkCollector_addCrawledLink_variouspackage());
   }
   nameFactory = nameFactory.replaceAll("\\{HOSTNAME\\}", host);
   return nameFactory;
 }
  public LinkgrabberFilterRule duplicate() {
    LinkgrabberFilterRule ret = new LinkgrabberFilterRule();
    ret.accept = accept;
    ret.setEnabled(isEnabled());
    ret.setIconKey(getIconKey());
    ret.setFilenameFilter(getFilenameFilter());
    ret.setPackagenameFilter(getPackagenameFilter());
    ret.setFilesizeFilter(getFilesizeFilter());
    ret.setMatchAlwaysFilter(getMatchAlwaysFilter());
    ret.setFiletypeFilter(getFiletypeFilter());
    ret.setOnlineStatusFilter(getOnlineStatusFilter());
    ret.setOriginFilter(getOriginFilter());
    ret.setConditionFilter(getConditionFilter());
    ret.setPluginStatusFilter(getPluginStatusFilter());
    ret.setHosterURLFilter(getHosterURLFilter());
    ret.setName(_JDT.T.LinkgrabberFilterRule_duplicate(getName()));
    ret.setSourceURLFilter(getSourceURLFilter());

    return ret;
  }
  @Override
  protected void setStringValue(final String value, final AbstractNode object) {
    if (StringUtils.isEmpty(value) || object == null) {
      return;
    }
    File oldPath = LinkTreeUtils.getDownloadDirectory(object);
    File newPath = LinkTreeUtils.getDownloadDirectory(value, null, object);
    if (oldPath.equals(newPath)) {
      /* both paths are same, so nothing to do */
      return;
    }
    if (object instanceof CrawledPackage) {
      LinkCollector.getInstance()
          .getQueue()
          .add(
              new QueueAction<Object, RuntimeException>(
                  org.appwork.utils.event.queue.Queue.QueuePriority.HIGH) {
                @Override
                protected Object run() {
                  ((CrawledPackage) object).setDownloadFolder(value);
                  return null;
                }
              });
      return;
    } else if (object instanceof CrawledLink) {
      final CrawledPackage p = ((CrawledLink) object).getParentNode();
      try {
        Dialog.getInstance()
            .showConfirmDialog(
                Dialog.LOGIC_DONOTSHOW_BASED_ON_TITLE_ONLY | Dialog.STYLE_SHOW_DO_NOT_DISPLAY_AGAIN,
                _JDT.T.SetDownloadFolderAction_actionPerformed_(p.getName()),
                _JDT.T.SetDownloadFolderAction_msg(p.getName(), 1),
                null,
                _JDT.T.SetDownloadFolderAction_yes(),
                _JDT.T.SetDownloadFolderAction_no());
        LinkCollector.getInstance()
            .getQueue()
            .add(
                new QueueAction<Object, RuntimeException>(
                    org.appwork.utils.event.queue.Queue.QueuePriority.HIGH) {
                  @Override
                  protected Object run() {
                    p.setDownloadFolder(value);
                    return null;
                  }
                });
        return;
      } catch (DialogClosedException e) {
        return;
      } catch (DialogCanceledException e) {
        /* user clicked no */
      }

      final CrawledPackage pkg = new CrawledPackage();
      pkg.setExpanded(CFG_LINKCOLLECTOR.CFG.isPackageAutoExpanded());
      if (TYPE.NORMAL != p.getType()) {
        final String pkgName;
        if (object instanceof AbstractPackageNode) {
          pkgName =
              LinknameCleaner.cleanFileName(
                  object.getName(),
                  false,
                  true,
                  LinknameCleaner.EXTENSION_SETTINGS.REMOVE_KNOWN,
                  true);
        } else {
          pkgName =
              LinknameCleaner.cleanFileName(
                  object.getName(),
                  false,
                  true,
                  LinknameCleaner.EXTENSION_SETTINGS.REMOVE_ALL,
                  true);
        }
        pkg.setName(pkgName);
      } else {
        pkg.setName(p.getName());
      }
      pkg.setComment(p.getComment());
      pkg.setDownloadFolder(value);

      final java.util.List<CrawledLink> links = new ArrayList<CrawledLink>();
      links.add((CrawledLink) object);
      LinkCollector.getInstance()
          .getQueue()
          .add(
              new QueueAction<Object, RuntimeException>(
                  org.appwork.utils.event.queue.Queue.QueuePriority.HIGH) {

                @Override
                protected Object run() {
                  LinkCollector.getInstance().moveOrAddAt(pkg, links, -1);
                  return null;
                }
              });
    }
  }
 @Override
 public String toString() {
   return _JDT.T.ConnectExceptionInPluginBan(
       getProtocol() + "://" + getHost().concat(":").concat(Integer.toString(getPort())));
 }
 public static boolean addAccount(final Account ac) throws DialogNoAnswerException {
   try {
     checkAccount(ac);
   } catch (DialogNoAnswerException e) {
     throw e;
   } catch (Throwable e) {
     Dialog.getInstance()
         .showExceptionDialog(
             _GUI.T.accountdialog_check_failed(), _GUI.T.accountdialog_check_failed_msg(), e);
   }
   AccountError error = ac.getError();
   String errorMessage = ac.getErrorString();
   if (StringUtils.isEmpty(errorMessage)) {
     AccountInfo ai = ac.getAccountInfo();
     if (ai != null) {
       errorMessage = ai.getStatus();
     }
   }
   if (error != null) {
     switch (error) {
       case PLUGIN_ERROR:
         if (StringUtils.isEmpty(errorMessage)) {
           errorMessage = _JDT.T.AccountController_updateAccountInfo_status_plugin_defect();
         }
         Dialog.getInstance().showMessageDialog(_GUI.T.accountdialog_check_invalid(errorMessage));
         return false;
       case EXPIRED:
         Dialog.getInstance()
             .showConfirmDialog(
                 0,
                 _GUI.T.accountdialog_check_expired_title(),
                 _GUI.T.accountdialog_check_expired(ac.getUser()),
                 null,
                 _GUI.T.accountdialog_check_expired_renew(),
                 null);
         AccountController.getInstance().addAccount(ac, false);
         return true;
       case TEMP_DISABLED:
         if (StringUtils.isEmpty(errorMessage)) {
           errorMessage = _GUI.T.accountdialog_check_failed();
         }
         Dialog.getInstance().showMessageDialog(_GUI.T.accountdialog_check_result(errorMessage));
         AccountController.getInstance().addAccount(ac, false);
         return true;
       default:
       case INVALID:
         if (StringUtils.isEmpty(errorMessage)) {
           errorMessage = _GUI.T.accountdialog_check_failed_msg();
         }
         Dialog.getInstance().showMessageDialog(_GUI.T.accountdialog_check_invalid(errorMessage));
         return false;
     }
   } else {
     String message = null;
     AccountInfo ai = ac.getAccountInfo();
     if (ai != null) {
       message = ai.getStatus();
     }
     if (StringUtils.isEmpty(message)) {
       message = _GUI.T.lit_yes();
     }
     Dialog.getInstance().showMessageDialog(_GUI.T.accountdialog_check_valid(message));
     AccountController.getInstance().addAccount(ac, false);
     return true;
   }
 }
 public static String getTranslationForLocation() {
   return _JDT.T.SplitPackagesByHost_getTranslationForLocation();
 }
 public static String getTranslationForAskForNewDownloadFolderAndPackageName() {
   return _JDT.T.SplitPackagesByHost_getTranslationForAskForNewDownloadFolderAndPackageName();
 }
  @Override
  public boolean startDownload() throws Exception {
    try {
      downloadable.setConnectionHandler(this.getManagedConnetionHandler());
      final DiskSpaceReservation reservation = downloadable.createDiskSpaceReservation();
      DownloadPluginProgress downloadPluginProgress = null;
      try {
        if (!downloadable.checkIfWeCanWrite(
            new ExceptionRunnable() {

              @Override
              public void run() throws Exception {
                downloadable.checkAndReserve(reservation);
                createOutputFiles();
                try {
                  downloadable.lockFiles(
                      outputCompleteFile, outputFinalCompleteFile, outputPartFile);
                } catch (FileIsLockedException e) {
                  downloadable.unlockFiles(
                      outputCompleteFile, outputFinalCompleteFile, outputPartFile);
                  throw new PluginException(LinkStatus.ERROR_ALREADYEXISTS);
                }
              }
            },
            null)) {
          throw new SkipReasonException(SkipReason.INVALID_DESTINATION);
        }
        startTimeStamp = System.currentTimeMillis();
        downloadPluginProgress =
            new DownloadPluginProgress(downloadable, this, Color.GREEN.darker());
        downloadable.addPluginProgress(downloadPluginProgress);
        downloadable.setAvailable(AvailableStatus.TRUE);
        download(filePath, downloadable.isResumable());
      } finally {
        try {
          downloadable.free(reservation);
        } catch (final Throwable e) {
          LogSource.exception(logger, e);
        }
        try {
          downloadable.addDownloadTime(System.currentTimeMillis() - getStartTimeStamp());
        } catch (final Throwable e) {
        }
        downloadable.removePluginProgress(downloadPluginProgress);
      }
      if (isDownloadComplete()) {
        logger.info("Download is complete");
        final HashResult hashResult = getHashResult(downloadable, outputPartFile);
        if (hashResult != null) {
          logger.info(hashResult.toString());
          downloadable.setHashResult(hashResult);
        }
        if (hashResult == null || hashResult.match()) {
          downloadable.setVerifiedFileSize(outputPartFile.length());
        } else {
          if (hashResult.getHashInfo().isTrustworthy()) {
            throw new PluginException(
                LinkStatus.ERROR_DOWNLOAD_FAILED,
                _JDT.T.system_download_doCRC2_failed(hashResult.getHashInfo().getType()));
          }
        }
        finalizeDownload(outputPartFile, outputCompleteFile);
        downloadable.setLinkStatus(LinkStatus.FINISHED);
        return true;
      }
      if (externalDownloadStop() == false) {
        throw new PluginException(
            LinkStatus.ERROR_DOWNLOAD_INCOMPLETE, _JDT.T.download_error_message_incomplete());
      }
      return false;
    } finally {
      downloadable.unlockFiles(outputCompleteFile, outputFinalCompleteFile, outputPartFile);
      cleanupDownladInterface();
    }
  }
 protected void download(String filename, boolean resume)
     throws IOException, PluginException, SkipReasonException {
   final File file = outputPartFile;
   if (!simpleFTP.isBinary()) {
     logger.info("Warning: Download in ASCII mode may fail!");
   }
   final InetSocketAddress pasv = simpleFTP.pasv();
   resumed = false;
   if (resume) {
     final long resumePosition = file.length();
     if (resumePosition > 0) {
       resumed = true;
       totalLinkBytesLoadedLive.set(resumePosition);
       simpleFTP.sendLine("REST " + resumePosition);
       try {
         simpleFTP.readLines(new int[] {350}, "Resume not supported");
         downloadable.setResumeable(true);
       } catch (final IOException e) {
         cleanupDownladInterface();
         if (e.getMessage().contains("Resume not")) {
           file.delete();
           downloadable.setResumeable(false);
           throw new PluginException(LinkStatus.ERROR_RETRY);
         }
         throw e;
       }
     }
   }
   final RandomAccessFile raf;
   try {
     raf = IO.open(file, "rw");
   } catch (final IOException e) {
     throw new SkipReasonException(SkipReason.INVALID_DESTINATION, e);
   }
   Socket dataSocket = null;
   MeteredThrottledInputStream input = null;
   try {
     dataSocket =
         simpleFTP.createSocket(new InetSocketAddress(pasv.getHostName(), pasv.getPort()));
     dataSocket.setSoTimeout(30 * 1000);
     simpleFTP.sendLine("RETR " + filename);
     simpleFTP.readLines(new int[] {150, 125}, null);
     input =
         new MeteredThrottledInputStream(dataSocket.getInputStream(), new AverageSpeedMeter(10));
     connectionHandler.addThrottledConnection(input);
     if (resumed) {
       /* in case we do resume, reposition the writepointer */
       totalLinkBytesLoaded = file.length();
       raf.seek(totalLinkBytesLoaded);
     } else {
       totalLinkBytesLoaded = 0;
     }
     final byte[] buffer = new byte[32767];
     int bytesRead = 0;
     while ((bytesRead = input.read(buffer)) != -1) {
       if (abort.get()) {
         break;
       }
       if (bytesRead > 0) {
         raf.write(buffer, 0, bytesRead);
         totalLinkBytesLoaded += bytesRead;
         totalLinkBytesLoadedLive.addAndGet(bytesRead);
       }
     }
     /* max 10 seks wait for buggy servers */
     simpleFTP.getSocket().setSoTimeout(20 * 1000);
     simpleFTP.shutDownSocket(dataSocket);
     input.close();
     try {
       simpleFTP.readLine();
     } catch (SocketTimeoutException e) {
       LogSource.exception(logger, e);
     }
   } catch (SocketTimeoutException e) {
     LogSource.exception(logger, e);
     error(
         new PluginException(
             LinkStatus.ERROR_DOWNLOAD_INCOMPLETE,
             _JDT.T.download_error_message_networkreset(),
             LinkStatus.VALUE_NETWORK_IO_ERROR));
   } catch (SocketException e) {
     LogSource.exception(logger, e);
     error(
         new PluginException(
             LinkStatus.ERROR_TEMPORARILY_UNAVAILABLE,
             _JDT.T.download_error_message_networkreset(),
             1000l * 60 * 5));
   } catch (ConnectException e) {
     LogSource.exception(logger, e);
     error(
         new PluginException(
             LinkStatus.ERROR_TEMPORARILY_UNAVAILABLE,
             _JDT.T.download_error_message_networkreset(),
             1000l * 60 * 5));
   } finally {
     close(raf);
     close(input);
     close(dataSocket);
     cleanupDownladInterface();
     if (totalLinkBytesLoaded >= 0) {
       downloadable.setDownloadBytesLoaded(totalLinkBytesLoaded);
     }
   }
 }