Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.impl / src / main / java / org / gvsig / fmap / dal / feature / impl / featurereference / FeatureReferenceCounter.java @ 46963

History | View | Annotate | Download (5.31 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.feature.impl.featurereference;
7

    
8
import java.lang.ref.WeakReference;
9
import java.math.BigDecimal;
10
import java.util.Base64;
11
import java.util.Objects;
12
import javax.json.JsonObject;
13
import org.gvsig.fmap.dal.exception.DataException;
14
import org.gvsig.fmap.dal.feature.Feature;
15
import org.gvsig.fmap.dal.feature.FeatureStore;
16
import org.gvsig.fmap.dal.feature.FeatureType;
17
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore;
18
import org.gvsig.fmap.dal.feature.spi.FeatureReferenceProviderServices;
19
import org.gvsig.json.Json;
20
import org.gvsig.json.JsonObjectBuilder;
21
import org.gvsig.tools.persistence.Persistent;
22
import org.gvsig.tools.persistence.PersistentState;
23
import org.gvsig.tools.persistence.exception.PersistenceException;
24

    
25
/**
26
 *
27
 * @author fdiaz
28
 */
29

    
30
public class FeatureReferenceCounter implements FeatureReferenceProviderServices, Persistent {
31

    
32
    public static final String COUNTER_TYPE = "counter";
33
    
34
    private static long counter = -1;
35

    
36
    private long oid;
37
    private WeakReference storeRef;
38
    private String featureTypeId;
39

    
40
    /*friend*/
41
    FeatureReferenceCounter(FeatureStore store) {
42
        this.oid = counter--;
43
            this.storeRef = new WeakReference(store);
44
        this.featureTypeId = store.getDefaultFeatureTypeQuietly().getId();
45
    }
46

    
47
    FeatureReferenceCounter(FeatureStore store, Object oid) {
48
        if(!(oid instanceof Number)){
49
            throw new IllegalArgumentException("oid must be a number");
50
        }
51
        if(((Number) oid).longValue() >=  0){
52
            throw new IllegalArgumentException("oid must be less than zero  ("+oid+").");
53
        }
54

    
55
        this.oid = ((Number) oid).longValue();
56
            this.storeRef = new WeakReference(store);
57
        this.featureTypeId = store.getDefaultFeatureTypeQuietly().getId();
58
    }
59

    
60
    /*friend*/
61
    FeatureReferenceCounter(FeatureStore store, JsonObject code) {
62
            this.storeRef = new WeakReference(store);
63
        this.featureTypeId = store.getDefaultFeatureTypeQuietly().getId();
64
        this.oid = (Long)Json.toObject(code, "oid");
65
    }
66

    
67
    public FeatureReferenceCounter() {
68
        //For persistence use only
69
    }
70

    
71
    @Override
72
    public Object getOID() {
73
        return  this.oid;
74
    }
75

    
76
    @Override
77
    public String[] getKeyNames() {
78
        return null;
79
    }
80

    
81
    @Override
82
    public Object getKeyValue(String name) {
83
        return null;
84
    }
85

    
86
    @Override
87
    public String getFeatureTypeId() {
88
        return featureTypeId;
89
    }
90

    
91
    @Override
92
    public Feature getFeature() throws DataException {
93
        return this.getStore().getFeatureByReference(this);
94
    }
95

    
96
    @Override
97
    public Feature getFeatureQuietly() {
98
        try {
99
            return this.getFeature();
100
        } catch (Exception e) {
101
            return null;
102
        }
103
    }
104

    
105
    @Override
106
    public Feature getFeature(FeatureType featureType) throws DataException {
107
        return this.getStore().getFeatureByReference(this, featureType);
108
    }
109
    
110
    private DefaultFeatureStore getStore() {
111
        return (DefaultFeatureStore) this.storeRef.get();
112
    }
113

    
114
    @Override
115
    public boolean isNewFeature() {
116
        return true;
117
    }
118

    
119
    @Override
120
    public String getCode() {
121
        String s = this.toJsonBuilder().toString();
122
        String r = Base64.getEncoder().encodeToString(s.getBytes());
123
        return r;
124
    }
125

    
126
    @Override
127
    public void saveToState(PersistentState state) throws PersistenceException {
128
        state.set("type", COUNTER_TYPE);
129
        state.set("oid", oid);
130
        state.set("store", (Persistent) storeRef.get());
131
        state.set("featureTypeId", featureTypeId);
132
        state.set("isNewFeature", isNewFeature());
133
    }
134

    
135
    @Override
136
    public void loadFromState(PersistentState state)
137
            throws PersistenceException {
138
        this.oid = state.getLong("oid");
139
        this.storeRef = new WeakReference(state.get("store"));
140
        this.featureTypeId = state.getString("featureTypeId");
141
    }
142

    
143
    @Override
144
    public boolean equals(Object obj) {
145
        if (!(obj instanceof FeatureReferenceCounter)) {
146
            return false;
147
        }
148
        FeatureReferenceCounter other = (FeatureReferenceCounter) obj;
149

    
150
        FeatureStore otherStore = (FeatureStore) other.storeRef.get();
151
        FeatureStore myrStore = (FeatureStore) this.storeRef.get();
152
        if (otherStore == null || myrStore == null) {
153
            return false;
154
        }
155
        if (!myrStore.equals(otherStore)) {
156
            return false;
157
        }
158
        if (this.oid == other.oid){
159
            return true;
160
        }
161
        return this.oid == other.oid;
162
    }
163

    
164
    @Override
165
    public int hashCode() {
166
        return Long.hashCode(this.oid);
167
    }
168
    
169
    public static boolean canUse(Object oid){
170
        if(oid instanceof Number){
171
            if(((Number) oid).longValue() <  0){
172
                return true;
173
            }
174
        }
175
        return false;
176
    }
177

    
178
    @Override
179
    public JsonObjectBuilder toJsonBuilder() {
180
        JsonObjectBuilder builder = Json.createObjectBuilder();
181
        builder.add("type", COUNTER_TYPE);
182
        builder.add("oid", this.oid);
183
        return builder;
184
    }
185

    
186
    @Override
187
    public String toString() {
188
        return Objects.toString(this.oid);
189
    }
190

    
191
}