1010import com .marklogic .client .document .JSONDocumentManager ;
1111import com .marklogic .client .document .XMLDocumentManager ;
1212import com .marklogic .client .ext .modulesloader .Modules ;
13+ import com .marklogic .client .ext .modulesloader .ModulesManager ;
1314import com .marklogic .client .ext .modulesloader .impl .AssetFileLoader ;
1415import com .marklogic .client .ext .modulesloader .impl .DefaultModulesLoader ;
1516import com .marklogic .client .ext .modulesloader .impl .PropertiesModuleManager ;
1920import com .marklogic .client .io .Format ;
2021import com .marklogic .client .io .StringHandle ;
2122import com .marklogic .com .marklogic .client .ext .file .CacheBusterDocumentFileProcessor ;
23+ import com .marklogic .com .marklogic .client .ext .modulesloader .impl .EntityDefModulesFinder ;
2224import com .marklogic .com .marklogic .client .ext .modulesloader .impl .UserModulesFinder ;
2325import com .marklogic .hub .FlowManager ;
2426import com .marklogic .hub .HubConfig ;
25- import com .marklogic .com .marklogic .client .ext .modulesloader .impl .EntityDefModulesFinder ;
2627import com .marklogic .hub .deploy .util .HubFileFilter ;
2728import com .marklogic .hub .error .LegacyFlowsException ;
2829import com .marklogic .hub .flow .Flow ;
2930import org .apache .commons .io .IOUtils ;
3031import org .springframework .core .io .Resource ;
3132import org .springframework .scheduling .concurrent .ThreadPoolTaskExecutor ;
3233
33- import java .io .File ;
3434import java .io .IOException ;
3535import java .io .InputStream ;
3636import java .nio .file .FileVisitResult ;
3737import java .nio .file .Files ;
3838import java .nio .file .Path ;
3939import java .nio .file .SimpleFileVisitor ;
4040import java .nio .file .attribute .BasicFileAttributes ;
41+ import java .util .Date ;
4142import java .util .List ;
4243import java .util .regex .Pattern ;
4344
@@ -109,6 +110,14 @@ boolean isEntityDir(Path dir, Path startPath) {
109110 return dirStr .matches (regex );
110111 }
111112
113+ boolean isFlowPropertiesFile (Path dir ) {
114+ Path parent = dir .getParent ();
115+ return dir .toFile ().isFile () &&
116+ dir .getFileName ().toString ().endsWith (".properties" ) &&
117+ parent .toString ().matches (".*[/\\ \\ ](input|harmonize)[/\\ \\ ][^/\\ \\ ]+$" ) &&
118+ dir .getFileName ().toString ().equals (parent .getFileName ().toString () + ".properties" );
119+ }
120+
112121 @ Override
113122 public void execute (CommandContext context ) {
114123 FlowManager flowManager = new FlowManager (hubConfig );
@@ -143,14 +152,7 @@ public void execute(CommandContext context) {
143152 XMLDocumentManager documentManager = hubConfig .newModulesDbClient ().newXMLDocumentManager ();
144153 DocumentWriteSet documentWriteSet = documentManager .newWriteSet ();
145154
146- for (Flow flow : flows ) {
147- StringHandle handle = new StringHandle (flow .serialize ());
148- handle .setFormat (Format .XML );
149- documentWriteSet .add (flow .getFlowDbPath (), handle );
150- }
151- if (documentWriteSet .size () > 0 ) {
152- documentManager .write (documentWriteSet );
153- }
155+ ModulesManager modulesManager = modulesLoader .getModulesManager ();
154156
155157 Files .walkFileTree (startPath , new SimpleFileVisitor <Path >() {
156158 @ Override
@@ -173,18 +175,39 @@ else if (isEntityDir(dir, startPath.toAbsolutePath())) {
173175 meta .getCollections ().add ("http://marklogic.com/entity-services/models" );
174176 documentPermissionsParser .parsePermissions (hubConfig .modulePermissions , meta .getPermissions ());
175177 for (Resource r : modules .getAssets ()) {
176- InputStream inputStream = r .getInputStream ();
177- StringHandle handle = new StringHandle (IOUtils .toString (inputStream ));
178- inputStream .close ();
179- entityDocMgr .write ("/entities/" + r .getFilename (), meta , handle );
178+ if (modulesManager .hasFileBeenModifiedSinceLastLoaded (r .getFile ())) {
179+ InputStream inputStream = r .getInputStream ();
180+ StringHandle handle = new StringHandle (IOUtils .toString (inputStream ));
181+ inputStream .close ();
182+ entityDocMgr .write ("/entities/" + r .getFilename (), meta , handle );
183+ modulesManager .saveLastLoadedTimestamp (r .getFile (), new Date ());
184+ }
180185 }
181186 return FileVisitResult .CONTINUE ;
182187 }
183188 else {
184189 return FileVisitResult .CONTINUE ;
185190 }
186191 }
192+
193+ @ Override
194+ public FileVisitResult visitFile (Path file , BasicFileAttributes attrs )
195+ throws IOException
196+ {
197+ if (isFlowPropertiesFile (file ) && modulesManager .hasFileBeenModifiedSinceLastLoaded (file .toFile ())) {
198+ Flow flow = flowManager .getFlowFromProperties (file );
199+ StringHandle handle = new StringHandle (flow .serialize ());
200+ handle .setFormat (Format .XML );
201+ documentWriteSet .add (flow .getFlowDbPath (), handle );
202+ modulesManager .saveLastLoadedTimestamp (file .toFile (), new Date ());
203+ }
204+ return FileVisitResult .CONTINUE ;
205+ }
187206 });
207+
208+ if (documentWriteSet .size () > 0 ) {
209+ documentManager .write (documentWriteSet );
210+ }
188211 }
189212 threadPoolTaskExecutor .shutdown ();
190213 } catch (IOException e ) {
0 commit comments