55import com .here .naksha .cli .results .CommandSuccess ;
66import naksha .base .StringList ;
77import naksha .model .IStorage ;
8+ import naksha .model .NakshaError ;
89import naksha .model .NakshaException ;
910import naksha .model .SessionOptions ;
11+ import naksha .model .objects .NakshaCollection ;
1012import naksha .model .objects .NakshaFeature ;
13+ import naksha .model .objects .NakshaMap ;
1114import naksha .model .request .*;
1215import org .jetbrains .annotations .NotNull ;
16+ import org .slf4j .Logger ;
17+ import org .slf4j .LoggerFactory ;
1318
1419import java .util .List ;
1520
1621import static naksha .model .util .RequestHelper .createFeaturesRequest ;
1722import static naksha .model .util .ResultHelper .extractResponseItems ;
1823
1924public final class CopyService {
25+ private static final Logger logger = LoggerFactory .getLogger (CopyService .class );
2026 private final SessionOptions sessionOptions ;
2127 private final StorageProvider storageProvider ;
2228
@@ -31,11 +37,16 @@ public CopyService(
3137 @ NotNull
3238 public CommandResult <CopyServiceSuccessResultPayload , CopyServiceException > copy (
3339 @ NotNull CopyElement src ,
34- @ NotNull CopyElement target
40+ @ NotNull CopyElement target ,
41+ boolean autoCreateTarget
3542 ) {
3643 try {
44+ IStorage targetStorage = useTargetStorage (target );
45+ if (autoCreateTarget ) {
46+ createTarget (targetStorage , target );
47+ }
3748 List <NakshaFeature > features = readFeaturesFromSrc (src );
38- SuccessResponse _ = writeFeaturesToTarget (features , target );
49+ writeFeaturesToTarget (features , target , targetStorage );
3950 return new CommandSuccess <>(buildSuccessResultPayload (features ));
4051 } catch (CopyServiceException exception ) {
4152 return new CommandFailure <>(exception );
@@ -48,36 +59,117 @@ private List<NakshaFeature> readFeaturesFromSrc(
4859 IStorage storage = useSrcStorage (source );
4960 ReadFeatures readFeatures = createReadFeaturesRequest (source );
5061 Response response = performReadRequest (storage , readFeatures );
51-
52- return switch (response ) {
53- case SuccessResponse successResponse -> extractResponseItems (successResponse , NakshaFeature .class );
54- case ErrorResponse errorResponse -> throw new CopyServiceException (
55- "Problem with reading from source!" ,
56- new NakshaException (errorResponse .getError ())
57- );
58- default -> throw new CopyServiceException ("Unexpected response from source!" );
59- };
62+ SuccessResponse successResponse = requireSourceSuccessResponse (response );
63+ return extractResponseItems (successResponse , NakshaFeature .class );
6064 }
6165
62- private SuccessResponse writeFeaturesToTarget (
66+ private void writeFeaturesToTarget (
6367 List <NakshaFeature > features ,
64- CopyElement target
68+ CopyElement target ,
69+ IStorage storage
70+ ) throws CopyServiceException {
71+ Response response = performCreateFeaturesRequest (storage , target , features );
72+ requireTargetSuccessResponse (response );
73+ }
74+
75+ private Response performCreateFeaturesRequest (
76+ IStorage storage , CopyElement target , List <NakshaFeature > features
6577 ) throws CopyServiceException {
66- IStorage storage = useTargetStorage (target );
67- WriteRequest writeRequest = createFeaturesRequest (
68- target .getMapId (),
69- target .getCollectionId (),
70- features
78+ WriteRequest addFeaturesRequest = createFeaturesRequest (target .getMapId (), target .getCollectionId (), features );
79+ return performWriteRequest (storage , addFeaturesRequest );
80+ }
81+
82+ private void createTarget (IStorage storage , CopyElement target ) throws CopyServiceException {
83+ if (target .getMapId () == null ) {
84+ throw new CopyServiceException ("Target's mapId should not be null!" );
85+ }
86+ if (target .getCollectionId () == null ) {
87+ throw new CopyServiceException ("Target's collectionId should not be null!" );
88+ }
89+ createMapIfAbsent (storage , target .getMapId ());
90+ createCollectionIfAbsent (storage , target );
91+ }
92+
93+ private void createMapIfAbsent (IStorage storage , String mapId ) throws CopyServiceException {
94+ Response response = performCreateMapRequest (storage , mapId );
95+ switch (response ) {
96+ case SuccessResponse _ -> logger .info (
97+ "Map(id: \" {}\" ) was successfully created on storage(id: \" {}\" )!" , mapId , storage .getId ()
98+ );
99+ case ErrorResponse errorResponse -> {
100+ NakshaError nakshaError = errorResponse .getError ();
101+ if (!nakshaError .getCode ().equals (NakshaError .MAP_EXISTS )) {
102+ throw new CopyServiceException ("Problem with creating map!" , new NakshaException (nakshaError ));
103+ }
104+ logger .info ("Map(id: \" {}\" ) is already present on storage(id: \" {}\" )!" , mapId , storage .getId ());
105+ }
106+ default -> throw new CopyServiceException ("Unexpected response while creating map!" );
107+ }
108+ }
109+
110+ private void createCollectionIfAbsent (IStorage storage , CopyElement target ) throws CopyServiceException {
111+ Response response = performCreateCollectionRequest (storage , target );
112+ switch (response ) {
113+ case SuccessResponse _ -> logger .info (
114+ "Collection(id: \" {}\" ) was successfully created in map(id: \" {}\" ) on storage(id: \" {}\" )!" ,
115+ target .getCollectionId (),
116+ target .getMapId (),
117+ storage .getId ()
118+ );
119+ case ErrorResponse errorResponse -> {
120+ NakshaError nakshaError = errorResponse .getError ();
121+ if (!nakshaError .getCode ().equals (NakshaError .COLLECTION_EXISTS )) {
122+ throw new CopyServiceException ("Problem with creating collection!" , new NakshaException (nakshaError ));
123+ }
124+ logger .info (
125+ "Collection(id: \" {}\" ) is already present in map(id: \" {}\" ) on storage(id: \" {}\" )!" ,
126+ target .getCollectionId (),
127+ target .getMapId (),
128+ storage .getId ()
129+ );
130+ }
131+ default -> throw new CopyServiceException ("Unexpected response while creating collection!" );
132+ }
133+ }
134+
135+ private Response performCreateMapRequest (IStorage storage , String mapId ) throws CopyServiceException {
136+ WriteRequest createMapRequest = buildCreateMapRequest (mapId );
137+ return performWriteRequest (storage , createMapRequest );
138+ }
139+
140+ private Response performCreateCollectionRequest (IStorage storage , CopyElement target ) throws CopyServiceException {
141+ WriteRequest createCollectionRequest = buildCreateCollectionRequest (target );
142+ return performWriteRequest (storage , createCollectionRequest );
143+ }
144+
145+ private SuccessResponse requireTargetSuccessResponse (Response response ) throws CopyServiceException {
146+ return requireSuccessResponse (
147+ response ,
148+ "Problem with writing to target!" ,
149+ "Unexpected response from target!"
71150 );
72- Response response = performWriteRequest ( storage , writeRequest );
151+ }
73152
153+ private SuccessResponse requireSourceSuccessResponse (Response response ) throws CopyServiceException {
154+ return requireSuccessResponse (
155+ response ,
156+ "Problem with reading from source!" ,
157+ "Unexpected response from source!"
158+ );
159+ }
160+
161+ private SuccessResponse requireSuccessResponse (
162+ Response response ,
163+ String errorResponseExceptionMessage ,
164+ String unexpectedResponseExceptionMessage
165+ ) throws CopyServiceException {
74166 return switch (response ) {
75167 case SuccessResponse successResponse -> successResponse ;
76168 case ErrorResponse errorResponse -> throw new CopyServiceException (
77- "Problem with writing to target!" ,
169+ errorResponseExceptionMessage ,
78170 new NakshaException (errorResponse .getError ())
79171 );
80- default -> throw new CopyServiceException ("Unexpected response from target!" );
172+ default -> throw new CopyServiceException (unexpectedResponseExceptionMessage );
81173 };
82174 }
83175
@@ -139,4 +231,21 @@ private Response performReadRequest(IStorage storage, Request request) throws Co
139231 throw new CopyServiceException ("Problem while reading features from source!" , e );
140232 }
141233 }
234+
235+ private WriteRequest buildCreateMapRequest (String mapId ) {
236+ WriteRequest writeRequest = new WriteRequest ();
237+ NakshaMap map = new NakshaMap (mapId );
238+ Write write = new Write ().createMap (map );
239+ writeRequest .add (write );
240+ return writeRequest ;
241+ }
242+
243+ private WriteRequest buildCreateCollectionRequest (CopyElement target ) {
244+ WriteRequest writeRequest = new WriteRequest ();
245+ NakshaCollection collection = new NakshaCollection (target .getCollectionId ())
246+ .withMapId (target .getMapId ());
247+ Write write = new Write ().createCollection (collection );
248+ writeRequest .add (write );
249+ return writeRequest ;
250+ }
142251}
0 commit comments