
syncloud.synchronization.nodes.FoldersSyncBundle Maven / Gradle / Ivy
The newest version!
package syncloud.synchronization.nodes;
import syncloud.core.CoreException;
import syncloud.dao.State;
import syncloud.core.log.Logger;
import syncloud.synchronization.FolderNode;
import syncloud.synchronization.FolderContent;
import syncloud.storage.IFolder;
import syncloud.storage.INode;
import syncloud.synchronization.ISyncRecord;
import syncloud.synchronization.ISynchronizer;
import java.util.ArrayList;
import java.util.List;
public class FoldersSyncBundle extends SyncBundle {
private static Logger logger = Logger.getLogger(FoldersSyncBundle.class);
public FoldersSyncBundle(ISynchronizer sync, List nodes) {
super(sync, nodes);
}
@Override
public void synchronize() {
super.synchronize();
synchronizeChildren();
}
public void synchronizeChildren() {
List folders = new ArrayList();
for(SyncNodeState syncNode: nodes) {
INode node = syncNode.getNode();
if (node != null) folders.add((IFolder)node);
}
try {
synchronize(folders);
} catch (CoreException e) {
logger.error("unable to synchronize children", e);
}
}
public void synchronize(List folders) throws CoreException {
List contents = getContents(folders);
List uniqueNames = getUniqueNames(contents);
for(String name: uniqueNames) {
List nodes = getNodesByName(contents, name);
List nodesInfos = new ArrayList();
for (FolderNode entry: nodes) {
SyncNode fileInfo;
String fullName = entry.folder.getKey().child(name).getNativePath();
fileInfo = new SyncNode(fullName, entry.folder, entry.node);
nodesInfos.add(fileInfo);
}
ISyncBundle syncBundle = SyncBundleFactory.create(sync, nodesInfos);
if (syncBundle != null) {
syncBundle.synchronize();
}
}
}
private List getContents(List folders) {
List contents = new ArrayList();
for(IFolder folder: folders) {
contents.add(new FolderContent(folder, folder.getContents()));
}
return contents;
}
private List getNodesByName(List contents, String name) {
List nodes = new ArrayList();
for (FolderContent entry: contents) {
INode node = find(entry.content, name);
nodes.add(new FolderNode(entry.folder, node));
}
return nodes;
}
public List getUniqueNames(List contents) {
List uniqueNames = new ArrayList();
for(FolderContent folderContents: contents) {
for(INode node: folderContents.content) {
if (!uniqueNames.contains(node.getName()))
uniqueNames.add(node.getName());
}
}
return uniqueNames;
}
private static T find(List items, String searchFor) {
for(T item: items) {
if (item.getName().equals(searchFor))
return item;
}
return null;
}
@Override
protected NodeState getState(SyncNode node) {
State state = sync.getRecord().get(node.getFullname());
if (node.getNode() == null) {
if (state != null)
return NodeState.DELETED;
else
return NodeState.NOTEXISTS;
} else if (state != null) {
return NodeState.UNCHANGED;
} else {
return NodeState.ADDED;
}
}
@Override
protected void putRecord(ISyncRecord records, INode node) {
records.set(new State(node.getKey().getNativePath(), null));
}
@Override
protected INode create(IFolder parent, INode from) throws CoreException {
IFolder newFolder = parent.createFolder(from.getName());
return newFolder;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy