Welcome to mirror list, hosted at ThFree Co, Russian Federation.

DataPropagationHelper.java « helpers « sync « persistence « deck « nextcloud « niedermann « it « java « main « src « app - github.com/stefan-niedermann/nextcloud-deck.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 782b6d951a2d90f9fade429534183e5f4ec0563b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package it.niedermann.nextcloud.deck.persistence.sync.helpers;

import it.niedermann.nextcloud.deck.api.IResponseCallback;
import it.niedermann.nextcloud.deck.model.Account;
import it.niedermann.nextcloud.deck.model.enums.DBStatus;
import it.niedermann.nextcloud.deck.model.interfaces.IRemoteEntity;
import it.niedermann.nextcloud.deck.persistence.sync.adapters.ServerAdapter;
import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.DataBaseAdapter;
import it.niedermann.nextcloud.deck.persistence.sync.helpers.providers.AbstractSyncDataProvider;

public class DataPropagationHelper {
    private ServerAdapter serverAdapter;
    private DataBaseAdapter dataBaseAdapter;

    public DataPropagationHelper(ServerAdapter serverAdapter, DataBaseAdapter dataBaseAdapter) {
        this.serverAdapter = serverAdapter;
        this.dataBaseAdapter = dataBaseAdapter;
    }


    public <T extends IRemoteEntity> void createEntity(final AbstractSyncDataProvider<T> provider, T entity, IResponseCallback<T> callback){
        createEntity(provider, entity, callback, null);
    }
    public <T extends IRemoteEntity> void createEntity(final AbstractSyncDataProvider<T> provider, T entity, IResponseCallback<T> callback, OnResponseAction<T> actionOnResponse){
        final long accountId = callback.getAccount().getId();
        entity.setStatus(DBStatus.LOCAL_EDITED.getId());
        long newID;
        try {
            newID = provider.createInDB(dataBaseAdapter, accountId, entity);
        } catch (Throwable t) {
            callback.onError(t);
            return;
        }
        entity.setLocalId(newID);
        boolean connected = serverAdapter.hasInternetConnection();
        if (connected) {
            try {
                provider.createOnServer(serverAdapter, dataBaseAdapter, accountId, new IResponseCallback<T>(new Account(accountId)) {
                    @Override
                    public void onResponse(T response) {
                        new Thread(() -> {
                            response.setAccountId(accountId);
                            response.setLocalId(newID);
                            if (actionOnResponse != null) {
                                actionOnResponse.onResponse(entity, response);
                            }
                            response.setStatus(DBStatus.UP_TO_DATE.getId());
                            provider.updateInDB(dataBaseAdapter, accountId, response, false);
                            callback.onResponse(response);
                        }).start();
                    }

                    @Override
                    public void onError(Throwable throwable) {
                        super.onError(throwable);
                        new Thread(() -> callback.onError(throwable, entity)).start();
                    }
                }, entity);
            } catch (Throwable t) {
                callback.onError(t, entity);
            }
        } else {
            callback.onResponse(entity);
        }
    }

    public <T extends IRemoteEntity> void updateEntity(final AbstractSyncDataProvider<T> provider, T entity, IResponseCallback<T> callback){
        final long accountId = callback.getAccount().getId();
        entity.setStatus(DBStatus.LOCAL_EDITED.getId());
        try {
            provider.updateInDB(dataBaseAdapter, accountId, entity);
        } catch (Throwable t) {
            callback.onError(t);
            return;
        }
        boolean connected = serverAdapter.hasInternetConnection();
        if (entity.getId() != null && connected) {
            try {
                provider.updateOnServer(serverAdapter, dataBaseAdapter, accountId, new IResponseCallback<T>(new Account(accountId)) {
                    @Override
                    public void onResponse(T response) {
                        new Thread(() -> {
                            entity.setStatus(DBStatus.UP_TO_DATE.getId());
                            provider.updateInDB(dataBaseAdapter, accountId, entity, false);
                            callback.onResponse(entity);
                        }).start();
                    }

                    @Override
                    public void onError(Throwable throwable) {
                        super.onError(throwable);
                        new Thread(() -> {
                            callback.onError(throwable, entity);
                        }).start();
                    }
                }, entity);
            } catch (Throwable t) {
                callback.onError(t, entity);
            }
        } else {
            callback.onResponse(entity);
        }
    }
    public <T extends IRemoteEntity> void deleteEntity(final AbstractSyncDataProvider<T> provider, T entity, IResponseCallback<Void> callback){
        final long accountId = callback.getAccount().getId();
        provider.deleteInDB(dataBaseAdapter, accountId, entity);
        boolean connected = serverAdapter.hasInternetConnection();
        if (entity.getId() != null && connected) {
            try {
                provider.deleteOnServer(serverAdapter, accountId, new IResponseCallback<Void>(new Account(accountId)) {
                    @Override
                    public void onResponse(Void response) {
                        new Thread(() -> {
                            provider.deletePhysicallyInDB(dataBaseAdapter, accountId, entity);
                            callback.onResponse(null);
                        }).start();
                    }

                    @Override
                    public void onError(Throwable throwable) {
                        super.onError(throwable);
                        new Thread(() -> {
                            callback.onError(throwable);
                        }).start();
                    }
                }, entity, dataBaseAdapter);
            } catch (Throwable t) {
                callback.onError(t);
            }

        } else {
            callback.onResponse(null);
        }
    }

    public interface OnResponseAction <T> {
        void onResponse(T entity, T response);
    }
}