@Override public void onChange(Set<ChangedFiles> directories) { directories.stream() .map(ChangedFiles::getFiles) .flatMap(Set::stream) .map(ChangedFile::getFile) .filter(File::exists) .forEach(f -> { if (isGzipFile(f)) { try { GzipFileReader.read(f, this::openFilePcapStream); } catch (Exception e) { logger.error("Got exception...", e); } } else { openFilePcapStream(f); } }); }
private void testSendsEvent(boolean restart) { ClassPathFileChangeListener listener = new ClassPathFileChangeListener( this.eventPublisher, this.restartStrategy, this.fileSystemWatcher); File folder = new File("s1"); File file = new File("f1"); ChangedFile file1 = new ChangedFile(folder, file, ChangedFile.Type.ADD); ChangedFile file2 = new ChangedFile(folder, file, ChangedFile.Type.ADD); Set<ChangedFile> files = new LinkedHashSet<ChangedFile>(); files.add(file1); files.add(file2); ChangedFiles changedFiles = new ChangedFiles(new File("source"), files); Set<ChangedFiles> changeSet = Collections.singleton(changedFiles); if (restart) { given(this.restartStrategy.isRestartRequired(file2)).willReturn(true); } listener.onChange(changeSet); verify(this.eventPublisher).publishEvent(this.eventCaptor.capture()); ClassPathChangedEvent actualEvent = (ClassPathChangedEvent) this.eventCaptor .getValue(); assertThat(actualEvent.getChangeSet()).isEqualTo(changeSet); assertThat(actualEvent.isRestartRequired()).isEqualTo(restart); }
private void testSendsEvent(boolean restart) { ClassPathFileChangeListener listener = new ClassPathFileChangeListener( this.eventPublisher, this.restartStrategy, this.fileSystemWatcher); File folder = new File("s1"); File file = new File("f1"); ChangedFile file1 = new ChangedFile(folder, file, ChangedFile.Type.ADD); ChangedFile file2 = new ChangedFile(folder, file, ChangedFile.Type.ADD); Set<ChangedFile> files = new LinkedHashSet<ChangedFile>(); files.add(file1); files.add(file2); ChangedFiles changedFiles = new ChangedFiles(new File("source"), files); Set<ChangedFiles> changeSet = Collections.singleton(changedFiles); if (restart) { given(this.restartStrategy.isRestartRequired(file2)).willReturn(true); } listener.onChange(changeSet); verify(this.eventPublisher).publishEvent(this.eventCaptor.capture()); ClassPathChangedEvent actualEvent = (ClassPathChangedEvent) this.eventCaptor .getValue(); assertThat(actualEvent.getChangeSet(), equalTo(changeSet)); assertThat(actualEvent.isRestartRequired(), equalTo(restart)); }
private ClassLoaderFiles getClassLoaderFiles(ClassPathChangedEvent event) throws IOException { ClassLoaderFiles files = new ClassLoaderFiles(); for (ChangedFiles changedFiles : event.getChangeSet()) { String sourceFolder = changedFiles.getSourceFolder().getAbsolutePath(); for (ChangedFile changedFile : changedFiles) { files.addFile(sourceFolder, changedFile.getRelativeName(), asClassLoaderFile(changedFile)); } } return files; }
private boolean isRestartRequired(Set<ChangedFiles> changeSet) { if (AgentReloader.isActive()) { return false; } for (ChangedFiles changedFiles : changeSet) { for (ChangedFile changedFile : changedFiles) { if (this.restartStrategy.isRestartRequired(changedFile)) { return true; } } } return false; }
/** * Create a new {@link ClassPathChangedEvent}. * @param source the source of the event * @param changeSet the changed files * @param restartRequired if a restart is required due to the change */ public ClassPathChangedEvent(Object source, Set<ChangedFiles> changeSet, boolean restartRequired) { super(source); Assert.notNull(changeSet, "ChangeSet must not be null"); this.changeSet = changeSet; this.restartRequired = restartRequired; }
@Test public void liveReloadTriggeredOnClassPathChangeWithoutRestart() throws Exception { this.context = initializeAndRun(ConfigWithMockLiveReload.class); LiveReloadServer server = this.context.getBean(LiveReloadServer.class); reset(server); ClassPathChangedEvent event = new ClassPathChangedEvent(this.context, Collections.<ChangedFiles>emptySet(), false); this.context.publishEvent(event); verify(server).triggerReload(); }
@Test public void liveReloadNotTriggeredOnClassPathChangeWithRestart() throws Exception { this.context = initializeAndRun(ConfigWithMockLiveReload.class); LiveReloadServer server = this.context.getBean(LiveReloadServer.class); reset(server); ClassPathChangedEvent event = new ClassPathChangedEvent(this.context, Collections.<ChangedFiles>emptySet(), true); this.context.publishEvent(event); verify(server, never()).triggerReload(); }
@Test public void restartTriggeredOnClassPathChangeWithRestart() throws Exception { this.context = initializeAndRun(Config.class); ClassPathChangedEvent event = new ClassPathChangedEvent(this.context, Collections.<ChangedFiles>emptySet(), true); this.context.publishEvent(event); verify(this.mockRestarter.getMock()).restart(any(FailureHandler.class)); }
@Test public void restartNotTriggeredOnClassPathChangeWithRestart() throws Exception { this.context = initializeAndRun(Config.class); ClassPathChangedEvent event = new ClassPathChangedEvent(this.context, Collections.<ChangedFiles>emptySet(), false); this.context.publishEvent(event); verify(this.mockRestarter.getMock(), never()).restart(); }
private ClassPathChangedEvent createClassPathChangedEvent(File sourceFolder) throws IOException { Set<ChangedFile> files = new LinkedHashSet<ChangedFile>(); File file1 = createFile(sourceFolder, "File1"); File file2 = createFile(sourceFolder, "File2"); File file3 = createFile(sourceFolder, "File3"); files.add(new ChangedFile(sourceFolder, file1, Type.ADD)); files.add(new ChangedFile(sourceFolder, file2, Type.MODIFY)); files.add(new ChangedFile(sourceFolder, file3, Type.DELETE)); Set<ChangedFiles> changeSet = new LinkedHashSet<ChangedFiles>(); changeSet.add(new ChangedFiles(sourceFolder, files)); ClassPathChangedEvent event = new ClassPathChangedEvent(this, changeSet, false); return event; }
@Test public void liveReloadOnClassPathChanged() throws Exception { configure(); Set<ChangedFiles> changeSet = new HashSet<ChangedFiles>(); ClassPathChangedEvent event = new ClassPathChangedEvent(this, changeSet, false); this.context.publishEvent(event); LiveReloadConfiguration configuration = this.context .getBean(LiveReloadConfiguration.class); configuration.getExecutor().shutdown(); configuration.getExecutor().awaitTermination(2, TimeUnit.SECONDS); LiveReloadServer server = this.context.getBean(LiveReloadServer.class); verify(server).triggerReload(); }
@Test public void getChangeSet() throws Exception { Set<ChangedFiles> changeSet = new LinkedHashSet<ChangedFiles>(); ClassPathChangedEvent event = new ClassPathChangedEvent(this.source, changeSet, false); assertThat(event.getChangeSet()).isSameAs(changeSet); }
@Test public void getRestartRequired() throws Exception { Set<ChangedFiles> changeSet = new LinkedHashSet<ChangedFiles>(); ClassPathChangedEvent event; event = new ClassPathChangedEvent(this.source, changeSet, false); assertThat(event.isRestartRequired()).isFalse(); event = new ClassPathChangedEvent(this.source, changeSet, true); assertThat(event.isRestartRequired()).isTrue(); }
@Test public void sendsClassLoaderFiles() throws Exception { File sourceFolder = this.temp.newFolder(); Set<ChangedFile> files = new LinkedHashSet<ChangedFile>(); File file1 = createFile(sourceFolder, "File1"); File file2 = createFile(sourceFolder, "File2"); File file3 = createFile(sourceFolder, "File3"); files.add(new ChangedFile(sourceFolder, file1, Type.ADD)); files.add(new ChangedFile(sourceFolder, file2, Type.MODIFY)); files.add(new ChangedFile(sourceFolder, file3, Type.DELETE)); Set<ChangedFiles> changeSet = new LinkedHashSet<ChangedFiles>(); changeSet.add(new ChangedFiles(sourceFolder, files)); ClassPathChangedEvent event = new ClassPathChangedEvent(this, changeSet, false); this.requestFactory.willRespond(HttpStatus.OK); this.uploader.onApplicationEvent(event); MockClientHttpRequest request = this.requestFactory.getExecutedRequests().get(0); ClassLoaderFiles classLoaderFiles = deserialize(request.getBodyAsBytes()); Collection<SourceFolder> sourceFolders = classLoaderFiles.getSourceFolders(); assertThat(sourceFolders.size()).isEqualTo(1); SourceFolder classSourceFolder = sourceFolders.iterator().next(); assertThat(classSourceFolder.getName()).isEqualTo(sourceFolder.getAbsolutePath()); Iterator<ClassLoaderFile> classFiles = classSourceFolder.getFiles().iterator(); assertClassFile(classFiles.next(), "File1", ClassLoaderFile.Kind.ADDED); assertClassFile(classFiles.next(), "File2", ClassLoaderFile.Kind.MODIFIED); assertClassFile(classFiles.next(), null, ClassLoaderFile.Kind.DELETED); assertThat(classFiles.hasNext()).isFalse(); }
@Test public void liveReloadTriggerdOnClassPathChangeWithoutRestart() throws Exception { this.context = initializeAndRun(ConfigWithMockLiveReload.class); LiveReloadServer server = this.context.getBean(LiveReloadServer.class); reset(server); ClassPathChangedEvent event = new ClassPathChangedEvent(this.context, Collections.<ChangedFiles>emptySet(), false); this.context.publishEvent(event); verify(server).triggerReload(); }
@Test public void liveReloadNotTriggerdOnClassPathChangeWithRestart() throws Exception { this.context = initializeAndRun(ConfigWithMockLiveReload.class); LiveReloadServer server = this.context.getBean(LiveReloadServer.class); reset(server); ClassPathChangedEvent event = new ClassPathChangedEvent(this.context, Collections.<ChangedFiles>emptySet(), true); this.context.publishEvent(event); verify(server, never()).triggerReload(); }
@Test public void sendsClassLoaderFiles() throws Exception { File sourceFolder = this.temp.newFolder(); Set<ChangedFile> files = new LinkedHashSet<ChangedFile>(); File file1 = createFile(sourceFolder, "File1"); File file2 = createFile(sourceFolder, "File2"); File file3 = createFile(sourceFolder, "File3"); files.add(new ChangedFile(sourceFolder, file1, Type.ADD)); files.add(new ChangedFile(sourceFolder, file2, Type.MODIFY)); files.add(new ChangedFile(sourceFolder, file3, Type.DELETE)); Set<ChangedFiles> changeSet = new LinkedHashSet<ChangedFiles>(); changeSet.add(new ChangedFiles(sourceFolder, files)); ClassPathChangedEvent event = new ClassPathChangedEvent(this, changeSet, false); this.requestFactory.willRespond(HttpStatus.OK); this.uploader.onApplicationEvent(event); MockClientHttpRequest request = this.requestFactory.getExecutedRequests().get(0); ClassLoaderFiles classLoaderFiles = deserialize(request.getBodyAsBytes()); Collection<SourceFolder> sourceFolders = classLoaderFiles.getSourceFolders(); assertThat(sourceFolders.size(), equalTo(1)); SourceFolder classSourceFolder = sourceFolders.iterator().next(); assertThat(classSourceFolder.getName(), equalTo(sourceFolder.getAbsolutePath())); Iterator<ClassLoaderFile> classFiles = classSourceFolder.getFiles().iterator(); assertClassFile(classFiles.next(), "File1", ClassLoaderFile.Kind.ADDED); assertClassFile(classFiles.next(), "File2", ClassLoaderFile.Kind.MODIFIED); assertClassFile(classFiles.next(), null, ClassLoaderFile.Kind.DELETED); assertThat(classFiles.hasNext(), equalTo(false)); }
@Test public void getChangeSet() throws Exception { Set<ChangedFiles> changeSet = new LinkedHashSet<ChangedFiles>(); ClassPathChangedEvent event = new ClassPathChangedEvent(this.source, changeSet, false); assertThat(event.getChangeSet(), sameInstance(changeSet)); }
@Test public void getRestartRequired() throws Exception { Set<ChangedFiles> changeSet = new LinkedHashSet<ChangedFiles>(); ClassPathChangedEvent event; event = new ClassPathChangedEvent(this.source, changeSet, false); assertThat(event.isRestartRequired(), equalTo(false)); event = new ClassPathChangedEvent(this.source, changeSet, true); assertThat(event.isRestartRequired(), equalTo(true)); }
@Override public void onChange(Set<ChangedFiles> changeSet) { this.latch.countDown(); }
@Override public void onChange(Set<ChangedFiles> changeSet) { boolean restart = isRestartRequired(changeSet); publishEvent(new ClassPathChangedEvent(this, changeSet, restart)); }