Giter Site home page Giter Site logo

saleemshafi / nexus-artifact-usage-plugin Goto Github PK

View Code? Open in Web Editor NEW
36.0 36.0 19.0 545 KB

Plugin for Sonatype's Nexus Repository Manager that will display which artifacts in the repository are dependent on a selected artifact.

License: Other

Java 79.06% JavaScript 20.94%

nexus-artifact-usage-plugin's People

Contributors

anthonydahanne avatar ljacomet avatar saleemshafi avatar vazul avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nexus-artifact-usage-plugin's Issues

Fix multiple calls to get artifact pom in UI

Both the tree and list views load the artifact's POM file when selecting a new file, and we can probably fix that so that it only runs once and the resulting data is used by both views.

Render full usage graph at once rather than piecemeal

Right now, the usage tree is being populated one-level at a time using an Ajax call. Having the full tree rendered at once opens up the door to a lot of improvements, such as tree searching, quick filtering on the client-side, and some code consolidation with the download option.

We wouldn't have to sacrifice much in terms of performance if we store the data as a graph and then hash our way to the root of the tree that we're interested in. That way the lookup is still constant-time, we'll just be risking sending more data back than in necessary. Although, i think a common use case will be to understand all of the artifacts that usage a particular project, not just the first level.

Use card panel on list view to show paths from artifact to selected user

It turns out the list view that i used has a "card panel" beneath it that shows the details of an item in the grid above. While i would just as soon not have the lower half of the view at all, if i can't figure out how to get rid of it, i could always use that to try and display the path(s) that exist between the selected user and the artifact is depends on.

Fix multiple calls to usage list data

for some reason the usage list view is calling back to the server twice. there's some not-so-great code in the js file that runs the list view and delays the loading of the list until after the panel is rendered, and i suspect that i did something wrong there.

Create list view for dependencies

when looking to see if a particular artifact is in the usage tree of another, it might be helpful to see that information as a list, rather than digging through a tree. it's often not entirely necessary to know the path from one artifact to another, just whether a particular artifact is in the tree.

