use of io.fabric8.agent.commands.support.ProfileVersionKey in project fabric8 by jboss-fuse.
the class ProfileWatcherImpl method findProfileArifacts.
// For each profile and version return the map of bundle locations to parsers
private Map<ProfileVersionKey, Map<String, Parser>> findProfileArifacts() throws Exception {
Map<ProfileVersionKey, Map<String, Parser>> profileArtifacts = new HashMap<ProfileVersionKey, Map<String, Parser>>();
ProfileService profileService = fabricService.get().adapt(ProfileService.class);
DownloadManager downloadManager = DownloadManagers.createDownloadManager(fabricService.get(), executorService);
Container[] containers = fabricService.get().getContainers();
for (Container container : containers) {
Profile[] profiles = container.getProfiles();
boolean javaOrProcessContainer = ChildContainers.isJavaOrProcessContainer(fabricService.get(), container);
// TODO allow filter on a profile here?
for (Profile profile : profiles) {
Profile overlay = profileService.getOverlayProfile(profile);
ProfileVersionKey key = new ProfileVersionKey(profile);
// if (!profileArtifacts.containsKey(key)) {
Map<String, Parser> artifacts = null;
if (javaOrProcessContainer) {
List<Profile> singletonList = Collections.singletonList(profile);
artifacts = JavaContainers.getJavaContainerArtifacts(fabricService.get(), singletonList, executorService);
} else {
artifacts = AgentUtils.getProfileArtifacts(fabricService.get(), downloadManager, overlay);
}
if (artifacts != null) {
if (LOG.isDebugEnabled()) {
LOG.debug("Profile " + profile.getId() + " maps to artefacts: " + artifacts.keySet());
}
profileArtifacts.put(key, artifacts);
}
// }
}
}
return profileArtifacts;
}
use of io.fabric8.agent.commands.support.ProfileVersionKey in project fabric8 by jboss-fuse.
the class WatchAction method doExecute.
@Override
protected Object doExecute() throws Exception {
if (start && stop) {
System.err.println("Please use only one of --start and --stop options!");
return null;
}
if (interval > 0) {
System.out.println("Setting watch interval to " + interval + " ms");
watcher.setInterval(interval);
}
if (stop) {
System.out.println("Stopping watch");
watcher.stop();
}
watcher.setUpload(upload);
if (urls != null) {
if (remove) {
for (String url : urls) {
watcher.remove(url);
}
} else {
for (String url : urls) {
watcher.add(url);
}
}
}
if (start) {
System.out.println("Starting watch");
watcher.start();
}
if (list) {
// list the watched bundles.
TablePrinter printer = new TablePrinter();
printer.columns("url", "profile", "version", "bundle");
for (String url : watcher.getWatchURLs()) {
Map<ProfileVersionKey, Map<String, Parser>> profileArtifacts = watcher.getProfileArtifacts();
if (profileArtifacts.size() > 0) {
Set<Map.Entry<ProfileVersionKey, Map<String, Parser>>> entries = profileArtifacts.entrySet();
for (Map.Entry<ProfileVersionKey, Map<String, Parser>> entry : entries) {
ProfileVersionKey key = entry.getKey();
Map<String, Parser> artifactMap = entry.getValue();
Set<Map.Entry<String, Parser>> artifactMapEntries = artifactMap.entrySet();
for (Map.Entry<String, Parser> artifactMapEntry : artifactMapEntries) {
String location = artifactMapEntry.getKey();
Parser parser = artifactMapEntry.getValue();
if (isSnapshot(parser) || watcher.wildCardMatch(location, url)) {
printer.row(url, key.getProfileId(), key.getVersion(), location);
}
}
}
} else {
printer.row(url, "", "", "");
}
}
printer.print();
} else {
List<String> urls = watcher.getWatchURLs();
if (urls != null && urls.size() > 0) {
System.out.println("Watched URLs: ");
for (String url : watcher.getWatchURLs()) {
System.out.println(url);
}
} else {
System.out.println("No watched URLs");
}
}
return null;
}
use of io.fabric8.agent.commands.support.ProfileVersionKey in project fabric8 by jboss-fuse.
the class ProfileWatcherImpl method run.
public void run() {
assertValid();
LOG.debug("Profile watcher thread started");
int oldCounter = -1;
SortedSet<String> oldActiveProfiles = null;
Map<File, Long> localChecksums = new HashMap<File, Long>();
Map<File, Long> localModified = new HashMap<File, Long>();
Set<Profile> refreshProfiles = new HashSet<Profile>();
ProfileService profileService = fabricService.get().adapt(ProfileService.class);
while (running.get() && watchURLs.size() > 0) {
SortedSet<String> currentActiveProfiles = getCurrentActiveProfileVersions();
if (profileArtifacts == null || oldCounter != counter.get() || oldActiveProfiles == null || !oldActiveProfiles.equals(currentActiveProfiles)) {
oldCounter = counter.get();
oldActiveProfiles = currentActiveProfiles;
try {
LOG.debug("Reloading the currently active profile artifacts");
profileArtifacts = findProfileArifacts();
} catch (Exception e) {
LOG.error("Failed to get profiles artifacts: " + e, e);
}
}
// lets refresh profiles on the next loop; so we've time to finish uploading/modifying files
for (Profile profile : refreshProfiles) {
LOG.info("Refreshing profile: " + profile);
Profiles.refreshProfile(fabricService.get(), profile);
}
refreshProfiles.clear();
if (profileArtifacts != null) {
List<File> localRepositories = new LinkedList<>();
if (mavenResolver.get().getLocalRepository() != null) {
localRepositories.add(mavenResolver.get().getLocalRepository());
}
if (mavenResolver.get().getDefaultRepositories() != null) {
for (LocalRepository repository : mavenResolver.get().getDefaultRepositories()) {
localRepositories.add(repository.getBasedir());
}
}
Set<Map.Entry<ProfileVersionKey, Map<String, Parser>>> entries = profileArtifacts.entrySet();
for (Map.Entry<ProfileVersionKey, Map<String, Parser>> entry : entries) {
ProfileVersionKey key = entry.getKey();
Map<String, Parser> artifactMap = entry.getValue();
// lets find a container for the profile
Profile profile = key.getProfile();
Properties checksums = findProfileChecksums(fabricService.get(), profile);
if (checksums != null) {
Set<Map.Entry<String, Parser>> artifactMapEntries = artifactMap.entrySet();
for (Map.Entry<String, Parser> artifactMapEntry : artifactMapEntries) {
String location = artifactMapEntry.getKey();
Parser parser = artifactMapEntry.getValue();
if (isSnapshot(parser) || wildCardMatch(location)) {
Object value = checksums.get(location);
if (value == null) {
value = checksums.get(JavaContainers.removeUriPrefixBeforeMaven(location));
}
Long checksum = null;
if (value instanceof Number) {
checksum = ((Number) value).longValue();
} else if (value instanceof String) {
checksum = Long.parseLong((String) value);
}
if (checksum == null) {
if (missingChecksums.add(location)) {
LOG.warn("Could not find checksum for location " + location);
}
} else {
File file = null;
for (File localRepository : localRepositories) {
File _file = new File(localRepository.getPath() + File.separator + parser.getArtifactPath());
if (_file.isFile()) {
file = _file;
break;
}
}
if (!file.exists()) {
LOG.info("Ignoring file " + file.getPath() + " as it does not exist");
} else {
// lets use a cache of last modified times to avoid having to continuously
// recalculate the checksum on each file
Long oldModfied = localModified.get(file);
long modified = file.lastModified();
if (oldModfied == null || modified != oldModfied) {
localModified.put(file, modified);
Long fileChecksum = getFileChecksum(file);
if (fileChecksum != null && !fileChecksum.equals(checksum)) {
// lets keep track of local checksums in case we've already started the upload process
// and it takes the profile a little while to respond to uploaded jars and to
// refreshed profiles
Long localChecksum = localChecksums.get(file);
if (localChecksum == null || !localChecksum.equals(fileChecksum)) {
localChecksums.put(file, fileChecksum);
LOG.info("Checksums don't match for " + location + ", container: " + checksum + " and local file: " + fileChecksum);
LOG.info("Updated version of " + location + " detected in " + file);
if (isUpload()) {
uploadFile(location, parser, file);
}
refreshProfiles.add(profile);
}
}
}
}
}
} else {
if (LOG.isTraceEnabled()) {
LOG.trace("Ignoring " + location);
}
}
}
}
}
}
try {
Thread.sleep(interval);
} catch (InterruptedException ex) {
running.set(false);
}
}
if (LOG.isDebugEnabled()) {
LOG.debug("Profile watcher thread stopped");
}
}
Aggregations