/*
* Copyright 2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.gradle.api.internal.artifacts.ivyservice.dependencysubstitution;
import org.gradle.api.artifacts.component.ComponentSelector;
import org.gradle.api.internal.artifacts.ImmutableModuleIdentifierFactory;
import org.gradle.internal.component.external.model.DefaultModuleComponentSelector;
import org.gradle.internal.exceptions.DiagnosticsVisitor;
import org.gradle.internal.typeconversion.TypedNotationConverter;
import org.gradle.internal.typeconversion.UnsupportedNotationException;
import org.gradle.util.GUtil;
import static org.gradle.api.internal.notations.ModuleIdentifierNotationConverter.validate;
class ModuleSelectorStringNotationConverter extends TypedNotationConverter<String, ComponentSelector> {
private final ImmutableModuleIdentifierFactory moduleIdentifierFactory;
public ModuleSelectorStringNotationConverter(ImmutableModuleIdentifierFactory moduleIdentifierFactory) {
super(String.class);
this.moduleIdentifierFactory = moduleIdentifierFactory;
}
/**
* Empty String for either group or module name is not allowed.
*/
protected ComponentSelector parseType(String notation) {
assert notation != null;
String[] split = notation.split(":");
if (split.length < 2 || split.length > 3) {
throw new UnsupportedNotationException(notation);
}
String group = validate(split[0].trim(), notation);
String name = validate(split[1].trim(), notation);
if (split.length == 2) {
return new UnversionedModuleComponentSelector(moduleIdentifierFactory.module(group, name));
}
String version = split[2].trim();
if (!GUtil.isTrue(version)) {
throw new UnsupportedNotationException(notation);
}
return DefaultModuleComponentSelector.newSelector(group, name, version);
}
@Override
public void describe(DiagnosticsVisitor visitor) {
visitor.candidate("String describing the module in 'group:name' format").example("'org.gradle:gradle-core'.");
visitor.candidate("String describing the selector in 'group:name:version' format").example("'org.gradle:gradle-core:1.+'.");
}
}