55import java .util .Stack ;
66import java .util .concurrent .ConcurrentHashMap ;
77
8- import org .apache .commons .io .monitor .FileAlterationListener ;
8+ import org .apache .commons .io .monitor .FileAlterationListenerAdaptor ;
99import org .apache .commons .io .monitor .FileAlterationMonitor ;
1010import org .apache .commons .io .monitor .FileAlterationObserver ;
1111import org .osgi .service .component .annotations .Activate ;
2121import com .enonic .xp .app .Application ;
2222import com .enonic .xp .app .ApplicationKey ;
2323import com .enonic .xp .app .ApplicationService ;
24- import com .enonic .xp .server . ServerInfo ;
24+ import com .enonic .xp .home . HomeDir ;
2525
2626@ Component (configurationPid = "com.enonic.xp.server.deploy" , service = {DeployDirectoryWatcher .class })
2727public final class DeployDirectoryWatcher
28- implements FileAlterationListener
2928{
3029 private static final Logger LOGGER = LoggerFactory .getLogger ( DeployDirectoryWatcher .class );
3130
3231 private final Map <String , ApplicationKey > applicationKeyByPath = new ConcurrentHashMap <>();
3332
3433 private final Map <ApplicationKey , Stack <String >> pathsByApplicationKey = new ConcurrentHashMap <>();
3534
36- private ApplicationService applicationService ;
35+ private final ApplicationService applicationService ;
3736
38- private FileAlterationMonitor monitor ;
37+ private final long interval ;
3938
40- private long interval ;
39+ private volatile FileAlterationMonitor monitor ;
4140
4241 @ Activate
43- public void activate ( final DeployConfig config )
44- throws Exception
42+ public DeployDirectoryWatcher ( @ Reference final ApplicationService applicationService , final DeployConfig config )
4543 {
46- interval = config .interval ();
44+ this .applicationService = applicationService ;
45+ this .interval = config .interval ();
4746 }
4847
4948 public void deploy ()
5049 throws Exception
5150 {
52- final FileAlterationObserver observer1 = addListenerDir ( getDeployFolder () );
53- this .monitor = new FileAlterationMonitor ( interval , observer1 );
51+ final FileAlterationObserver observer = FileAlterationObserver .builder ()
52+ .setFile ( HomeDir .get ().toPath ().resolve ( "deploy" ).toFile () )
53+ .setFileFilter ( DeployDirectoryWatcher ::isJarFile )
54+ .get ();
55+ observer .addListener ( new Listener () );
56+ this .monitor = new FileAlterationMonitor ( interval , observer );
5457 this .monitor .start ();
5558 }
5659
57- private FileAlterationObserver addListenerDir ( final File dir )
58- throws Exception
59- {
60- final FileAlterationObserver observer = new FileAlterationObserver ( dir , this ::isJarFile );
61- observer .addListener ( this );
62-
63- installApps ( dir );
64- return observer ;
65- }
66-
67- private void installApps ( final File dir )
68- throws Exception
69- {
70- if ( !dir .exists () )
71- {
72- return ;
73- }
74-
75- final File [] files = dir .listFiles ( this ::isJarFile );
76- if ( files == null )
77- {
78- return ;
79- }
80-
81- for ( final File file : files )
82- {
83- try
84- {
85- installApplication ( file );
86- }
87- catch ( Exception e )
88- {
89- LOGGER .error ( "Failed to install local application [" + file .getName () + "]" , e );
90- }
91- }
92- }
93-
94- private boolean isJarFile ( final File file )
60+ private static boolean isJarFile ( final File file )
9561 {
9662 return file .getName ().endsWith ( ".jar" ) && file .isFile ();
9763 }
@@ -106,70 +72,77 @@ public void deactivate()
10672 }
10773 }
10874
109- @ Override
110- public void onStart ( final FileAlterationObserver fileAlterationObserver )
75+ private class Listener
76+ extends FileAlterationListenerAdaptor
11177 {
112- }
113-
114- @ Override
115- public void onDirectoryCreate ( final File file )
116- {
117- }
118-
119- @ Override
120- public void onDirectoryChange ( final File file )
121- {
122- }
78+ @ Override
79+ public void onStart ( final FileAlterationObserver observer )
80+ {
81+ final File dir = observer .getDirectory ();
82+ if ( !dir .exists () )
83+ {
84+ return ;
85+ }
12386
124- @ Override
125- public void onDirectoryDelete ( final File file )
126- {
127- }
87+ final File [] files = dir .listFiles ( DeployDirectoryWatcher ::isJarFile );
88+ if ( files == null )
89+ {
90+ return ;
91+ }
12892
129- @ Override
130- public void onFileCreate ( final File file )
131- {
132- try
133- {
134- installApplication ( file );
135- }
136- catch ( Exception e )
137- {
138- LOGGER .error ( "Failed to install local application" , e );
93+ for ( final File file : files )
94+ {
95+ try
96+ {
97+ installApplication ( file );
98+ }
99+ catch ( Exception e )
100+ {
101+ LOGGER .error ( "Failed to install local application [{}]" , file .getName (), e );
102+ }
103+ }
139104 }
140- }
141105
142- @ Override
143- public void onFileChange ( final File file )
144- {
145- try
106+ @ Override
107+ public void onFileCreate ( final File file )
146108 {
147- installApplication ( file );
148- }
149- catch ( Exception e )
150- {
151- LOGGER .error ( "Failed to install local application" , e );
109+ try
110+ {
111+ installApplication ( file );
112+ }
113+ catch ( Exception e )
114+ {
115+ LOGGER .error ( "Failed to install local application" , e );
116+ }
152117 }
153- }
154118
155- @ Override
156- public void onFileDelete ( final File file )
157- {
158- try
119+ @ Override
120+ public void onFileChange ( final File file )
159121 {
160- uninstallApplication ( file );
122+ try
123+ {
124+ installApplication ( file );
125+ }
126+ catch ( Exception e )
127+ {
128+ LOGGER .error ( "Failed to install local application" , e );
129+ }
161130 }
162- catch ( Exception e )
131+
132+ @ Override
133+ public void onFileDelete ( final File file )
163134 {
164- LOGGER .error ( "Failed to uninstall local application" , e );
135+ try
136+ {
137+ uninstallApplication ( file );
138+ }
139+ catch ( Exception e )
140+ {
141+ LOGGER .error ( "Failed to uninstall local application" , e );
142+ }
165143 }
166144 }
167145
168- @ Override
169- public void onStop ( final FileAlterationObserver fileAlterationObserver )
170- {
171- }
172-
173146 private void installApplication ( final File file )
174147 {
175148 //Installs the application
@@ -226,7 +199,7 @@ private void uninstallApplication( final File file )
226199 }
227200 catch ( Exception e )
228201 {
229- LOGGER .warn ( "Failed to reinstall local application [" + previousInstalledFile + "]" , e );
202+ LOGGER .warn ( "Failed to reinstall local application [{}]" , previousInstalledFile , e );
230203 }
231204 } );
232205 }
@@ -239,16 +212,4 @@ private void uninstallApplication( final File file )
239212 return fileNameStack .isEmpty () ? null : fileNameStack ;
240213 } );
241214 }
242-
243- @ Reference
244- public void setApplicationService ( final ApplicationService applicationService )
245- {
246- this .applicationService = applicationService ;
247- }
248-
249- private static File getDeployFolder ()
250- {
251- final File homeDir = ServerInfo .get ().getHomeDir ();
252- return new File ( homeDir , "deploy" );
253- }
254215}
0 commit comments