// Path: src/main/java/org/echocat/gradle/plugins/golang/vcs/RawVcsReference.java
// public class RawVcsReference extends BaseVcsReference {
// 
//     public RawVcsReference(@Nullable VcsType type, @Nonnull String id, @Nullable URI plain, @Nullable String ref, UpdatePolicy updatePolicy) {
//         super(type, id, plain, ref, updatePolicy);
//     }
// 
// }
// 
// Path: src/main/java/org/echocat/gradle/plugins/golang/vcs/VcsType.java
// public enum VcsType {
//     git(".git"),
//     bzr(".bzr"),
//     hg(".hg"),
//     svn(".svn"),
//     manual("");
// 
//     @Nonnull
//     private final String _uriSuffix;
//     @Nonnull
//     private final Set<String> _schemes;
// 
//     VcsType(@Nonnull String uriSuffix, @Nullable String... plainSchemes) {
//         _uriSuffix = uriSuffix;
//         final Set<String> schemes = new LinkedHashSet<>();
//         if (plainSchemes != null) {
//             addAll(schemes, plainSchemes);
//         }
//         _schemes = unmodifiableSet(schemes);
//     }
// 
//     @Nonnull
//     public String getUriSuffix() {
//         return _uriSuffix;
//     }
// 
//     @Nonnull
//     public Set<String> getSchemes() {
//         return _schemes;
//     }
// 
//     @Nonnull
//     public String getName() {
//         return name();
//     }
// 
//     @Override
//     public String toString() {
//         return getName();
//     }
// 
// }
// 
// Path: src/main/java/org/echocat/gradle/plugins/golang/vcs/VcsValidationException.java
// public class VcsValidationException extends VcsException {
// 
//     public VcsValidationException(String message) {
//         super(message);
//     }
// 
//     public VcsValidationException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
//     public VcsValidationException(Throwable cause) {
//         super(cause);
//     }
// 
// }
// 
// Path: src/main/java/org/echocat/gradle/plugins/golang/model/UpdatePolicy.java
// @Nonnull
// public static UpdatePolicy defaultUpdatePolicy() {
//     return never();
// }


import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.echocat.gradle.plugins.golang.vcs.RawVcsReference;
import org.echocat.gradle.plugins.golang.vcs.VcsType;
import org.echocat.gradle.plugins.golang.vcs.VcsValidationException;
import org.gradle.api.artifacts.Dependency;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.net.URI;
import java.nio.file.Path;
import java.util.Objects;
import static org.apache.commons.lang3.StringUtils.isEmpty;
import static org.echocat.gradle.plugins.golang.model.GolangDependency.Type.explicit;
import static org.echocat.gradle.plugins.golang.model.UpdatePolicy.defaultUpdatePolicy;
    public GolangDependency(@Nonnull Dependency raw) {
        if (raw instanceof GolangDependency) {
            final GolangDependency original = (GolangDependency) raw;
            setGroup(original.getGroup());
            setVersion(original.getVersion());
            setRepositoryUri(original.getRepositoryUri());
            setRepositoryType(original.getRepositoryType());
            setUpdatePolicy(original.getUpdatePolicy());
        } else {
            final String name = raw.getName();
            if (StringUtils.isEmpty(name)) {
                setGroup(raw.getGroup());
            } else {
                setGroup(raw.getGroup() + "/" + name);
            }
            final String version = raw.getVersion();
            if (StringUtils.isNotEmpty(version) && !"default".equalsIgnoreCase(version)) {
                setVersion(version);
            }
        }
    }

    @Override
    @Nonnull
    public String getGroup() {
        return _group;
    }

    @Override
    @Nonnull
// Path: src/main/java/org/echocat/gradle/plugins/golang/vcs/RawVcsReference.java
// public class RawVcsReference extends BaseVcsReference {
// 
//     public RawVcsReference(@Nullable VcsType type, @Nonnull String id, @Nullable URI plain, @Nullable String ref, UpdatePolicy updatePolicy) {
//         super(type, id, plain, ref, updatePolicy);
//     }
// 
// }
// 
// Path: src/main/java/org/echocat/gradle/plugins/golang/vcs/VcsType.java
// public enum VcsType {
//     git(".git"),
//     bzr(".bzr"),
//     hg(".hg"),
//     svn(".svn"),
//     manual("");
// 
//     @Nonnull
//     private final String _uriSuffix;
//     @Nonnull
//     private final Set<String> _schemes;
// 
//     VcsType(@Nonnull String uriSuffix, @Nullable String... plainSchemes) {
//         _uriSuffix = uriSuffix;
//         final Set<String> schemes = new LinkedHashSet<>();
//         if (plainSchemes != null) {
//             addAll(schemes, plainSchemes);
//         }
//         _schemes = unmodifiableSet(schemes);
//     }
// 
//     @Nonnull
//     public String getUriSuffix() {
//         return _uriSuffix;
//     }
// 
//     @Nonnull
//     public Set<String> getSchemes() {
//         return _schemes;
//     }
// 
//     @Nonnull
//     public String getName() {
//         return name();
//     }
// 
//     @Override
//     public String toString() {
//         return getName();
//     }
// 
// }
// 
// Path: src/main/java/org/echocat/gradle/plugins/golang/vcs/VcsValidationException.java
// public class VcsValidationException extends VcsException {
// 
//     public VcsValidationException(String message) {
//         super(message);
//     }
// 
//     public VcsValidationException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
//     public VcsValidationException(Throwable cause) {
//         super(cause);
//     }
// 
// }
// 
// Path: src/main/java/org/echocat/gradle/plugins/golang/model/UpdatePolicy.java
// @Nonnull
// public static UpdatePolicy defaultUpdatePolicy() {
//     return never();
// }


// Path: src/main/java/org/echocat/gradle/plugins/golang/model/GolangDependency.java
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.echocat.gradle.plugins.golang.vcs.RawVcsReference;
import org.echocat.gradle.plugins.golang.vcs.VcsType;
import org.echocat.gradle.plugins.golang.vcs.VcsValidationException;
import org.gradle.api.artifacts.Dependency;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.net.URI;
import java.nio.file.Path;
import java.util.Objects;
import static org.apache.commons.lang3.StringUtils.isEmpty;
import static org.echocat.gradle.plugins.golang.model.GolangDependency.Type.explicit;
import static org.echocat.gradle.plugins.golang.model.UpdatePolicy.defaultUpdatePolicy;

    public GolangDependency(@Nonnull Dependency raw) {
        if (raw instanceof GolangDependency) {
            final GolangDependency original = (GolangDependency) raw;
            setGroup(original.getGroup());
            setVersion(original.getVersion());
            setRepositoryUri(original.getRepositoryUri());
            setRepositoryType(original.getRepositoryType());
            setUpdatePolicy(original.getUpdatePolicy());
        } else {
            final String name = raw.getName();
            if (StringUtils.isEmpty(name)) {
                setGroup(raw.getGroup());
            } else {
                setGroup(raw.getGroup() + "/" + name);
            }
            final String version = raw.getVersion();
            if (StringUtils.isNotEmpty(version) && !"default".equalsIgnoreCase(version)) {
                setVersion(version);
            }
        }
    }

    @Override
    @Nonnull
    public String getGroup() {
        return _group;
    }

    @Override
    @Nonnull
    public String getName() {