Revision 2823

View differences:

org.gvsig.vcsgis/trunk/org.gvsig.vcsgis/org.gvsig.vcsgis.lib/org.gvsig.vcsgis.lib.impl/src/main/java/org/gvsig/vcsgis/lib/repository/remoteclient/requests/UpdateRequestClient.java
91 91
    @Override
92 92
    public void requestProducer(OutputStream out) {
93 93
        try {
94
            LOGGER.debug("===: ["+this.getRequestName()+"] requestProducer 1");
95
            
96
            JsonObjectBuilder parametersBuilder = Json.createObjectBuilder();
97
            
98
            parametersBuilder.add("EntityName", this.getEntityName());
99
            parametersBuilder.add("LocalRevisionCode", this.getLocalRevisionCode());
100
            
94 101
            JsonObjectBuilder builder = Json.createObjectBuilder();
95
            builder.add("EntityName", this.getEntityName());
96
            builder.add("LocalRevisionCode", this.getLocalRevisionCode());
97
           
98
            this.notifyRequestConsumers();
102
            builder.add("Parameters", parametersBuilder);
103
            
99 104
            IOUtils.write(builder.toString(), out);
100 105
            
101 106
            error(ERR_OK);
org.gvsig.vcsgis/trunk/org.gvsig.vcsgis/org.gvsig.vcsgis.lib/org.gvsig.vcsgis.lib.impl/src/main/java/org/gvsig/vcsgis/lib/server/handlers/UpdateHandler.java
61 61
        JsonReader reader = Json.createReader(request_contents);
62 62
        JsonObject jsonRequest = reader.readObject();
63 63
        
64
        String entityName = jsonRequest.getString("EntityName");
65 64
        
65
        JsonObject jsonParameters = jsonRequest.getJsonObject("Parameters");
66
        String entityName = jsonParameters.getString("EntityName");
67
        
66 68
        VCSGisUpdateRequest request = this.getRepository().createUpdateRequest(entityName);
67
        request.setLocalRevisionCode(jsonRequest.getString("LocalRevisionCode"));
69
        request.setLocalRevisionCode(jsonParameters.getString("LocalRevisionCode", null));
70
        
68 71
        req.setValue(request);
69
        
72
        notifyRequestConsumers();
73

  
70 74
        LOGGER.debug("===: ["+this.getName()+"] requestProducer 2 notifyRequestConsumers");
71 75
        notifyRequestConsumers();
72 76
        
......
75 79
    
76 80
    @Override
77 81
    protected void responseProducer(VCSGisRequest req, OutputStream response_contents) throws IOException {
78
        final VCSGisCheckoutRequest request = (VCSGisCheckoutRequest) req;
82
        LOGGER.debug("===: ["+this.getName()+"] responseProducer 1");
83
        final VCSGisUpdateRequest request = (VCSGisUpdateRequest) req;
79 84
        JsonGenerator gen = null;
80 85
        try {
81 86
            JsonGeneratorFactory genFactory = Json.createGeneratorFactory(
82 87
                Collections.singletonMap(JsonGenerator.PRETTY_PRINTING, true)
83 88
            );
84 89
            gen = genFactory.createGenerator(response_contents);
90
            LOGGER.debug("===: ["+this.getName()+"] responseProducer 2");
85 91
            gen.writeStartObject();
86 92

  
87 93
            gen.writeStartObject("Parameters");
88 94
            gen.write("StatusCode", request.getLastErrorCode());
89 95

  
96
            LOGGER.debug("===: ["+this.getName()+"] responseProducer 3");
90 97
            notifyResponseConsumers();
98
            gen.flush();
91 99

  
92 100
            if( StringUtils.isBlank(request.getLastErrorMessage()) ) {
93 101
                gen.writeNull("StatusMessage");
......
98 106
            gen.write("Entity", request.getEntity().toJson());
99 107
            gen.writeEnd(); // Paramaters
100 108

  
109
            LOGGER.debug("===: ["+this.getName()+"] responseProducer 4");
101 110
            gen.writeStartArray("Data");
102 111
            for (VCSGisRepositoryData data : request.getData()) {
103 112
                gen.write(data.toJson());
104 113
                gen.flush();
105 114
            }
115
            LOGGER.debug("===: ["+this.getName()+"] responseProducer 5");
106 116
            gen.writeEnd(); // Data
107 117
            gen.writeEnd(); 
108 118
            
109 119

  
120
            LOGGER.debug("===: ["+this.getName()+"] responseProducer 6 gen.flush()");
110 121
            gen.flush();
122
            LOGGER.debug("===: ["+this.getName()+"] responseProducer 7 response_contents.flush()");
111 123
            response_contents.flush();
124
            LOGGER.debug("===: ["+this.getName()+"] responseProducer 8 end");
112 125
            
113 126
                        
114 127
        } catch (Exception ex) {
115 128
            LOGGER.warn("Can't produce Json data for "+this.getName()+" response.",ex);
116 129

  
117 130
        } finally {
131
            LOGGER.debug("===: ["+this.getName()+"] responseProducer finally");
118 132
            IOUtils.closeQuietly(gen);
119 133
            IOUtils.closeQuietly(response_contents);
120 134
        }
org.gvsig.vcsgis/trunk/org.gvsig.vcsgis/org.gvsig.vcsgis.lib/org.gvsig.vcsgis.lib.impl/src/main/java/org/gvsig/vcsgis/lib/server/handlers/CheckoutHandler.java
84 84
            gen.write("StatusCode", request.getLastErrorCode());
85 85

  
86 86
            notifyResponseConsumers();
87
            gen.flush();
87 88

  
88 89
            if( StringUtils.isBlank(request.getLastErrorMessage()) ) {
89 90
                gen.writeNull("StatusMessage");
org.gvsig.vcsgis/trunk/org.gvsig.vcsgis/org.gvsig.vcsgis.lib/org.gvsig.vcsgis.lib.impl/src/test/resources/org/gvsig/vcsgis/lib/impl/expecteds/S05Update.txt
1

  
2
@rem ----------------------------------------------------------------
3
@rem TestS05Update.java
4
@rem Values to check request and response of update request
5
@rem ----------------------------------------------------------------
6

  
7
@begin request
8
@rem The client request of a update request for this test
9
{
10
    "Parameters":{
11
        "EntityName":"test",
12
        "LocalRevisionCode":"00000000000015abcdef0123456789"
13
    }
14
}
15
@end request
16

  
17
@begin response
18
@rem The server response of checkout request for this test 
19
{
20
    "Parameters":{
21
        "StatusCode":0,
22
        "StatusMessage":"_No_errors",
23
        "Entity":{
24
            "DataTableName":"VCSGIS_DATA",
25
            "Description":"",
26
            "EntityCode":"00000000000003abcdef0123456789",
27
            "EntityName":"test",
28
            "FeatureIdFieldName":"VCSGISCODE",
29
            "FeatureTypeAsJson":"\n{\n    \"__classname__\":\"org.gvsig.fmap.dal.feature.impl.DefaultFeatureType\",\n    \"id\":\"testSource2\",\n    \"internalID\":\"7c54a6bc\",\n    \"label\":null,\n    \"description\":null,\n    \"allowAtomaticValues\":false,\n    \"hasOID\":false,\n    \"defaultGeometryAttributeName\":null,\n    \"defaultTimeAttributeName\":null,\n    \"tags\":{\n        \"__classname__\":\"org.gvsig.tools.dynobject.impl.DefaultTags\"\n    },\n    \"extraColumns\":{\n        \"__classname__\":\"org.gvsig.fmap.dal.feature.impl.DefaultFeatureExtraColumns\",\n        \"extraColumns\":[\n        ]\n    },\n    \"descriptors\":[\n        {\n            \"__classname__\":\"org.gvsig.fmap.dal.feature.impl.DefaultFeatureAttributeDescriptor\",\n            \"name\":\"id\",\n            \"description\":null,\n            \"label\":null,\n            \"shortLabel\":null,\n            \"order\":0,\n            \"groupName\":null,\n            \"dataType\":{\n                \"__classname__\":\"org.gvsig.tools.dataTypes.impl.DefaultDataType\",\n                \"name\":\"Integer\",\n                \"type\":4,\n                \"subtype\":null\n            },\n            \"size\":0,\n            \"precision\":10,\n            \"scale\":0,\n            \"roundMode\":4,\n            \"allowNull\":false,\n            \"primaryKey\":false,\n            \"readOnly\":false,\n            \"isAutomatic\":false,\n            \"isTime\":false,\n            \"indexed\":true,\n            \"isIndexAscending\":true,\n            \"allowIndexDuplicateds\":false,\n            \"hidden\":false,\n            \"avoidCachingAvailableValues\":false,\n            \"geometryType\":null,\n            \"srs\":null,\n            \"relationType\":0,\n            \"displaySize\":0,\n            \"locale\":{\n                \"__classname__\":\"java.util.Locale\",\n                \"languageTag\":\"en\"\n            },\n            \"expression\":null,\n            \"availableValuesExpression\":null,\n            \"defaultValue\":\"\",\n            \"dataProfile\":null,\n            \"tags\":{\n                \"__classname__\":\"org.gvsig.tools.dynobject.impl.DefaultTags\"\n            },\n            \"availableValues\":null,\n            \"additionalInfo\":null\n        },\n        {\n            \"__classname__\":\"org.gvsig.fmap.dal.feature.impl.DefaultFeatureAttributeDescriptor\",\n            \"name\":\"text\",\n            \"description\":null,\n            \"label\":null,\n            \"shortLabel\":null,\n            \"order\":10,\n            \"groupName\":null,\n            \"dataType\":{\n                \"__classname__\":\"org.gvsig.tools.dataTypes.impl.DefaultDataType\",\n                \"name\":\"String\",\n                \"type\":8,\n                \"subtype\":null\n            },\n            \"size\":100,\n            \"precision\":-1,\n            \"scale\":-1,\n            \"roundMode\":4,\n            \"allowNull\":true,\n            \"primaryKey\":false,\n            \"readOnly\":false,\n            \"isAutomatic\":false,\n            \"isTime\":false,\n            \"indexed\":false,\n            \"isIndexAscending\":true,\n            \"allowIndexDuplicateds\":true,\n            \"hidden\":false,\n            \"avoidCachingAvailableValues\":false,\n            \"geometryType\":null,\n            \"srs\":null,\n            \"relationType\":0,\n            \"displaySize\":0,\n            \"locale\":{\n                \"__classname__\":\"java.util.Locale\",\n                \"languageTag\":\"en\"\n            },\n            \"expression\":null,\n            \"availableValuesExpression\":null,\n            \"defaultValue\":\"\",\n            \"dataProfile\":null,\n            \"tags\":{\n                \"__classname__\":\"org.gvsig.tools.dynobject.impl.DefaultTags\"\n            },\n            \"availableValues\":null,\n            \"additionalInfo\":null\n        },\n        {\n            \"__classname__\":\"org.gvsig.fmap.dal.feature.impl.DefaultFeatureAttributeDescriptor\",\n            \"name\":\"VCSGISCODE\",\n            \"description\":null,\n            \"label\":\"VCSGIS Code\",\n            \"shortLabel\":null,\n            \"order\":20,\n            \"groupName\":null,\n            \"dataType\":{\n                \"__classname__\":\"org.gvsig.tools.dataTypes.impl.DefaultDataType\",\n                \"name\":\"String\",\n                \"type\":8,\n                \"subtype\":null\n            },\n            \"size\":40,\n            \"precision\":-1,\n            \"scale\":-1,\n            \"roundMode\":4,\n            \"allowNull\":true,\n            \"primaryKey\":true,\n            \"readOnly\":false,\n            \"isAutomatic\":false,\n            \"isTime\":false,\n            \"indexed\":true,\n            \"isIndexAscending\":true,\n            \"allowIndexDuplicateds\":false,\n            \"hidden\":false,\n            \"avoidCachingAvailableValues\":false,\n            \"geometryType\":null,\n            \"srs\":null,\n            \"relationType\":0,\n            \"displaySize\":0,\n            \"locale\":{\n                \"__classname__\":\"java.util.Locale\",\n                \"languageTag\":\"es-ES\"\n            },\n            \"expression\":null,\n            \"availableValuesExpression\":null,\n            \"defaultValue\":\"\",\n            \"dataProfile\":null,\n            \"tags\":{\n                \"__classname__\":\"org.gvsig.tools.dynobject.impl.DefaultTags\"\n            },\n            \"availableValues\":null,\n            \"additionalInfo\":null\n        }\n    ]\n}",
30
            "FieldForLabel":"text",
31
            "GeometryFieldName":null,
32
            "RevisionCode":"00000000000032abcdef0123456789",
33
            "TopologyPlanCode":null,
34
            "UserCode":null
35
        }
36
    },
37
    "Data":[
38
        {
39
            "DataCode":"00000000000034abcdef0123456789",
40
            "EntityCode":"00000000000003abcdef0123456789",
41
            "RevisionCode":"00000000000032abcdef0123456789",
42
            "RevisionNumber":1,
43
            "EfectiveDate":"2020-02-17 10:11:12.123",
44
            "Operation":2,
45
            "FeatureRelatedCode":"00000000000026abcdef0123456789",
46
            "Data":"\n{\n    \"id\":4,\n    \"text\":\"DDD\",\n    \"VCSGISCODE\":\"00000000000026abcdef0123456789\"\n}"
47
        },
48
        {
49
            "DataCode":"00000000000036abcdef0123456789",
50
            "EntityCode":"00000000000003abcdef0123456789",
51
            "RevisionCode":"00000000000032abcdef0123456789",
52
            "RevisionNumber":1,
53
            "EfectiveDate":"2020-02-17 10:11:12.123",
54
            "Operation":1,
55
            "FeatureRelatedCode":"00000000000007abcdef0123456789",
56
            "Data":"\n{\n    \"id\":2,\n    \"text\":\"BB2\",\n    \"VCSGISCODE\":\"00000000000007abcdef0123456789\"\n}"
57
        }
58
    ]
59
}
60
@end response
org.gvsig.vcsgis/trunk/org.gvsig.vcsgis/org.gvsig.vcsgis.lib/org.gvsig.vcsgis.lib.impl/src/test/java/org/gvsig/vcsgis/lib/impl/server/TestS05Update.java
1
package org.gvsig.vcsgis.lib.impl.server;
2

  
3
import java.io.ByteArrayInputStream;
4
import java.io.ByteArrayOutputStream;
5
import java.io.File;
6
import java.io.InputStream;
7
import java.net.URL;
8
import java.sql.Timestamp;
9
import java.util.List;
10
import java.util.Map;
11
import junit.framework.TestCase;
12
import static junit.framework.TestCase.assertEquals;
13
import static junit.framework.TestCase.assertNotNull;
14
import org.apache.commons.io.FileUtils;
15
import org.apache.commons.io.IOUtils;
16
import org.apache.commons.lang3.StringUtils;
17
import org.gvsig.expressionevaluator.Expression;
18
import org.gvsig.fmap.dal.feature.EditableFeature;
19
import org.gvsig.fmap.dal.feature.Feature;
20
import org.gvsig.fmap.dal.feature.FeatureStore;
21
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
22
import org.gvsig.tools.dispose.DisposeUtils;
23
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
24
import org.gvsig.vcsgis.lib.SequentialCodeGenerator;
25
import org.gvsig.vcsgis.lib.VCSGisEntity;
26
import org.gvsig.vcsgis.lib.VCSGisLocator;
27
import org.gvsig.vcsgis.lib.VCSGisManager;
28
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_NO_ERROR;
29
import org.gvsig.vcsgis.lib.impl.TestUtils;
30
import org.gvsig.vcsgis.lib.repository.VCSGisRepository;
31
import org.gvsig.vcsgis.lib.repository.VCSGisRepositoryChange;
32
import org.gvsig.vcsgis.lib.repository.remoteclient.requests.CheckoutRequestClient;
33
import org.gvsig.vcsgis.lib.repository.remoteclient.requests.UpdateRequestClient;
34
import org.gvsig.vcsgis.lib.server.VCSGisServerHandler;
35
import org.gvsig.vcsgis.lib.server.handlers.CheckoutHandler;
36
import org.gvsig.vcsgis.lib.server.handlers.UpdateHandler;
37
import org.gvsig.vcsgis.lib.workspace.VCSGisWorkspace;
38
import org.gvsig.vcsgis.lib.workspace.VCSGisWorkspaceChanges;
39
import org.slf4j.Logger;
40
import org.slf4j.LoggerFactory;
41

  
42

  
43
public class TestS05Update extends TestCase {
44

  
45
    private static final Logger LOGGER = LoggerFactory.getLogger(TestS05Update.class);
46

  
47
    public TestS05Update(String testName) {
48
        super(testName);
49
    }
50

  
51
    @Override
52
    protected void setUp() throws Exception {
53
        super.setUp();
54
        new DefaultLibrariesInitializer().fullInitialize();
55
    }
56

  
57
    @Override
58
    protected void tearDown() throws Exception {
59
        super.tearDown();
60
    }
61

  
62
    // TODO add test methods here. The name must begin with 'test'. For example:
63
    // public void testHello() {}
64

  
65
    public void testUpdate() throws Exception {
66
        final String testid = "ServerCheckout";
67
        final URL serverUrl = new URL("http://localhost:9810/");
68
        
69
        VCSGisManager manager = VCSGisLocator.getVCSGisManager();
70
        manager.setCodeGenerator(new SequentialCodeGenerator());
71
        
72
        JDBCServerExplorerParameters serverParameters = TestUtils.getServerExplorerParameters("srv-"+testid);
73
        File ws1file = TestUtils.getFile(FileUtils.getFile("test-dbs","ws1-"+testid)); 
74
        File ws2file = TestUtils.getFile(FileUtils.getFile("test-dbs","ws2-"+testid)); 
75

  
76
        int r;
77
        Feature f;
78
        EditableFeature ef;
79
        List<Feature> features;
80
        FeatureStore store1;
81
        FeatureStore store2;
82
        
83
        // ------------------------------------------------------------
84
        // Inicializamos el repositorio y lo abrimos
85
        r = manager.initRepository(serverParameters, null);
86
        assertEquals("init_server status", ERR_NO_ERROR, r);
87
        
88
        VCSGisRepository repoLocaldb = manager.openRepository(serverParameters);
89
        TestUtils.h2sql_repository(repoLocaldb);
90

  
91
        // ------------------------------------------------------------
92
        // Creamos workspace1 y lo abrimos.
93
        r = manager.initWorkspace(ws1file, repoLocaldb, "Test update1",null);
94
        assertEquals("init_ws1 status", ERR_NO_ERROR, r);
95
        
96
        VCSGisWorkspace ws1 = manager.openWorkspace(ws1file);
97
        TestUtils.h2sql_workspace(ws1);
98

  
99
        // ------------------------------------------------------------
100
        // Adicionamos al workspace1 la tabla "test" y la commitamos.
101
        FeatureStore sourceTest = TestUtils.openSourceStore2();
102
        r = ws1.add("test", sourceTest, "text");
103
        assertEquals("ws1.add status", ERR_NO_ERROR, r);
104
        r = ws1.commit();
105
        assertEquals("ws1.commit-1 status", ERR_NO_ERROR, r);
106
        DisposeUtils.disposeQuietly(sourceTest);
107

  
108
        
109
        // ------------------------------------------------------------
110
        // Inicializamos el workspace2 asociandolo al mismo repositorio que 
111
        // workspace1 y lo abrimos.
112
        r = manager.initWorkspace(ws2file, repoLocaldb, "Test update2",null);
113
        assertEquals("init_ws2 status", ERR_NO_ERROR, r);
114
        VCSGisWorkspace ws2 = manager.openWorkspace(ws2file);
115
        TestUtils.h2sql_workspace(ws2);
116
        
117
        // ------------------------------------------------------------
118
        // Hacemos un checkout en workspace2 de la tabla "test" 
119
        // y comprobamos que tiene lo que toca.
120
        r = ws2.checkout("test");
121
        assertEquals("ws2-checkout status", ERR_NO_ERROR, r);
122
       
123
        VCSGisEntity entity = ws2.getWorkspaceEntityByName("test");
124
        assertNotNull("ws2.update-1 entity", entity);
125
        assertEquals("ws2.update-1 label", "text", entity.getFieldForLabel());
126

  
127
        store2 = ws2.getFeatureStore("test");
128
        assertEquals("ws2-checkout sizes", 3, store2.size64());
129
        features = store2.getFeatures((Expression)null, "id", true);
130
        assertEquals(1    , features.get(0).getInt("id"));
131
        assertEquals("AAA", features.get(0).getString("text"));
132
        assertEquals(2    , features.get(1).getInt("id"));
133
        assertEquals("BBB", features.get(1).getString("text"));
134
        assertEquals(3    , features.get(2).getInt("id"));
135
        assertEquals("CCC", features.get(2).getString("text"));
136
        
137
        DisposeUtils.disposeQuietly(store2);
138

  
139
        // ------------------------------------------------------------
140
        // Modificamos la tabla "test" en el workspace1 y la commitamos.
141
        store1 = ws1.getFeatureStore("test");
142
        store1.edit();
143
        f = store1.findFirst("id=2");
144
        ef = f.getEditable();
145
        ef.set("text", "BB2");
146
        store1.update(ef);
147
        
148
        ef = store1.createNewFeature();
149
        ef.set("id",4);
150
        ef.set("text","DDD");
151
        store1.insert(ef);
152
        store1.finishEditing();
153
        DisposeUtils.disposeQuietly(store1);
154
        r = ws1.commit(Timestamp.valueOf("2020-02-17 10:11:12.123"), "Insertado DDD y modificado BBB a BB2", null);
155
        assertEquals("ws1.commit-2 status", ERR_NO_ERROR, r);
156
        
157
        String localRevisionCode = ws2.getWorkspaceEntity("test").getRepositoryRevisionCode();
158
        assertEquals("ws2 localRevisionCode", "00000000000015abcdef0123456789", localRevisionCode);
159
        
160
        ws1.dispose();
161
        ws2.dispose();
162
        ws1 = null;
163
        ws2 = null;
164
        
165
        // -------------------------
166
        // Check that the UpdateRequestClient produce the expected json output
167
        Map<String, String> expected = TestUtils.getExpecteds("S05Update.txt");
168

  
169
        VCSGisRepository repoRemote = manager.openRepository(serverUrl);
170
        UpdateRequestClient request = (UpdateRequestClient) repoRemote.createUpdateRequest("test");
171
        request.setLocalRevisionCode(localRevisionCode);
172
        
173
        ByteArrayOutputStream request_stream = new ByteArrayOutputStream(10024);
174
        request.requestProducer(request_stream);
175
        String request_s = request_stream.toString().trim();
176
        assertEquals("request data", expected.get("request"), request_s);
177
        
178
        // -------------------------
179
        // Check that CheckoutHandler produce the expected json as response to request
180
        ByteArrayInputStream is = new ByteArrayInputStream(request_stream.toByteArray());
181
        VCSGisServerHandler handler = new UpdateHandler(repoLocaldb);
182
        InputStream response_stream = handler.handle(is);
183
                
184
        String response_s = StringUtils.join(IOUtils.readLines(response_stream),'\n').trim();
185
        assertEquals("response data", expected.get("response"), response_s);
186

  
187

  
188
    }
189
}

Also available in: Unified diff