Skip to content

Commit

Permalink
[DROOLS-384] add a KieScannersRegistry plus methods to read KieScanne…
Browse files Browse the repository at this point in the history
…r status
  • Loading branch information
mariofusco committed Dec 20, 2013
1 parent decbe02 commit d90c02e
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,21 @@

public interface InternalKieScanner extends KieScanner {

public enum Status {
STARTING, SCANNING, UPDATING, RUNNING, STOPPED;
}

void setKieContainer(KieContainer kieContainer);

KieModule loadArtifact(ReleaseId releaseId);

KieModule loadArtifact(ReleaseId releaseId, InputStream pomXML);

String getArtifactVersion(ReleaseId releaseId);

ReleaseId getScannerReleaseId();

ReleaseId getCurrentReleaseId();

Status getStatus();
}
Original file line number Diff line number Diff line change
Expand Up @@ -131,17 +131,13 @@ private static class DummyKieScanner
implements
InternalKieScanner {

public void start(long pollingInterval) {
}
public void start(long pollingInterval) { }

public void stop() {
}
public void stop() { }

public void scanNow() {
}
public void scanNow() { }

public void setKieContainer(KieContainer kieContainer) {
}
public void setKieContainer(KieContainer kieContainer) { }

public KieModule loadArtifact(ReleaseId releaseId) {
return null;
Expand All @@ -154,6 +150,18 @@ public KieModule loadArtifact(ReleaseId releaseId, InputStream pomXML) {
public String getArtifactVersion(ReleaseId releaseId) {
return null;
}

public ReleaseId getScannerReleaseId() {
return null;
}

public ReleaseId getCurrentReleaseId() {
return null;
}

public Status getStatus() {
return Status.STOPPED;
}
}

public KieModule addKieModule(Resource resource, Resource... dependencies) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,12 @@ public class KieRepositoryScannerImpl implements InternalKieScanner {

private ArtifactResolver artifactResolver;

private Status status = Status.STARTING;

public void setKieContainer(KieContainer kieContainer) {
if (this.kieContainer != null) {
throw new RuntimeException("Cannot change KieContainer on an already initialized KieScanner");
}
this.kieContainer = kieContainer;
ReleaseId releaseId = ((InternalKieContainer)kieContainer).getContainerReleaseId();
if (releaseId == null) {
Expand All @@ -60,6 +65,8 @@ public void setKieContainer(KieContainer kieContainer) {

artifactResolver = getResolverFor(kieContainer.getReleaseId(), true);
init();
KieScannersRegistry.register(this);
status = Status.STOPPED;
}

private ArtifactResolver getArtifactResolver() {
Expand Down Expand Up @@ -97,7 +104,19 @@ public String getArtifactVersion(ReleaseId releaseId) {
Artifact artifact = getArtifactResolver().resolveArtifact(releaseId.toString());
return artifact != null ? artifact.getVersion() : null;
}


public ReleaseId getScannerReleaseId() {
return ((InternalKieContainer)kieContainer).getContainerReleaseId();
}

public ReleaseId getCurrentReleaseId() {
return kieContainer.getReleaseId();
}

public Status getStatus() {
return status;
}

private KieModule loadPomArtifact(ReleaseId releaseId) {
ArtifactResolver resolver = getResolverFor(releaseId, false);
if (resolver == null) {
Expand Down Expand Up @@ -181,29 +200,36 @@ public void stop() {
timer.cancel();
timer = null;
}
status = Status.STOPPED;
}

private void startScanTask(long pollingInterval) {
status = Status.RUNNING;
timer = new Timer(true);
timer.schedule(new ScanTask(), pollingInterval, pollingInterval);
}

private class ScanTask extends TimerTask {
public void run() {
scanNow();
status = Status.RUNNING;
}
}

public void scanNow() {
status = Status.SCANNING;
Collection<Artifact> updatedArtifacts = scanForUpdates(usedDependencies);
if (updatedArtifacts.isEmpty()) {
status = Status.STOPPED;
return;
}
status = Status.UPDATING;
for (Artifact artifact : updatedArtifacts) {
DependencyDescriptor depDescr = new DependencyDescriptor(artifact);
updateKieModule(artifact, depDescr.getGav());
}
log.info("The following artifacts have been updated: " + updatedArtifacts);
status = Status.STOPPED;
}

private void updateKieModule(Artifact artifact, ReleaseId releaseId) {
Expand Down
32 changes: 32 additions & 0 deletions kie-ci/src/main/java/org/kie/scanner/KieScannersRegistry.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.kie.scanner;

import org.drools.compiler.kie.builder.impl.InternalKieScanner;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public class KieScannersRegistry {

private static List<WeakReference<InternalKieScanner>> scanners = new ArrayList<WeakReference<InternalKieScanner>>();

static void register(InternalKieScanner scanner) {
scanners.add(new WeakReference<InternalKieScanner>(scanner));
}

public Collection<InternalKieScanner> getAllKieScanners() {
List<InternalKieScanner> allScanners = new ArrayList<InternalKieScanner>();
Iterator<WeakReference<InternalKieScanner>> i = scanners.iterator();
while (i.hasNext()) {
InternalKieScanner scanner = i.next().get();
if (scanner == null) {
i.remove();
} else {
allScanners.add(scanner);
}
}
return allScanners;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.kie.scanner;

import org.drools.compiler.kie.builder.impl.InternalKieScanner;
import org.drools.core.util.FileManager;
import org.junit.After;
import org.junit.Before;
Expand Down Expand Up @@ -104,10 +105,14 @@ public void testKScannerWithRange() throws Exception {
repository.deployArtifact(releaseId2, kJar2, kPom);

// since I am not calling start() on the scanner it means it won't have automatic scheduled scanning
KieScanner scanner = ks.newKieScanner(kieContainer);
InternalKieScanner scanner = (InternalKieScanner) ks.newKieScanner(kieContainer);
assertEquals(releaseId1, scanner.getCurrentReleaseId());
assertEquals(InternalKieScanner.Status.STOPPED, scanner.getStatus());

// scan the maven repo to get the new kjar version and deploy it on the kcontainer
scanner.scanNow();
assertEquals(releaseId2, scanner.getCurrentReleaseId());
assertEquals(InternalKieScanner.Status.STOPPED, scanner.getStatus());

// create a ksesion and check it works as expected
KieSession ksession2 = kieContainer.newKieSession("KSession1");
Expand Down

0 comments on commit d90c02e

Please sign in to comment.