/* * 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.maven.projectsupport; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Arrays; import java.util.Properties; import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.project.MavenProject; import org.apache.maven.settings.Settings; import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.Bundle; import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.BundleList; import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.StartLevel; import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.io.xpp3.BundleListXpp3Reader; import org.codehaus.plexus.interpolation.InterpolationException; import org.codehaus.plexus.interpolation.Interpolator; import org.codehaus.plexus.interpolation.PrefixedObjectValueSource; import org.codehaus.plexus.interpolation.PropertiesBasedValueSource; import org.codehaus.plexus.interpolation.StringSearchInterpolator; import org.codehaus.plexus.util.xml.Xpp3Dom; import org.codehaus.plexus.util.xml.pull.XmlPullParserException; /** * Miscellaneous helper methods for working with bundle lists. */ public class BundleListUtils { private BundleListUtils() {} /** * Initialize the artifact definitions using defaults inside the plugin JAR. * * @throws IOException if the default properties can't be read * @throws XmlPullParserException * @throws MojoExecutionException */ public static final void initArtifactDefinitions(ClassLoader classLoader, ArtifactDefinitionsCallback callback) throws IOException { Properties dependencies = new Properties(); dependencies.load(classLoader.getResourceAsStream( "org/apache/sling/maven/projectsupport/dependencies.properties")); callback.initArtifactDefinitions(dependencies); } public static boolean isCurrentArtifact(MavenProject project, ArtifactDefinition def) { return (def.getGroupId().equals(project.getGroupId()) && def.getArtifactId().equals(project.getArtifactId())); } public static BundleList readBundleList(File file) throws IOException, XmlPullParserException { BundleListXpp3Reader reader = new BundleListXpp3Reader(); FileInputStream fis = new FileInputStream(file); try { return reader.read(fis); } finally { fis.close(); } } public static int nodeValue(Xpp3Dom config, String name, int defaultValue) { Xpp3Dom node = config.getChild(name); if (node != null) { return Integer.parseInt(node.getValue()); } else { return defaultValue; } } public static boolean nodeValue(Xpp3Dom config, String name, boolean defaultValue) { Xpp3Dom node = config.getChild(name); if (node != null) { return Boolean.parseBoolean(node.getValue()); } else { return defaultValue; } } public static String nodeValue(Xpp3Dom config, String name, String defaultValue) { Xpp3Dom node = config.getChild(name); if (node != null) { return node.getValue(); } else { return defaultValue; } } public static void interpolateProperties(BundleList bundleList, MavenProject project, MavenSession mavenSession) throws MojoExecutionException { Interpolator interpolator = createInterpolator(project, mavenSession); for (final StartLevel sl : bundleList.getStartLevels()) { for (final Bundle bndl : sl.getBundles()) { try { bndl.setArtifactId(interpolator.interpolate(bndl.getArtifactId())); bndl.setGroupId(interpolator.interpolate(bndl.getGroupId())); bndl.setVersion(interpolator.interpolate(bndl.getVersion())); bndl.setClassifier(interpolator.interpolate(bndl.getClassifier())); bndl.setType(interpolator.interpolate(bndl.getType())); } catch (InterpolationException e) { throw new MojoExecutionException("Unable to interpolate properties for bundle " + bndl.toString(), e); } } } } public static Interpolator createInterpolator(MavenProject project, MavenSession mavenSession) { StringSearchInterpolator interpolator = new StringSearchInterpolator(); final Properties props = new Properties(); props.putAll(project.getProperties()); props.putAll(mavenSession.getSystemProperties()); props.putAll(mavenSession.getUserProperties()); interpolator.addValueSource(new PropertiesBasedValueSource(props)); // add ${project.foo} interpolator.addValueSource(new PrefixedObjectValueSource(Arrays.asList("project", "pom"), project, true)); // add ${session.foo} interpolator.addValueSource(new PrefixedObjectValueSource("session", mavenSession)); // add ${settings.foo} final Settings settings = mavenSession.getSettings(); if (settings != null) { interpolator.addValueSource(new PrefixedObjectValueSource("settings", settings)); } return interpolator; } /** * Callback interface for use with initArtifactDefinitions. */ public static interface ArtifactDefinitionsCallback { void initArtifactDefinitions(Properties dependencies); } }