@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; }
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(); } } }