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 @ 45938

History | View | Annotate | Download (5.06 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.util.Base64;
10
import javax.json.JsonObject;
11
import org.gvsig.fmap.dal.exception.DataException;
12
import org.gvsig.fmap.dal.feature.Feature;
13
import org.gvsig.fmap.dal.feature.FeatureStore;
14
import org.gvsig.fmap.dal.feature.FeatureType;
15
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore;
16
import org.gvsig.fmap.dal.feature.spi.FeatureReferenceProviderServices;
17
import org.gvsig.json.Json;
18
import org.gvsig.json.JsonObjectBuilder;
19
import org.gvsig.tools.persistence.Persistent;
20
import org.gvsig.tools.persistence.PersistentState;
21
import org.gvsig.tools.persistence.exception.PersistenceException;
22

    
23
/**
24
 *
25
 * @author fdiaz
26
 */
27

    
28
public class FeatureReferenceCounter implements FeatureReferenceProviderServices, Persistent {
29

    
30
    public static final String COUNTER_TYPE = "counter";
31
    
32
    private static long counter = -1;
33

    
34
    private long oid;
35
    private WeakReference storeRef;
36
    private String featureTypeId;
37

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

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

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

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

    
65
    public FeatureReferenceCounter() {
66
        //For persistence use only
67
    }
68

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

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

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

    
84
    @Override
85
    public String getFeatureTypeId() {
86
        return featureTypeId;
87
    }
88

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

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

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

    
112
    @Override
113
    public boolean isNewFeature() {
114
        return true;
115
    }
116

    
117
    @Override
118
    public String getCode() {
119
        JsonObjectBuilder builder = Json.createObjectBuilder();
120
        builder.add("type", COUNTER_TYPE);
121
        builder.add("oid", this.oid);
122
        String s = builder.toString();
123
        String r = Base64.getEncoder().encodeToString(s.getBytes());
124
        return r;
125
    }
126

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

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

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

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

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

    
179

    
180
}