Пример #1
0
 @Override
 public File getRemoteFile(String dir, String simpleName, Locale locale, boolean checkCache)
     throws ProcessingException {
   RemoteFile spec = null;
   File f = null;
   if (locale != null && simpleName != null && simpleName.lastIndexOf(".") != -1) {
     String filename = simpleName;
     String language = locale.toString().replaceAll("__", "_");
     String prefix = filename.substring(0, filename.lastIndexOf(".")) + "_";
     String suffix = filename.substring(filename.lastIndexOf("."));
     filename = prefix + language + suffix;
     File test = getFileLocation(dir, filename, false);
     while (!test.exists()) {
       if (language.indexOf("_") == -1) {
         filename = simpleName;
         break;
       }
       language = language.substring(0, language.lastIndexOf("_"));
       filename = prefix + language + suffix;
       test = getFileLocation(dir, filename, false);
     }
     f = getFileLocation(dir, filename, false);
     spec = new RemoteFile(dir, filename, locale, 0L);
   } else {
     f = getFileLocation(dir, simpleName, false);
     spec = new RemoteFile(dir, simpleName, locale, 0L);
   }
   if (f.exists()) {
     spec.setLastModified(f.lastModified());
   }
   //
   if (checkCache && OfflineState.isOnlineInCurrentThread()) {
     IRemoteFileService svc = SERVICES.getService(IRemoteFileService.class);
     spec = svc.getRemoteFile(spec);
     try {
       if (spec.getName() != null && !spec.getName().equalsIgnoreCase(f.getName())) {
         if (locale != null && f.getName().length() > spec.getName().length()) {
           // if local file has longer name (including locale), this means that
           // this file was deleted on the server
           f.delete();
         }
         f = getFileLocation(spec.getDirectory(), spec.getName(), false);
       }
       if (spec.exists() && spec.hasContent()) {
         spec.writeData(new FileOutputStream(f));
         f.setLastModified(spec.getLastModified());
       } else if (!spec.exists()) {
         f.delete();
       }
     } catch (IOException e) {
       throw new ProcessingException("error writing remote file in local store", e);
     }
   }
   return f;
 }
Пример #2
0
 private void syncRemoteFilesInternal(
     String serverFolderPath, FilenameFilter filter, boolean useServerFolderStructureOnClient)
     throws ProcessingException {
   IRemoteFileService svc = SERVICES.getService(IRemoteFileService.class);
   String[][] realFiles = getFiles(serverFolderPath, filter, useServerFolderStructureOnClient);
   RemoteFile[] existingFileInfoOnClient = new RemoteFile[realFiles.length];
   for (int i = 0; i < realFiles.length; i++) {
     RemoteFile rf = new RemoteFile(realFiles[i][0], realFiles[i][1], 0);
     String dir = m_rootPath == null ? realFiles[i][0] : "";
     File f = getFileLocation(dir, realFiles[i][1], false);
     if (f.exists()) {
       rf.setLastModified(f.lastModified());
     }
     existingFileInfoOnClient[i] = rf;
   }
   existingFileInfoOnClient =
       svc.getRemoteFiles(serverFolderPath, filter, existingFileInfoOnClient);
   for (RemoteFile spec : existingFileInfoOnClient) {
     String fileDirectory = useServerFolderStructureOnClient ? spec.getDirectory() : null;
     File f = getFileLocation(fileDirectory, spec.getName(), false);
     if (spec.exists() && spec.hasContent()) {
       try {
         if (spec.hasMoreParts()) {
           // file is splitted - get all parts
           int counter = 0;
           long fileDate = spec.getLastModified();
           File part = getFileLocation(fileDirectory, spec.getName() + "." + counter, false);
           spec.writeData(new FileOutputStream(part));
           part.setLastModified(fileDate);
           RemoteFile specPart = spec;
           while (specPart.hasMoreParts()) {
             counter++;
             part = getFileLocation(fileDirectory, spec.getName() + "." + counter, false);
             if (!part.exists() || fileDate != part.lastModified()) {
               specPart = svc.getRemoteFilePart(spec, counter);
               specPart.writeData(new FileOutputStream(part));
               part.setLastModified(fileDate);
             } else {
               // resuming canceled part: nothing to do
             }
           }
           // put together
           counter = 0;
           f = getFileLocation(fileDirectory, spec.getName(), false);
           OutputStream out = new FileOutputStream(f);
           part = getFileLocation(fileDirectory, spec.getName() + "." + counter, false);
           while (part.exists()) {
             InputStream in = new FileInputStream(part);
             byte[] buf = new byte[102400];
             int len;
             while ((len = in.read(buf)) > 0) {
               out.write(buf, 0, len);
             }
             out.flush();
             in.close();
             part.delete();
             counter++;
             part = getFileLocation(fileDirectory, spec.getName() + "." + counter, false);
           }
           out.close();
           f.setLastModified(fileDate);
         } else {
           // normal files
           spec.writeData(new FileOutputStream(f));
           f.setLastModified(spec.getLastModified());
         }
       } catch (IOException e) {
         throw new ProcessingException("error writing remote file in local store", e);
       }
     } else if (!spec.exists()) {
       f.delete();
     }
   }
 }