/* * 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.sling.ide.eclipse.internal.validation; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.jar.Manifest; import org.apache.sling.ide.eclipse.core.internal.Activator; import org.apache.sling.ide.eclipse.core.internal.ProjectHelper; import org.apache.sling.ide.log.Logger; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jdt.core.IJavaProject; public class ServiceComponentHeaderValidator { /** * Finds missing SCR descriptor files referenced in the manifest * * <p> * Only acts if the Manifest is located under the project's output directory at * </p> * * @param manifest the location of the manifest to parse for the Service-Component header * @return a list of missing files, empty if no problems are found * @throws CoreException any errors */ public List<IFile> findMissingScrDescriptors(IFile manifest) throws CoreException { IProject project = manifest.getProject(); Logger pluginLogger = Activator.getDefault().getPluginLogger(); IJavaProject javaProject = ProjectHelper.asJavaProject(project); IFolder outputFolder = (IFolder) project.getWorkspace().getRoot().findMember(javaProject.getOutputLocation()); if (!outputFolder.getFullPath().isPrefixOf(manifest.getFullPath())) { pluginLogger.trace("Ignoring manifest found at {0} since it is not under the output directory at {1}", manifest.getFullPath(), outputFolder.getFullPath()); return Collections.emptyList(); } List<IFile> missingDescriptors = new ArrayList<>(); try (InputStream contents = manifest.getContents();) { Manifest mf = new Manifest(contents); String serviceComponentHeader = mf.getMainAttributes().getValue("Service-Component"); if (serviceComponentHeader != null) { String[] entries = serviceComponentHeader.split(","); for (String entry : entries) { entry = entry.trim(); if (entry.contains("*")) { pluginLogger.trace("Ignoring wildcard Service-Component entry {0}", entry); continue; } IFile descriptor = outputFolder.getFile(entry); if (descriptor.exists()) { pluginLogger.trace("Found matching resource for Service-Component entry {0}", entry); continue; } missingDescriptors.add(descriptor); pluginLogger.trace("Raising error for missing DS descriptor entry {0}", entry); } } } catch (IOException e) { throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Unable to access " + manifest.getFullPath(), e)); } return missingDescriptors; } }