/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.ivy.core.module.descriptor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import org.apache.ivy.core.module.id.ModuleRevisionId;
import org.apache.ivy.util.extendable.DefaultExtendableItem;
/**
* Represents a module configuration
*/
public class Configuration extends DefaultExtendableItem implements InheritableItem {
public static final class Visibility {
public static final Visibility PUBLIC = new Visibility("public");
public static final Visibility PRIVATE = new Visibility("private");
public static Visibility getVisibility(String name) {
if ("private".equals(name)) {
return PRIVATE;
} else if ("public".equals(name)) {
return PUBLIC;
} else {
throw new IllegalArgumentException("unknwon visibility " + name);
}
}
private String name;
private Visibility(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
public static Collection<Configuration> findConfigurationExtending(String conf,
Configuration[] confs) {
Collection<Configuration> extendingConfs = new ArrayList<Configuration>();
for (int i = 0; i < confs.length; i++) {
if (confs[i] != null && Arrays.asList(confs[i].getExtends()).contains(conf)) {
extendingConfs.add(confs[i]);
extendingConfs.addAll(findConfigurationExtending(confs[i].getName(), confs));
}
}
return extendingConfs;
}
private String name;
private String description;
private String[] extendsFrom;
private Visibility visibility;
private boolean transitive = true;
private String deprecated;
private ModuleRevisionId sourceModule;
/**
* Creates a new configuration.
*
* @param name
* the name of the configuration
*/
public Configuration(String name) {
this(name, Visibility.PUBLIC, null, null, true, null);
}
public Configuration(Configuration source, ModuleRevisionId sourceModule) {
this(source.getAttributes(), source.getQualifiedExtraAttributes(), source.getName(), source
.getVisibility(), source.getDescription(), source.getExtends(), source
.isTransitive(), source.getDeprecated(), sourceModule);
}
/**
* Creates a new configuration.
*
* @param name
* the name of the configuration
* @param visibility
* the visibility of the configuration
* @param description
* a description
* @param ext
* the configurations to extend from
* @param transitive
* indicates if the configuration is transitive
* @param deprecated
* the deprecation message
*/
public Configuration(String name, Visibility visibility, String description, String[] ext,
boolean transitive, String deprecated) {
this(null, null, name, visibility, description, ext, transitive, deprecated, null);
}
private Configuration(Map<String, String> attributes, Map<String, String> extraAttributes,
String name, Visibility visibility, String description, String[] ext,
boolean transitive, String deprecated, ModuleRevisionId sourceModule) {
super(attributes, extraAttributes);
if (name == null) {
throw new NullPointerException("null configuration name not allowed");
}
if (visibility == null) {
throw new NullPointerException("null visibility not allowed");
}
this.name = name;
this.visibility = visibility;
this.description = description;
if (ext == null) {
extendsFrom = new String[0];
} else {
extendsFrom = new String[ext.length];
for (int i = 0; i < ext.length; i++) {
extendsFrom[i] = ext[i].trim();
}
}
this.transitive = transitive;
this.deprecated = deprecated;
this.sourceModule = sourceModule;
}
/**
* Returns the deprecation message, or <tt>null</tt> if not specified.
*
* @return Returns the deprecation message.
*/
public String getDeprecated() {
return deprecated;
}
/**
* @return Returns the description. It may be null.
*/
public String getDescription() {
return description;
}
/**
* @return Returns the extends. May be empty, but never null.
*/
public String[] getExtends() {
return extendsFrom;
}
/**
* @return Returns the name. Never null;
*/
public String getName() {
return name;
}
/**
* @return Returns the visibility. Never null.
*/
public Visibility getVisibility() {
return visibility;
}
/**
* @return Returns the transitive.
*/
public final boolean isTransitive() {
return transitive;
}
public ModuleRevisionId getSourceModule() {
return sourceModule;
}
@Override
public String toString() {
return name;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Configuration)) {
return false;
}
return ((Configuration) obj).getName().equals(getName());
}
@Override
public int hashCode() {
return getName().hashCode();
}
public void replaceWildcards(ModuleDescriptor md) {
if (this != md.getConfiguration(name)) {
throw new IllegalArgumentException(
"The given ModuleDescriptor doesn't own this configuration!");
}
Configuration[] configs = md.getConfigurations();
Set<String> newExtends = new LinkedHashSet<String>();
for (int j = 0; j < extendsFrom.length; j++) {
if ("*".equals(extendsFrom[j])) {
addOther(configs, null, newExtends);
} else if ("*(public)".equals(extendsFrom[j])) {
addOther(configs, Visibility.PUBLIC, newExtends);
} else if ("*(private)".equals(extendsFrom[j])) {
addOther(configs, Visibility.PRIVATE, newExtends);
} else {
newExtends.add(extendsFrom[j]);
}
}
this.extendsFrom = newExtends.toArray(new String[newExtends.size()]);
}
private void addOther(Configuration[] allConfigs, Visibility visibility, Set<String> configs) {
for (int i = 0; i < allConfigs.length; i++) {
String currentName = allConfigs[i].getName();
if (!name.equals(currentName)
&& ((visibility == null) || visibility.equals(allConfigs[i].getVisibility()))) {
configs.add(currentName);
}
}
}
}