use of org.commonjava.maven.galley.model.Transfer in project indy by Commonjava.
the class ArchetypeCatalogGenerator method generateGroupFileContent.
@Override
public Transfer generateGroupFileContent(final Group group, final List<ArtifactStore> members, final String path, final EventMetadata eventMetadata) throws IndyWorkflowException {
if (!canProcess(path)) {
return null;
}
final Transfer target = fileManager.getTransfer(group, path);
if (!target.exists()) {
String toMergePath = path;
if (!path.endsWith(ArchetypeCatalogMerger.CATALOG_NAME)) {
toMergePath = normalize(normalize(parentPath(toMergePath)), ArchetypeCatalogMerger.CATALOG_NAME);
}
final List<Transfer> sources = fileManager.retrieveAllRaw(members, toMergePath, new EventMetadata());
final byte[] merged = merger.merge(sources, group, toMergePath);
if (merged != null) {
try (OutputStream fos = target.openOutputStream(TransferOperation.GENERATE, true, eventMetadata)) {
fos.write(merged);
} catch (final IOException e) {
throw new IndyWorkflowException("Failed to write merged archetype catalog to: {}.\nError: {}", e, target, e.getMessage());
}
}
}
if (target.exists()) {
return target;
}
return null;
}
use of org.commonjava.maven.galley.model.Transfer in project indy by Commonjava.
the class MetadataStoreListener method onMetadataFileForceDelete.
/**
* Indy normally does not handle FileDeletionEvent when the cached metadata files were deleted due to store
* enable/disable/delete, etc. Lately we add a force-deletion for group/remote-repo cache files. This requires to
* delete affected group metadata files and clear ISPN cache too. We use this method for just this case, i.e.,
* only if CHECK_CACHE_ONLY is true.
*/
public void onMetadataFileForceDelete(@Observes final FileDeletionEvent event) {
EventMetadata eventMetadata = event.getEventMetadata();
if (!Boolean.TRUE.equals(eventMetadata.get(CHECK_CACHE_ONLY))) {
return;
}
logger.trace("Got file-delete event: {}", event);
Transfer transfer = event.getTransfer();
String path = transfer.getPath();
if (!path.endsWith(METADATA_NAME)) {
logger.trace("Not {} , path: {}", METADATA_NAME, path);
return;
}
Location loc = transfer.getLocation();
if (!(loc instanceof KeyedLocation)) {
logger.trace("Ignore FileDeletionEvent, not a KeyedLocation, location: {}", loc);
return;
}
KeyedLocation keyedLocation = (KeyedLocation) loc;
StoreKey storeKey = keyedLocation.getKey();
try {
ArtifactStore store = storeManager.getArtifactStore(storeKey);
metadataGenerator.clearAllMerged(store, path);
} catch (IndyDataException e) {
logger.error("Handle FileDeletionEvent failed", e);
}
}
use of org.commonjava.maven.galley.model.Transfer in project indy by Commonjava.
the class FileChangeTrackingDecoratorTest method decorateDelete.
@Test
public void decorateDelete() throws IOException {
init(1);
SimpleLocation loc = new SimpleLocation("foo", "http://foo.bar");
ConcreteResource res = new ConcreteResource(loc, "path/to/foo.txt");
Transfer tx = cp.getTransfer(res);
byte[] data = "This is a test".getBytes();
try (OutputStream os = tx.openOutputStream(TransferOperation.UPLOAD)) {
os.write(data);
}
tx.delete();
verifyLogFileCount(2);
}
use of org.commonjava.maven.galley.model.Transfer in project indy by Commonjava.
the class IndexingContentManagerDecorator method getTransferFromConstituents.
/**
* Recursively fetching the transfer from group constituents, and only
* indexing the transfer for first found repo and its parent groups.
*/
private Transfer getTransferFromConstituents(Collection<StoreKey> constituents, ConcreteResource resource, String path, ArtifactStore parentStore, TransferSupplier<Transfer> transferSupplier) {
List<StoreKey> members = new ArrayList<>(constituents);
Transfer transfer = null;
for (StoreKey memberKey : members) {
try {
transfer = transferSupplier.get(memberKey);
} catch (IndyWorkflowException e) {
logger.error(String.format("Failed to retrieve() for member path: %s:%s. Reason: %s", memberKey, path, e.getMessage()), e);
}
if (exists(transfer)) {
nfc.clearMissing(resource);
if (indexCfg.isEnabled()) {
logger.debug("Got transfer from constituent: {} (will index)", transfer);
indexManager.indexTransferIn(transfer, parentStore.getKey());
}
return transfer;
}
}
return transfer;
}
use of org.commonjava.maven.galley.model.Transfer in project indy by Commonjava.
the class IndexingContentManagerDecorator method retrieve.
@Override
public Transfer retrieve(final ArtifactStore store, final String path, final EventMetadata eventMetadata) throws IndyWorkflowException {
if (!indexCfg.isEnabled()) {
return delegate.retrieve(store, path, eventMetadata);
}
if (store == null) {
return null;
}
logger.trace("Looking for indexed path: {} in: {}", path, store.getKey());
Transfer transfer = getIndexedTransfer(store.getKey(), null, path, TransferOperation.DOWNLOAD, eventMetadata);
if (transfer != null) {
logger.debug("Found indexed transfer: {}. Returning.", transfer);
return transfer;
} else if (isAuthoritativelyMissing(store)) {
logger.debug("Not found indexed transfer: {} and authoritative index switched on. Considering not found and return null.", transfer);
return null;
}
StoreType type = store.getKey().getType();
if (StoreType.group == type) {
ConcreteResource resource = new ConcreteResource(LocationUtils.toLocation(store), path);
if (nfc.isMissing(resource)) {
logger.debug("{} is marked as missing. Returning null.", resource);
return null;
}
logger.debug("No group index hits. Devolving to member store indexes.");
KeyedLocation location = LocationUtils.toLocation(store);
SpecialPathInfo specialPathInfo = specialPathManager.getSpecialPathInfo(location, path, store.getPackageType());
if (specialPathInfo == null || !specialPathInfo.isMergable()) {
if (PathMaskChecker.checkMask(store, path)) {
transfer = getTransferFromConstituents(((Group) store).getConstituents(), resource, path, store, memberKey -> {
try {
ArtifactStore member = storeDataManager.getArtifactStore(memberKey);
if (member == null) {
logger.trace("Cannot find store for key: {}", memberKey);
} else {
return retrieve(member, path, eventMetadata);
}
} catch (IndyDataException e) {
logger.error(String.format("Failed to lookup store: %s (in membership of: %s). Reason: %s", memberKey, store.getKey(), e.getMessage()), e);
}
return null;
});
nfcForGroup(store, transfer, resource);
return transfer;
} else {
return null;
}
} else {
logger.debug("Merged content. Delegating to main content manager for: {} in: {}", path, store);
transfer = delegate.retrieve(store, path, eventMetadata);
if (!exists(transfer)) {
Boolean metadataGenerated = (Boolean) eventMetadata.get(GROUP_METADATA_GENERATED);
Boolean metadataExists = (Boolean) eventMetadata.get(GROUP_METADATA_EXISTS);
if (Boolean.TRUE.equals(metadataGenerated) || Boolean.TRUE.equals(metadataExists)) {
// metadata generated/exists but missing due to membership change, not add to nfc so next req can retry
;
} else // don't track NFC for hosted repos
{
nfc.addMissing(resource);
}
}
return transfer;
}
}
logger.trace("Delegating retrieve call for concrete repository: {}/{}", store, path);
transfer = delegate.retrieve(store, path, eventMetadata);
if (exists(transfer) && indexCfg.isEnabled()) {
logger.debug("Got transfer from delegate: {} (will index)", transfer);
indexManager.indexTransferIn(transfer, store.getKey());
}
logger.debug("Returning transfer: {}", transfer);
return transfer;
}
Aggregations