Java tutorial
/* * 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.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.Properties; import org.apache.ivyde.eclipse.cp.IvyClasspathContainerHelper; import org.apache.ivyde.internal.eclipse.IvyDEMessage; import org.apache.ivyde.internal.eclipse.IvyPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IClasspathAttribute; import org.eclipse.jdt.core.IClasspathContainer; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; public class IvyAttachementManager { private static final String SRC_SUFFIX = "-src"; private static final String SRCROOT_SUFFIX = "-srcroot"; private static final String DOC_SUFFIX = "-doc"; private Properties prop = new Properties(); private File containersAttachementFile; public IvyAttachementManager(File containersAttachementFile) { this.containersAttachementFile = containersAttachementFile; if (!containersAttachementFile.exists()) { IvyDEMessage.verbose("Attachement properties file not found: nothing to load"); return; } IvyDEMessage.verbose("Reading attachement properties"); try { FileInputStream in = new FileInputStream(containersAttachementFile); try { prop.load(in); } finally { try { in.close(); } catch (IOException e) { // don't care } } } catch (IOException ioe) { IvyPlugin.logWarn("IvyDE attachement properties could not be loaded", ioe); } } public void updateAttchements(IJavaProject project, IPath containerPath, IClasspathContainer containerSuggestion) { IvyDEMessage.verbose("Updating attachements on the container " + containerPath); Properties newProps = new Properties(); IClasspathEntry[] newEntries = containerSuggestion.getClasspathEntries(); for (int i = 0; i < newEntries.length; i++) { IClasspathEntry entry = newEntries[i]; if (IClasspathEntry.CPE_LIBRARY == entry.getEntryKind()) { String path = entry.getPath().toPortableString(); if (entry.getSourceAttachmentPath() != null) { newProps.put(path + SRC_SUFFIX, entry.getSourceAttachmentPath().toPortableString()); } if (entry.getSourceAttachmentRootPath() != null) { newProps.put(path + SRCROOT_SUFFIX, entry.getSourceAttachmentRootPath().toPortableString()); } String javadocUrl = getJavadocLocation(entry); if (javadocUrl != null) { newProps.put(path + DOC_SUFFIX, javadocUrl); } } } IvyClasspathContainerImpl ivycp = (IvyClasspathContainerImpl) IvyClasspathContainerHelper .getContainer(containerPath, project); if (ivycp == null) { IvyDEMessage.error("The IvyDE container could not be found. Aborting updating attachements."); // something wrong happened, give up return; } IClasspathEntry[] existingEntries = ivycp.getClasspathEntries(); for (int i = 0; i < existingEntries.length; i++) { IClasspathEntry entry = existingEntries[i]; if (IClasspathEntry.CPE_LIBRARY == entry.getEntryKind()) { String path = entry.getPath().toPortableString(); String value = (String) prop.get(path + SRC_SUFFIX); if (value != null && entry.getSourceAttachmentPath() != null && value.equals(entry.getSourceAttachmentPath().toPortableString())) { newProps.remove(path + SRC_SUFFIX); } value = (String) prop.get(path + SRCROOT_SUFFIX); if (value != null && entry.getSourceAttachmentRootPath() != null && value.equals(entry.getSourceAttachmentRootPath().toPortableString())) { newProps.remove(path + SRCROOT_SUFFIX); } } } // copy the actually new overrided properties prop.putAll(newProps); // now update the ivyde container for real ivycp.updateClasspathEntries(newEntries); // store the global result IvyDEMessage.verbose("Saving attachement properties"); try { FileOutputStream out = new FileOutputStream(containersAttachementFile); try { prop.store(out, ""); } finally { try { out.close(); } catch (IOException e) { // don't care } } } catch (IOException ioe) { IvyPlugin.logWarn("IvyDE attachement properties could not be saved", ioe); } } public IPath getSourceAttachment(IPath path) { String srcPath = prop.getProperty(path.toPortableString() + SRC_SUFFIX); if (srcPath != null && srcPath.length() != 0) { return new Path(srcPath); } return null; } public IPath getSourceAttachmentRoot(IPath path) { String srcPath = prop.getProperty(path.toPortableString() + SRCROOT_SUFFIX); if (srcPath != null && srcPath.length() != 0) { return new Path(srcPath); } return null; } public URL getDocAttachment(IPath path) { String srcPath = prop.getProperty(path.toPortableString() + DOC_SUFFIX); if (srcPath != null && srcPath.length() != 0) { try { return new URL(srcPath); } catch (MalformedURLException e) { IvyPlugin.logWarn("The path for the doc attachement is not a valid URL", e); return null; } } return null; } public IPath getSourceAttachment(IPath classpathArtifact, IPath sourcesArtifact) { IPath sourceAttachment = getSourceAttachment(classpathArtifact); if (sourceAttachment == null) { sourceAttachment = sourcesArtifact; } return sourceAttachment; } public IPath getSourceAttachmentRoot(IPath classpathArtifact, IPath sourcesArtifact) { IPath sourceAttachment = getSourceAttachmentRoot(classpathArtifact); if (sourceAttachment == null && sourcesArtifact != null) { sourceAttachment = sourcesArtifact; } return sourceAttachment; } public String getJavadocLocation(IClasspathEntry entry) { IClasspathAttribute[] attributes = entry.getExtraAttributes(); for (int j = 0; j < attributes.length; j++) { IClasspathAttribute attribute = attributes[j]; if (IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME.equals(attribute.getName())) { return attribute.getValue(); } } return null; } }