Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
C
caosdb-server
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
caosdb
Software
caosdb-server
Commits
ab08dc9b
Verified
Commit
ab08dc9b
authored
3 years ago
by
Timm Fitschen
Browse files
Options
Downloads
Patches
Plain Diff
BUG: correctly handle string ids
parent
6f5d3c94
No related branches found
No related tags found
3 merge requests
!44
Release 0.6
,
!43
Merge f-GRPC-main to dev
,
!35
F grpc f mixed write transactions
Pipeline
#14152
passed
3 years ago
Stage: info
Stage: test
Stage: deploy
Changes
1
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
+80
-64
80 additions, 64 deletions
.../org/caosdb/server/grpc/EntityTransactionServiceImpl.java
with
80 additions
and
64 deletions
src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
+
80
−
64
View file @
ab08dc9b
...
@@ -15,6 +15,7 @@ import org.caosdb.api.entity.v1alpha1.DeleteRequest;
...
@@ -15,6 +15,7 @@ import org.caosdb.api.entity.v1alpha1.DeleteRequest;
import
org.caosdb.api.entity.v1alpha1.DeleteResponse
;
import
org.caosdb.api.entity.v1alpha1.DeleteResponse
;
import
org.caosdb.api.entity.v1alpha1.Entity
;
import
org.caosdb.api.entity.v1alpha1.Entity
;
import
org.caosdb.api.entity.v1alpha1.Entity.Builder
;
import
org.caosdb.api.entity.v1alpha1.Entity.Builder
;
import
org.caosdb.api.entity.v1alpha1.EntityRequest
;
import
org.caosdb.api.entity.v1alpha1.EntityResponse
;
import
org.caosdb.api.entity.v1alpha1.EntityResponse
;
import
org.caosdb.api.entity.v1alpha1.EntityRole
;
import
org.caosdb.api.entity.v1alpha1.EntityRole
;
import
org.caosdb.api.entity.v1alpha1.EntityTransactionServiceGrpc.EntityTransactionServiceImplBase
;
import
org.caosdb.api.entity.v1alpha1.EntityTransactionServiceGrpc.EntityTransactionServiceImplBase
;
...
@@ -590,37 +591,26 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
...
@@ -590,37 +591,26 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
final
WritableContainer
container
=
final
WritableContainer
container
=
new
WritableContainer
(
new
WritableContainer
(
SecurityUtils
.
getSubject
(),
getTimestamp
(),
getSRID
(),
new
HashMap
<
String
,
String
>());
SecurityUtils
.
getSubject
(),
getTimestamp
(),
getSRID
(),
new
HashMap
<
String
,
String
>());
for
(
final
TransactionRequest
request
:
requests
.
getRequestsList
())
{
switch
(
request
.
getWrappedRequestsCase
())
{
// put entities into the transaction object
for
(
final
TransactionRequest
sub_request
:
requests
.
getRequestsList
())
{
switch
(
sub_request
.
getWrappedRequestsCase
())
{
case
INSERT_REQUEST:
case
INSERT_REQUEST:
final
InsertRequest
insertRequest
=
request
.
getInsertRequest
();
{
final
Entity
insertEntity
=
insertRequest
.
getEntityRequest
().
getEntity
();
final
InsertRequest
insertRequest
=
sub_request
.
getInsertRequest
();
final
Entity
insertEntity
=
insertRequest
.
getEntityRequest
().
getEntity
();
try
{
final
InsertEntity
entity
=
final
InsertEntity
entity
=
new
InsertEntity
(
new
InsertEntity
(
insertEntity
.
getName
().
isEmpty
()
?
null
:
insertEntity
.
getName
(),
insertEntity
.
getName
().
isEmpty
()
?
null
:
insertEntity
.
getName
(),
convert
(
insertEntity
.
getRole
()));
convert
(
insertEntity
.
getRole
()));
entity
.
setName
(
insertEntity
.
getName
().
isEmpty
()
?
null
:
insertEntity
.
getName
());
convert
(
insertEntity
,
entity
);
convert
(
insertEntity
,
entity
);
if
(
insertRequest
.
getEntityRequest
().
hasUploadId
())
{
addFileUpload
(
container
,
entity
,
insertRequest
.
getEntityRequest
());
final
FileProperties
uploadFile
=
fileTransmissionService
.
getUploadFile
(
insertRequest
.
getEntityRequest
().
getUploadId
());
if
(
uploadFile
==
null
)
{
entity
.
addError
(
ServerMessages
.
FILE_HAS_NOT_BEEN_UPLOAED
);
}
else
{
container
.
addFile
(
uploadFile
.
getTmpIdentifyer
(),
uploadFile
);
entity
.
getFileProperties
().
setTmpIdentifyer
(
uploadFile
.
getTmpIdentifyer
());
}
}
container
.
add
(
entity
);
container
.
add
(
entity
);
}
catch
(
final
NumberFormatException
e
)
{
// ID wasn't an integer - we handle this below.
}
}
break
;
break
;
case
UPDATE_REQUEST:
case
UPDATE_REQUEST:
final
UpdateRequest
updateRequest
=
request
.
getUpdateRequest
();
final
UpdateRequest
updateRequest
=
sub_
request
.
getUpdateRequest
();
final
Entity
updateEntity
=
updateRequest
.
getEntityRequest
().
getEntity
();
final
Entity
updateEntity
=
updateRequest
.
getEntityRequest
().
getEntity
();
try
{
try
{
...
@@ -628,44 +618,38 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
...
@@ -628,44 +618,38 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
new
UpdateEntity
(
getId
(
updateEntity
.
getId
()),
convert
(
updateEntity
.
getRole
()));
new
UpdateEntity
(
getId
(
updateEntity
.
getId
()),
convert
(
updateEntity
.
getRole
()));
entity
.
setName
(
updateEntity
.
getName
().
isEmpty
()
?
null
:
updateEntity
.
getName
());
entity
.
setName
(
updateEntity
.
getName
().
isEmpty
()
?
null
:
updateEntity
.
getName
());
convert
(
updateEntity
,
entity
);
convert
(
updateEntity
,
entity
);
if
(
updateRequest
.
getEntityRequest
().
hasUploadId
())
{
addFileUpload
(
container
,
entity
,
updateRequest
.
getEntityRequest
());
final
FileProperties
uploadFile
=
fileTransmissionService
.
getUploadFile
(
updateRequest
.
getEntityRequest
().
getUploadId
());
if
(
uploadFile
==
null
)
{
entity
.
addError
(
ServerMessages
.
FILE_HAS_NOT_BEEN_UPLOAED
);
}
else
{
container
.
addFile
(
uploadFile
.
getTmpIdentifyer
(),
uploadFile
);
entity
.
getFileProperties
().
setTmpIdentifyer
(
uploadFile
.
getTmpIdentifyer
());
}
}
container
.
add
(
entity
);
container
.
add
(
entity
);
}
catch
(
final
NumberFormatException
e
)
{
}
catch
(
final
NumberFormatException
e
)
{
// ID wasn't an integer - we handle this below.
// ID wasn't an integer
return
failedWriteDueToStringId
(
requests
);
}
}
break
;
break
;
case
DELETE_REQUEST:
case
DELETE_REQUEST:
final
DeleteRequest
deleteRequest
=
request
.
getDeleteRequest
();
final
DeleteRequest
deleteRequest
=
sub_
request
.
getDeleteRequest
();
try
{
try
{
final
DeleteEntity
entity
=
new
DeleteEntity
(
getId
(
deleteRequest
.
getId
()));
final
DeleteEntity
entity
=
new
DeleteEntity
(
getId
(
deleteRequest
.
getId
()));
container
.
add
(
entity
);
container
.
add
(
entity
);
}
catch
(
final
NumberFormatException
e
)
{
}
catch
(
final
NumberFormatException
e
)
{
// ID wasn't an integer - we handle this below
// ID wasn't an integer
return
failedWriteDueToStringId
(
requests
);
}
}
break
;
break
;
default
:
default
:
throw
new
CaosDBException
(
throw
new
CaosDBException
(
"Cannot process a "
"Cannot process a "
+
request
.
getWrappedRequestsCase
().
name
()
+
sub_
request
.
getWrappedRequestsCase
().
name
()
+
" in a write request."
);
+
" in a write request."
);
}
}
}
}
// execute the transaction
final
WriteTransaction
transaction
=
new
WriteTransaction
(
container
);
final
WriteTransaction
transaction
=
new
WriteTransaction
(
container
);
transaction
.
setNoIdIsError
(
false
);
transaction
.
setNoIdIsError
(
false
);
transaction
.
execute
();
transaction
.
execute
();
// put inserted/updated/deleted entities back into the response
for
(
final
EntityInterface
entity
:
container
)
{
for
(
final
EntityInterface
entity
:
container
)
{
final
IdResponse
.
Builder
idResponse
=
IdResponse
.
newBuilder
();
final
IdResponse
.
Builder
idResponse
=
IdResponse
.
newBuilder
();
if
(
entity
.
getId
()
!=
null
)
{
if
(
entity
.
getId
()
!=
null
)
{
...
@@ -688,52 +672,83 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
...
@@ -688,52 +672,83 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
.
setDeleteResponse
(
DeleteResponse
.
newBuilder
().
setIdResponse
(
idResponse
));
.
setDeleteResponse
(
DeleteResponse
.
newBuilder
().
setIdResponse
(
idResponse
));
}
}
}
}
return
builder
.
build
();
}
/**
* Handle a request which contains string id (which cannot be converted to integer ids) and return
* a response which has the "ENTITY_DOES_NOT_EXIST" error for all entities with affected ids.
*
* @param request
* @return
*/
private
MultiTransactionResponse
failedWriteDueToStringId
(
final
MultiTransactionRequest
request
)
{
final
org
.
caosdb
.
api
.
entity
.
v1alpha1
.
MultiTransactionResponse
.
Builder
builder
=
MultiTransactionResponse
.
newBuilder
();
for
(
final
TransactionRequest
subRequest
:
request
.
getRequestsList
())
{
final
IdResponse
.
Builder
idResponse
=
IdResponse
.
newBuilder
();
switch
(
subRequest
.
getWrappedRequestsCase
())
{
case
INSERT_REQUEST:
builder
.
addResponsesBuilder
()
.
setInsertResponse
(
InsertResponse
.
newBuilder
().
setIdResponse
(
idResponse
));
// Add those entities which have not been processed because the have a string id
break
;
for
(
final
TransactionRequest
request
:
requests
.
getRequestsList
())
{
final
String
id
=
""
;
switch
(
request
.
getWrappedRequestsCase
())
{
case
UPDATE_REQUEST:
case
UPDATE_REQUEST:
final
UpdateRequest
updateRequest
=
r
equest
.
getUpdateRequest
();
final
UpdateRequest
updateRequest
=
subR
equest
.
getUpdateRequest
();
final
Entity
updateEntity
=
updateRequest
.
getEntityRequest
().
getEntity
();
final
Entity
updateEntity
=
updateRequest
.
getEntityRequest
().
getEntity
();
idResponse
.
setId
(
updateEntity
.
getId
());
try
{
try
{
final
UpdateEntity
entity
=
getId
(
updateEntity
.
getId
());
new
UpdateEntity
(
getId
(
updateEntity
.
getId
()),
convert
(
updateEntity
.
getRole
()));
entity
.
setName
(
updateEntity
.
getName
().
isEmpty
()
?
null
:
updateEntity
.
getName
());
container
.
add
(
entity
);
}
catch
(
final
NumberFormatException
e
)
{
}
catch
(
final
NumberFormatException
e
)
{
// ID wasn't an integer - we handle this below.
// ID wasn't an integer
idResponse
.
addErrors
(
convert
(
ServerMessages
.
ENTITY_DOES_NOT_EXIST
));
}
}
builder
.
addResponsesBuilder
()
.
setUpdateResponse
(
UpdateResponse
.
newBuilder
().
setIdResponse
(
idResponse
));
break
;
case
DELETE_REQUEST:
case
DELETE_REQUEST:
final
DeleteRequest
deleteRequest
=
request
.
getDeleteRequest
();
final
DeleteRequest
deleteRequest
=
subRequest
.
getDeleteRequest
();
idResponse
.
setId
(
deleteRequest
.
getId
());
try
{
try
{
final
DeleteEntity
entity
=
new
DeleteEntity
(
getId
(
deleteRequest
.
getId
()));
getId
(
deleteRequest
.
getId
());
container
.
add
(
entity
);
}
catch
(
final
NumberFormatException
e
)
{
}
catch
(
final
NumberFormatException
e
)
{
// ID wasn't an integer - we handle this below
// ID wasn't an integer
idResponse
.
addErrors
(
convert
(
ServerMessages
.
ENTITY_DOES_NOT_EXIST
));
}
}
default
:
builder
.
addResponsesBuilder
()
.
setDeleteResponse
(
DeleteResponse
.
newBuilder
().
setIdResponse
(
idResponse
));
break
;
break
;
}
default
:
if
(!
id
.
isBlank
())
{
throw
new
CaosDBException
(
try
{
"Cannot process a "
getId
(
id
);
+
subRequest
.
getWrappedRequestsCase
().
name
()
}
catch
(
final
NumberFormatException
e
)
{
+
" in a write request."
);
// ID wasn't an integer - the server doesn't support string id's yet, so that entity
// cannot exist.
final
IdResponse
.
Builder
idResponse
=
IdResponse
.
newBuilder
().
setId
(
id
);
idResponse
.
addErrors
(
convert
(
ServerMessages
.
ENTITY_DOES_NOT_EXIST
));
builder
.
addResponses
(
TransactionResponse
.
newBuilder
()
.
setDeleteResponse
(
DeleteResponse
.
newBuilder
().
setIdResponse
(
idResponse
)));
}
}
}
}
}
return
builder
.
build
();
return
builder
.
build
();
}
}
private
void
addFileUpload
(
final
WritableContainer
container
,
final
EntityInterface
entity
,
final
EntityRequest
entityRequest
)
{
if
(
entityRequest
.
hasUploadId
())
{
final
FileProperties
uploadFile
=
fileTransmissionService
.
getUploadFile
(
entityRequest
.
getUploadId
());
if
(
uploadFile
==
null
)
{
entity
.
addError
(
ServerMessages
.
FILE_HAS_NOT_BEEN_UPLOAED
);
}
else
{
container
.
addFile
(
uploadFile
.
getTmpIdentifyer
(),
uploadFile
);
entity
.
getFileProperties
().
setTmpIdentifyer
(
uploadFile
.
getTmpIdentifyer
());
}
}
}
private
Role
convert
(
final
EntityRole
role
)
{
private
Role
convert
(
final
EntityRole
role
)
{
switch
(
role
)
{
switch
(
role
)
{
case
ENTITY_ROLE_FILE:
case
ENTITY_ROLE_FILE:
...
@@ -794,6 +809,7 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
...
@@ -794,6 +809,7 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
}
}
private
EntityInterface
convert
(
final
Entity
from
,
final
EntityInterface
entity
)
{
private
EntityInterface
convert
(
final
Entity
from
,
final
EntityInterface
entity
)
{
entity
.
setName
(
from
.
getName
().
isEmpty
()
?
null
:
from
.
getName
());
entity
.
setDescription
(
from
.
getDescription
().
isBlank
()
?
null
:
from
.
getDescription
());
entity
.
setDescription
(
from
.
getDescription
().
isBlank
()
?
null
:
from
.
getDescription
());
if
(!
from
.
getUnit
().
isBlank
())
{
if
(!
from
.
getUnit
().
isBlank
())
{
entity
.
addProperty
(
getUnit
(
from
.
getUnit
()));
entity
.
addProperty
(
getUnit
(
from
.
getUnit
()));
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment