All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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