/*
* 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.ivyde.internal.eclipse.cpcontainer;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
import org.apache.ivy.core.module.id.ModuleRevisionId;
import org.apache.ivy.core.resolve.ResolveOptions;
import org.apache.ivyde.eclipse.IvyDEException;
import org.apache.ivyde.eclipse.cp.IvyClasspathContainerConfiguration;
import org.apache.ivyde.internal.eclipse.IvyPlugin;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.core.IClasspathAttribute;
import org.eclipse.jdt.core.IClasspathContainer;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.ui.packageview.ClassPathContainer;
public final class IvyClasspathUtil {
private IvyClasspathUtil() {
// utility class
}
/**
* Work around the non adaptability of ClassPathContainer
*
* @param cpc
* the container to transform into an IvyClasspathContainer
* @return the IvyClasspathContainer is such, null, if not
*/
public static IvyClasspathContainerImpl jdt2IvyCPC(ClassPathContainer cpc) {
IClasspathEntry entry = cpc.getClasspathEntry();
try {
IClasspathContainer icp = JavaCore.getClasspathContainer(entry.getPath(),
cpc.getJavaProject());
if (icp instanceof IvyClasspathContainerImpl) {
return (IvyClasspathContainerImpl) icp;
}
} catch (JavaModelException e) {
// unless there are issues with the JDT, this should never happen
IvyPlugin.log(e);
}
return null;
}
public static List split(String str) {
String[] terms = str.split(",");
List ret = new ArrayList();
for (int i = 0; i < terms.length; i++) {
String t = terms[i].trim();
if (t.length() > 0) {
ret.add(t);
}
}
return ret;
}
public static String concat(Collection/* <String> */list) {
if (list == null) {
return "";
}
StringBuffer b = new StringBuffer();
Iterator it = list.iterator();
while (it.hasNext()) {
b.append(it.next());
if (it.hasNext()) {
b.append(",");
}
}
return b.toString();
}
/**
* Just a verbatim copy of the internal Eclipse function:
* org.eclipse.jdt.internal.corext.javadoc
* .JavaDocLocations#getLibraryJavadocLocation(IClasspathEntry)
*
* @param entry
* @return
*/
public static URL getLibraryJavadocLocation(IClasspathEntry entry) {
if (entry == null) {
throw new IllegalArgumentException("Entry must not be null"); //$NON-NLS-1$
}
int kind = entry.getEntryKind();
if (kind != IClasspathEntry.CPE_LIBRARY && kind != IClasspathEntry.CPE_VARIABLE) {
throw new IllegalArgumentException(
"Entry must be of kind CPE_LIBRARY or " + "CPE_VARIABLE"); //$NON-NLS-1$
}
IClasspathAttribute[] extraAttributes = entry.getExtraAttributes();
for (int i = 0; i < extraAttributes.length; i++) {
IClasspathAttribute attrib = extraAttributes[i];
if (IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME.equals(attrib.getName())) {
try {
return new URL(attrib.getValue());
} catch (MalformedURLException e) {
return null;
}
}
}
return null;
}
/**
* Rewrites the module descriptor back to project's ivy file.
*
* @throws IOException
* @throws ParseException
* @throws IvyDEException
*/
public static void toIvyFile(ModuleDescriptor descriptor, IvyClasspathContainerImpl container)
throws ParseException, IOException, IvyDEException {
IvyClasspathContainerConfiguration conf = container.getConf();
// TODO the ivy file might not be in the workspace or may be an absolute path
// in a such case the Eclipse API will state the file a read only
IFile ivyFile = conf.getJavaProject().getProject().getFile(conf.getIvyXmlPath());
IStatus writable = ivyFile.getWorkspace().validateEdit(new IFile[] {ivyFile},
IWorkspace.VALIDATE_PROMPT);
if (writable.isOK()) {
descriptor.toIvyFile(container.getState().getIvyFile());
}
}
/**
* Build the resolve id used when reading and writing resolve reports.
*
* @param conf
* The IvyClasspathContainerConfiguration indicating if extended resolve id is being
* used.
* @param md
* The ModuleDescriptor to be resolved.
* @return The resolve id.
*/
public static String buildResolveId(boolean useExtendedResolveId, ModuleDescriptor md) {
StringBuffer sb = new StringBuffer(ResolveOptions.getDefaultResolveId(md));
if (useExtendedResolveId) {
ModuleRevisionId mrid = md.getModuleRevisionId();
String sts = md.getStatus();
String bch = mrid.getBranch();
String rev = mrid.getRevision();
sb.append("-");
if (sts != null) {
sb.append(sts);
}
sb.append("-");
if (bch != null) {
sb.append(bch);
}
sb.append("-");
if (rev != null) {
sb.append(rev);
}
}
return sb.toString();
}
}