blob: 2db2d2b8c36398c5f16e7df5e1f2cd76644fccbd [file] [log] [blame]
/*
* 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;
}
}