class MavenMatcher implements VersionMatcher {
    private static AgentLogger LOGGER = AgentLogger.getLogger(MavenMatcher.class);

	/** The included versions. */
	private final VersionRange includes;
	
	/** The excluded versions. */
	private final VersionRange excludes;

	/** The artifact id. */
	private final String artifactId;

	/** The group id. */
	private final String groupId;

	/** The include versions as string. */
	private final String includesString;
	
	/** The exclude versions as string. */
	private final String excludesString;

	/**
	 * Instantiates a new maven matcher.
	 *
	 * @param cfg the Maven annotation 
	 * @throws InvalidVersionSpecificationException the invalid version specification exception
	 */
	public MavenMatcher(Maven cfg) throws InvalidVersionSpecificationException {
        this.artifactId = cfg.artifactId();
        this.groupId = cfg.groupId();
        if(StringUtils.hasText(cfg.value())) {
        	 this.includesString = cfg.value().trim();
        	 this.includes = VersionRange.createFromVersionSpec(includesString);
        } else {
        	this.includes = null;
        	this.includesString = null;
        }
        
        if(StringUtils.hasText(cfg.excludeVersion())){
        	this.excludesString = cfg.excludeVersion().trim();
        	this.excludes = VersionRange.createFromVersionSpec(excludesString);
        } else {
        	this.excludes =  null;
        	this.excludesString = null;
        }
    }

	/**
	 * Gets the included versions range.
	 *
	 * @return the included versions range
	 */
	public VersionRange getIncludes() {
		return includes;
	}

	/**
	 * Gets the excluded versions range
	 *
	 * @return the excluded versions range
	 */
	public VersionRange getExcludes() {
		return excludes;
	}

	/**
	 * Gets the artifact id.
	 *
	 * @return the artifact id
	 */
	public String getArtifactId() {
		return artifactId;
	}

	/**
	 * Gets the group id.
	 *
	 * @return the group id
	 */
	public String getGroupId() {
		return groupId;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "MavenMatcher [groupId=" + groupId + ", artifactId=" + artifactId + ", includes=" + includes
				+ ", excludes=" + excludes + "]";
	}

	/* (non-Javadoc)
	 * @see org.hotswap.agent.config.ArtifactMatcher#matches(org.hotswap.agent.versions.DeploymentInfo)
	 */
	@Override
	public VersionMatchResult matches(DeploymentInfo info) {<FILL_FUNCTION_BODY>}

	/* (non-Javadoc)
	 * @see org.hotswap.agent.config.ArtifactMatcher#isApply()
	 */
	@Override
	public boolean isApply() {
		return (StringUtils.hasText(artifactId) && StringUtils.hasText(groupId)) && (StringUtils.hasText(includesString) || StringUtils.hasText(excludesString));
	}
}

        if(info.getMaven() == null || info.getMaven().size() == 0) {
            return VersionMatchResult.SKIPPED;
        }
        
        // A jar can carry multiple maven properties.

		for (MavenInfo mi : info.getMaven()) {
			if (PatternMatchUtils.regexMatch(groupId, mi.getGroupId()) && PatternMatchUtils.regexMatch(artifactId, mi.getArtifactId())) {
				
				if ((includes == null || includes.containsVersion(mi.getVersion())) && (excludes ==null || !excludes.containsVersion(mi.getVersion()))) {
				    LOGGER.debug("Matched {} with {}", this, mi);
				    return VersionMatchResult.MATCHED;
				}

				// If it is explicitly excluded, then false!
				if (excludes !=null && excludes.containsVersion(mi.getVersion())) {
				    LOGGER.debug("Rejected {} with {}", this, mi);
					return VersionMatchResult.REJECTED;
				}
			}
		}
			
		// There were no matches (maybe another matcher will pass)
		return VersionMatchResult.SKIPPED;
	
<no_super_class>