While we could implement this by allowing a search through the tree (once it's fully populated, being able to get a list makes it easier to see what else is in the graph.

Consider storing artifact usage data to files

We could store the artifact usage data we calculate into files next to each artifact, similar to the way the sha1 hash files and metadata files are stored. This would save us from having to recalculate every time we start up.

On the flip side, it would make it much harder to pull a full tree of data on a particular artifact since we've have to traverse the filesystem, rather than having it all cached in memory. We could try to get around that by storing a full list of artifact usage with each artifact, but that could cause problems with race conditions, especially since the process would take quite a bit longer each time an artifact is updated.

Still, something to consider.

Plugin broken on Nexus 2.10

Hello.

Just installed the plugin on Nexus 2.10.0-02 and from the plugin console I see it marked as bnroken and I get this error message:

This plugin was not able to be activated

... org.ebayopensource.nexus.plugins:artifact-usage-plugin:0.11.0 :: action=ACTIVATE result=BROKEN
Reason: Problem installing: reference:file:/usr/local/sonatype-work/nexus/plugin-repository/artifact-usage-plugin-0.11.0/

Is this plugin compatible with version 2.10?

Update dependencies / fix build

Currently, it's not possible to checkout and build the thing.
I was missing com.google.atinject (which i downloaded and installed locally)
But now i'm still missing all the -SONATYPE patched JARs.

Reading there, this issue has been resolved
https://issues.sonatype.org/browse/NEXUS-4912

So, a "simple" update of some dependencies should fix this?!

(a binary download of the latest snapshot would solve this as well ;o)

Class not found exception after upgrading to Nexus OSS 2.6.0-05

I've got the following exception after an upgrade to Nexus OSS 2.6.0-05.
I'm running Nexus with artifact-usage-plugin-0.11.0-bundle.zip.

jvm 1 | 2013-07-29 09:33:11 WARN [ool-1-thread-12] - Sisu - Error injecting: org.apache.maven.wagon.providers.http.HttpWagon
jvm 1 | java.lang.TypeNotPresentException: Type org.apache.maven.wagon.providers.http.HttpWagon not present
jvm 1 | at org.sonatype.guice.bean.reflect.URLClassSpace.loadClass(URLClassSpace.java:108) ~[sisu-inject-bean-2.3.4.jar:na]
jvm 1 | at org.sonatype.guice.bean.reflect.NamedClass.load(NamedClass.java:44) ~[sisu-inject-bean-2.3.4.jar:na]
jvm 1 | at org.sonatype.guice.bean.reflect.AbstractDeferredClass.get(AbstractDeferredClass.java:44) ~[sisu-inject-bean-2.3.4.jar:na]
jvm 1 | at com.google.inject.internal.ProviderInternalFactory.provision(ProviderInternalFactory.java:86) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at com.google.inject.internal.InternalFactoryToInitializableAdapter.provision(InternalFactoryToInitializableAdapter.java:55) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at com.google.inject.internal.ProviderInternalFactory$1.call(ProviderInternalFactory.java:70) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision(ProvisionListenerStackCallback.java:100) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at org.sonatype.guice.plexus.lifecycles.PlexusLifecycleManager.onProvision(PlexusLifecycleManager.java:134) ~[sisu-inject-plexus-2.3.4.jar:na]
jvm 1 | at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision(ProvisionListenerStackCallback.java:109) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at com.google.inject.internal.ProvisionListenerStackCallback.provision(ProvisionListenerStackCallback.java:55) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at com.google.inject.internal.ProviderInternalFactory.circularGet(ProviderInternalFactory.java:68) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at com.google.inject.internal.InternalFactoryToInitializableAdapter.get(InternalFactoryToInitializableAdapter.java:47) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at com.google.inject.internal.InjectorImpl$2$1.call(InjectorImpl.java:997) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1047) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:993) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at com.google.inject.Scopes$1$1.get(Scopes.java:59) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at org.sonatype.guice.bean.locators.LazyBeanEntry.getValue(LazyBeanEntry.java:82) ~[sisu-inject-bean-2.3.4.jar:na]
jvm 1 | at org.sonatype.guice.plexus.locators.LazyPlexusBean.getValue(LazyPlexusBean.java:52) ~[sisu-inject-plexus-2.3.4.jar:na]
jvm 1 | at org.codehaus.plexus.DefaultPlexusContainer.lookup(DefaultPlexusContainer.java:259) ~[sisu-inject-plexus-2.3.4.jar:na]
jvm 1 | at org.codehaus.plexus.DefaultPlexusContainer.lookup(DefaultPlexusContainer.java:251) ~[sisu-inject-plexus-2.3.4.jar:na]
jvm 1 | at org.sonatype.aether.connector.wagon.PlexusWagonProvider.lookup(PlexusWagonProvider.java:32) ~[na:na]
jvm 1 | at org.sonatype.aether.connector.wagon.WagonRepositoryConnector.lookupWagon(WagonRepositoryConnector.java:282) ~[na:na]
jvm 1 | at org.sonatype.aether.connector.wagon.WagonRepositoryConnector.(WagonRepositoryConnector.java:154) ~[na:na]
jvm 1 | at org.sonatype.aether.connector.wagon.WagonRepositoryConnectorFactory.newInstance(WagonRepositoryConnectorFactory.java:142) ~[na:na]
jvm 1 | at org.sonatype.aether.impl.internal.DefaultRemoteRepositoryManager.getRepositoryConnector(DefaultRemoteRepositoryManager.java:346) ~[aether-impl-1.13.1.jar:na]
jvm 1 | at org.sonatype.aether.impl.internal.DefaultMetadataResolver$ResolveTask.run(DefaultMetadataResolver.java:559) ~[aether-impl-1.13.1.jar:na]
jvm 1 | at org.sonatype.aether.util.concurrency.RunnableErrorForwarder$1.run(RunnableErrorForwarder.java:60) ~[aether-util-1.13.1.jar:na]
jvm 1 | at org.sonatype.aether.impl.internal.DefaultMetadataResolver$1.execute(DefaultMetadataResolver.java:486) ~[aether-impl-1.13.1.jar:na]
jvm 1 | at org.sonatype.aether.impl.internal.DefaultMetadataResolver.resolve(DefaultMetadataResolver.java:345) ~[aether-impl-1.13.1.jar:na]
jvm 1 | at org.sonatype.aether.impl.internal.DefaultMetadataResolver.resolveMetadata(DefaultMetadataResolver.java:173) ~[aether-impl-1.13.1.jar:na]
jvm 1 | at org.apache.maven.repository.internal.DefaultVersionResolver.resolveVersion(DefaultVersionResolver.java:225) ~[na:na]
jvm 1 | at org.sonatype.aether.impl.internal.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:272) ~[aether-impl-1.13.1.jar:na]
jvm 1 | at org.sonatype.aether.impl.internal.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:216) ~[aether-impl-1.13.1.jar:na]
jvm 1 | at org.sonatype.aether.impl.internal.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:193) ~[aether-impl-1.13.1.jar:na]
jvm 1 | at org.apache.maven.repository.internal.DefaultModelResolver.resolveModel(DefaultModelResolver.java:122) ~[na:na]
jvm 1 | at org.apache.maven.model.building.DefaultModelBuilder.readParentExternally(DefaultModelBuilder.java:813) ~[na:na]
jvm 1 | at org.apache.maven.model.building.DefaultModelBuilder.readParent(DefaultModelBuilder.java:664) ~[na:na]
jvm 1 | at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:310) ~[na:na]
jvm 1 | at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:232) ~[na:na]
jvm 1 | at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:322) ~[na:na]
jvm 1 | at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.readArtifactDescriptor(DefaultArtifactDescriptorReader.java:186) ~[na:na]
jvm 1 | at org.sonatype.aether.impl.internal.DefaultRepositorySystem.readArtifactDescriptor(DefaultRepositorySystem.java:279) ~[aether-impl-1.13.1.jar:na]
jvm 1 | at org.ebayopensource.nexus.plugins.artifactusage.task.AetherBasedDependencyResolver.resolveDependencies(AetherBasedDependencyResolver.java:45) ~[na:na]
jvm 1 | at org.ebayopensource.nexus.plugins.artifactusage.task.DefaultArtifactUsageCalculator.calculateArtifactUsage(DefaultArtifactUsageCalculator.java:147) ~[na:na]
jvm 1 | at org.ebayopensource.nexus.plugins.artifactusage.task.DefaultArtifactUsageCalculator$ArtifactUsageCalculationWalkerProcessor.processItem(DefaultArtifactUsageCalculator.java:213) ~[na:na]
jvm 1 | at org.sonatype.nexus.proxy.walker.DefaultWalker.processItem(DefaultWalker.java:351) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.sonatype.nexus.proxy.walker.DefaultWalker.walkItem(DefaultWalker.java:287) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.sonatype.nexus.proxy.walker.DefaultWalker.walkRecursive(DefaultWalker.java:247) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.sonatype.nexus.proxy.walker.DefaultWalker.walkRecursive(DefaultWalker.java:258) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.sonatype.nexus.proxy.walker.DefaultWalker.walkRecursive(DefaultWalker.java:258) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.sonatype.nexus.proxy.walker.DefaultWalker.walkRecursive(DefaultWalker.java:258) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.sonatype.nexus.proxy.walker.DefaultWalker.walkRecursive(DefaultWalker.java:258) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.sonatype.nexus.proxy.walker.DefaultWalker.walkRecursive(DefaultWalker.java:258) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.sonatype.nexus.proxy.walker.DefaultWalker.walk(DefaultWalker.java:94) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.ebayopensource.nexus.plugins.artifactusage.task.DefaultArtifactUsageCalculator.calculateArtifactUsage(DefaultArtifactUsageCalculator.java:114) ~[na:na]
jvm 1 | at org.ebayopensource.nexus.plugins.artifactusage.task.DefaultArtifactUsageCalculator.calculateArtifactUsage(DefaultArtifactUsageCalculator.java:67) ~[na:na]
jvm 1 | at org.ebayopensource.nexus.plugins.artifactusage.task.CalculateArtifactUsageTask.doRun(CalculateArtifactUsageTask.java:39) ~[na:na]
jvm 1 | at org.ebayopensource.nexus.plugins.artifactusage.task.CalculateArtifactUsageTask.doRun(CalculateArtifactUsageTask.java:21) ~[na:na]
jvm 1 | at org.sonatype.nexus.scheduling.AbstractNexusTask.call(AbstractNexusTask.java:177) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.sonatype.scheduling.DefaultScheduledTask.call(DefaultScheduledTask.java:483) ~[nexus-scheduler-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.sonatype.nexus.threads.MDCAwareCallable.call(MDCAwareCallable.java:44) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) ~[shiro-core-1.2.2.jar:1.2.2]
jvm 1 | at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) ~[shiro-core-1.2.2.jar:1.2.2]
jvm 1 | at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) ~[na:1.7.0_25]
jvm 1 | at java.util.concurrent.FutureTask.run(FutureTask.java:166) ~[na:1.7.0_25]
jvm 1 | at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178) ~[na:1.7.0_25]
jvm 1 | at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292) ~[na:1.7.0_25]
jvm 1 | at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) ~[na:1.7.0_25]
jvm 1 | at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) ~[na:1.7.0_25]
jvm 1 | at java.lang.Thread.run(Thread.java:724) ~[na:1.7.0_25]
jvm 1 | Caused by: java.lang.NoClassDefFoundError: org/apache/maven/wagon/shared/http/AbstractHttpClientWagon
jvm 1 | at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.7.0_25]
jvm 1 | at java.lang.ClassLoader.defineClass(ClassLoader.java:792) ~[na:1.7.0_25]
jvm 1 | at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[na:1.7.0_25]
jvm 1 | at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) ~[na:1.7.0_25]
jvm 1 | at java.net.URLClassLoader.access$100(URLClassLoader.java:71) ~[na:1.7.0_25]
jvm 1 | at java.net.URLClassLoader$1.run(URLClassLoader.java:361) ~[na:1.7.0_25]
jvm 1 | at java.net.URLClassLoader$1.run(URLClassLoader.java:355) ~[na:1.7.0_25]
jvm 1 | at java.security.AccessController.doPrivileged(Native Method) ~[na:1.7.0_25]
jvm 1 | at java.net.URLClassLoader.findClass(URLClassLoader.java:354) ~[na:1.7.0_25]
jvm 1 | at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClassFromSelf(ClassRealm.java:386) ~[plexus-classworlds-2.4.jar:na]
jvm 1 | at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:42) ~[plexus-classworlds-2.4.jar:na]
jvm 1 | at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:244) ~[plexus-classworlds-2.4.jar:na]
jvm 1 | at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:230) ~[plexus-classworlds-2.4.jar:na]
jvm 1 | at org.sonatype.guice.bean.reflect.URLClassSpace.loadClass(URLClassSpace.java:100) ~[sisu-inject-bean-2.3.4.jar:na]
jvm 1 | ... 69 common frames omitted
jvm 1 | Caused by: java.lang.ClassNotFoundException: org.apache.maven.wagon.shared.http.AbstractHttpClientWagon
jvm 1 | at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50) ~[plexus-classworlds-2.4.jar:na]
jvm 1 | at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:244) ~[plexus-classworlds-2.4.jar:na]
jvm 1 | at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:230) ~[plexus-classworlds-2.4.jar:na]
jvm 1 | ... 83 common frames omitted

List of required privileges

Hi,

Please provide a list of all required privileges to properly configure Nexus rights for users.
The following rights are granted to the developers:

  • all repos (create/read/update/view)
  • API-Key access
  • Artifact upload
    With these rights the users get a "403 Forbidden" error if searching an artifact.
    System feed entry:
    Unable to authorize user [...] for read (HTTP method "GET") to /nexus/service/local/usageList/ from IP Address x.x.x.x, user agent "n/a"
    

If granted the Admin-role everything works fine.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.