/******************************************************************************* * Copyright (c) 2009 Red Hat and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat - Initial API and implementation *******************************************************************************/ package org.eclipse.jst.common.internal.modulecore; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IPath; import org.eclipse.jst.common.frameworks.CommonFrameworksPlugin; import org.eclipse.jst.common.internal.modulecore.util.ManifestUtilities; import org.eclipse.wst.common.componentcore.internal.flat.AbstractFlattenParticipant; import org.eclipse.wst.common.componentcore.internal.flat.FlatFile; import org.eclipse.wst.common.componentcore.internal.flat.IFlatFolder; import org.eclipse.wst.common.componentcore.internal.flat.IFlatResource; import org.eclipse.wst.common.componentcore.internal.flat.VirtualComponentFlattenUtility; import org.eclipse.wst.common.componentcore.internal.flat.FlatVirtualComponent.FlatComponentTaskModel; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; import org.eclipse.wst.common.componentcore.resources.IVirtualReference; /** * This class is solely responsible for replacing manifest.mf files * which require updating before being exported * * @author rob * */ public class ReplaceManifestExportParticipant extends AbstractFlattenParticipant { //protected static final IPath MANIFEST_PATH = new Path(J2EEConstants.MANIFEST_URI); private IPath manifestPath; public ReplaceManifestExportParticipant(IPath manifestPath) { this.manifestPath = manifestPath; } @Override public void finalize(IVirtualComponent component, FlatComponentTaskModel dataModel, List<IFlatResource> resources) { forceUpdate(component, dataModel, resources); } public void forceUpdate(IVirtualComponent component, FlatComponentTaskModel dataModel, List<IFlatResource> resources) { List<String> javaClasspathURIs = getClasspathURIs(component); if( !javaClasspathURIs.isEmpty()) { // find the old manifest IFlatFolder parent = (IFlatFolder)VirtualComponentFlattenUtility.getExistingModuleResource(resources, manifestPath.removeLastSegments(1)); if( parent != null ) { IFlatResource[] children = parent.members(); IFile original = null; int originalIndex = 0; for( int i = 0; i < children.length; i++) { if( children[i].getName().equals(manifestPath.lastSegment())) { original = (IFile)children[i].getAdapter(IFile.class); originalIndex = i; File newManifest = getNewManifest(component.getProject(), original, javaClasspathURIs); FlatFile newManifestExportable = new FlatFile(newManifest, newManifest.getName(), manifestPath.removeLastSegments(1)); children[originalIndex] = newManifestExportable; parent.setMembers(children); return; } } } } } /** * Return whichever File is the new one, even if it's the same as the old one * @return */ public File getNewManifest(IProject project, IFile originalManifest, List<String> javaClasspathURIs) { final IPath workingLocation = project.getWorkingLocation(CommonFrameworksPlugin.PLUGIN_ID); // create path to temp MANIFEST.MF final IPath tempManifestPath = workingLocation.append(manifestPath); final File tempFile = tempManifestPath.toFile(); if (!tempFile.exists()) { // create parent dirs for temp MANIFEST.MF final File parent = tempFile.getParentFile(); if (!parent.exists()) { if (!parent.mkdirs()) { return originalManifest != null ? originalManifest.getLocation().toFile() : null; } } } try { ManifestUtilities.updateManifestClasspath(originalManifest, javaClasspathURIs, tempFile); } catch (FileNotFoundException e) { } catch (IOException e) { } return tempFile.exists() ? tempFile : originalManifest != null ? originalManifest.getLocation().toFile() : null; } public static List<String> getClasspathURIs(IVirtualComponent component) { ArrayList<String> uris = new ArrayList<String>(); uris = new ArrayList<String>(); if (component instanceof IClasspathDependencyProvider) { final IClasspathDependencyProvider j2eeComp = (IClasspathDependencyProvider) component; final IVirtualReference[] refs = j2eeComp.getJavaClasspathReferences(); if (refs != null) { for (int i = 0; i < refs.length; i++) { if (refs[i].getRuntimePath().toString().startsWith(IClasspathDependencyReceiver.RUNTIME_MAPPING_INTO_CONTAINER)) { uris.add(refs[i].getRuntimePath().removeFirstSegments(1).append(refs[i].getArchiveName()).toString()); } } } } return uris; } }