Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.h2spatial.app / org.gvsig.h2spatial.app.mainplugin / src / main / java / org / gvsig / fmap / dal / impl / LargeSetImpl.java @ 45469

History | View | Annotate | Download (4.63 KB)

1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6
package org.gvsig.fmap.dal.impl;
7

    
8
import java.io.File;
9
import java.util.Collection;
10
import java.util.Iterator;
11
import java.util.Set;
12
import org.gvsig.fmap.dal.DALLocator;
13
import org.gvsig.fmap.dal.DataManager;
14
import org.gvsig.tools.ToolsLocator;
15
import org.gvsig.tools.dispose.Disposable;
16
import org.gvsig.tools.dispose.impl.AbstractDisposable;
17
import org.gvsig.tools.exception.BaseException;
18
import org.gvsig.tools.folders.FoldersManager;
19
import org.gvsig.tools.util.Size;
20
import org.gvsig.tools.util.Size64;
21
import org.h2.mvstore.MVMap;
22
import org.h2.mvstore.MVStore;
23
import org.slf4j.Logger;
24
import org.slf4j.LoggerFactory;
25
import org.gvsig.tools.util.Factory;
26
import org.gvsig.tools.util.IsEmpty;
27

    
28
/**
29
 *
30
 * @author fdiaz
31
 * @param <K>
32
 */
33
public class LargeSetImpl<K> extends AbstractDisposable implements Set<K>, Size64, Size, IsEmpty, Disposable {
34

    
35
    protected static final Logger LOGGER = LoggerFactory.getLogger(LargeSetImpl.class);
36

    
37
    private MVStore mvstore;
38
    private MVMap<K, Boolean> mvMap;
39

    
40
    public LargeSetImpl() {
41
        super();
42
        FoldersManager folderManager = ToolsLocator.getFoldersManager();
43
        File f = folderManager.getUniqueTemporaryFile("MinLargeSet.mv");
44
        this.mvstore = MVStore.open(f.getAbsolutePath());
45
        this.mvMap = mvstore.openMap("DefaultMap");
46
    }
47

    
48
    @Override
49
    protected void doDispose() throws BaseException {
50
        this.mvstore.close();
51
        this.mvMap = null;
52
        this.mvstore = null;
53
    }
54

    
55
    @Override
56
    public int size() {
57
        return this.mvMap.size();
58
    }
59

    
60
    @Override
61
    public boolean isEmpty() {
62
        return this.mvMap.isEmpty();
63
    }
64

    
65
    @Override
66
    public boolean contains(Object o) {
67
        return this.mvMap.containsKey((K)o);
68
    }
69

    
70
    @Override
71
    public Iterator<K> iterator() {
72
        return this.mvMap.keySet().iterator();
73
    }
74

    
75
    @Override
76
    public Object[] toArray() {
77
        //FIXME: Ojo, si el set es grande, esto puede puede provocar un desbordamiento de memoria.
78
        //duda ?implementarlo o lanzar UnsupportedOperationException?
79
//        LOGGER.warn("Access to LargeSet's toArray() method.");
80
//        return this.mvMap.entrySet().toArray();
81
        throw new UnsupportedOperationException("Not supported yet.");
82
    }
83

    
84
    @Override
85
    public <T> T[] toArray(T[] a) {
86
        //FIXME: Ojo, si el set es grande, esto puede puede provocar un desbordamiento de memoria.
87
        //duda ?implementarlo o lanzar UnsupportedOperationException?
88
//        LOGGER.warn("Access to LargeSet's toArray(T[] a) method.");
89
//        return this.mvMap.keySet().toArray((T[]) new K[this.size()]);
90
        throw new UnsupportedOperationException("Not supported yet.");
91
    }
92

    
93
    @Override
94
    public boolean add(K e) {
95
        return this.mvMap.put(e, Boolean.TRUE)!=null;
96
    }
97

    
98
    @Override
99
    public boolean remove(Object o) {
100
        return this.mvMap.remove((K)o)!=null;
101
    }
102

    
103
    @Override
104
    public boolean containsAll(Collection<?> c) {
105
        //FIXME: Comprobar que esto no lo haga en memoria
106
        return this.mvMap.keySet().containsAll(c);
107
        //Si lo hace en memoria, usar lo siguiente;
108
//        if (!c.stream().noneMatch(object -> (!contains((K)object)))) {
109
//            return false;
110
//        }
111
//        return true;
112
    }
113

    
114
    @Override
115
    public boolean addAll(Collection<? extends K> c) {
116
        boolean result = false;
117
        for (K k : c) {
118
            result |= this.add(k);
119
        }
120
        return result;
121
    }
122

    
123
    @Override
124
    public boolean retainAll(Collection<?> c) {
125
        boolean result = false;
126
        for (Object next : this) {
127
            if(!c.contains(next)){
128
                result |= remove((K)next);
129
            }
130
        }
131
        return result;
132
    }
133

    
134
    @Override
135
    public boolean removeAll(Collection<?> c) {
136
        boolean result = false;
137
        for (Object object : c) {
138
            result |= remove((K)object);
139
        }
140
        return result;
141
    }
142

    
143
    @Override
144
    public void clear() {
145
        this.mvMap.clear();
146
    }
147

    
148
    @Override
149
    public long size64() {
150
        return this.mvMap.sizeAsLong();
151
    }
152

    
153
    public static void selfRegister() {
154
        DataManager dataManager = DALLocator.getDataManager();
155
        dataManager.registerLargeSet(new Factory() {
156
            @Override
157
            public String getName() {
158
                return "MVStoreSetFactory";
159
            }
160

    
161
            @Override
162
            public Object create(Object... parameters) {
163
                return new LargeSetImpl();
164
            }
165
        });        
166
    }
167
}