blob: d03023bd5cbcaa5ecd3bc8a17ac5ac24f3062cb7 [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.maven.slingstart;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.apache.sling.provisioning.model.Artifact;
import org.apache.sling.provisioning.model.Model;
import org.apache.sling.provisioning.model.ModelUtility;
import org.apache.sling.provisioning.model.ModelUtility.ResolverOptions;
import org.apache.sling.provisioning.model.io.ModelReader;
import org.apache.sling.provisioning.model.io.ModelWriter;
public abstract class ProjectHelper {
/** The raw local model. */
private static final String RAW_MODEL_TXT = Model.class.getName() + "/raw.txt";
private static final String RAW_MODEL_CACHE = Model.class.getName() + "/raw.cache";
private static final String EFFECTIVE_MODEL_TXT = Model.class.getName() + "/effective.txt";
private static final String EFFECTIVE_MODEL_CACHE = Model.class.getName() + "/effective.cache";
private static final String DEPENDENCY_MODEL = Model.class.getName() + "/dependency";
/**
* Store all relevant information about the project for plugins to be
* retrieved
* @param info The project info
* @throws IOException If writing fails
*/
public static void storeProjectInfo(final ModelPreprocessor.ProjectInfo info)
throws IOException {
// we have to serialize as the dependency lifecycle participant uses a different class loader (!)
final StringWriter w1 = new StringWriter();
ModelWriter.write(w1, info.localModel);
info.project.setContextValue(RAW_MODEL_TXT, w1.toString());
final StringWriter w2 = new StringWriter();
ModelWriter.write(w2, info.model);
info.project.setContextValue(EFFECTIVE_MODEL_TXT, w2.toString());
// create map with model dependencies
final Map<String, String> map = new HashMap<String, String>();
for(final Map.Entry<Artifact, Model> entry : info.includedModels.entrySet()) {
final StringWriter w3 = new StringWriter();
ModelWriter.write(w3, entry.getValue());
map.put(entry.getKey().toMvnUrl(), w3.toString());
}
info.project.setContextValue(DEPENDENCY_MODEL, map);
}
/**
* Get the effective model from the project
* @param project The maven projet
* @return The effective model
* @throws MojoExecutionException If reading fails
*/
public static Model getEffectiveModel(final MavenProject project, ResolverOptions resolverOptions)
throws MojoExecutionException {
Model result = (Model) project.getContextValue(EFFECTIVE_MODEL_CACHE);
if ( result == null ) {
try {
final StringReader r = new StringReader((String)project.getContextValue(EFFECTIVE_MODEL_TXT));
result = ModelReader.read(r, project.getId());
result = ModelUtility.getEffectiveModel(result, resolverOptions);
project.setContextValue(EFFECTIVE_MODEL_CACHE, result);
} catch ( final IOException ioe) {
throw new MojoExecutionException(ioe.getMessage(), ioe);
}
}
return result;
}
/**
* Get the raw model from the project
* @param project The maven projet
* @return The raw local model
* @throws MojoExecutionException If reading fails
*/
public static Model getRawModel(final MavenProject project)
throws MojoExecutionException {
Model result = (Model) project.getContextValue(RAW_MODEL_CACHE);
if ( result == null ) {
try {
final String text = (String)project.getContextValue(RAW_MODEL_TXT);
if ( text == null ) {
throw new MojoExecutionException("No provisioning model found in project.");
}
final StringReader r = new StringReader(text);
result = ModelReader.read(r, project.getId());
project.setContextValue(RAW_MODEL_CACHE, result);
} catch ( final IOException ioe) {
throw new MojoExecutionException(ioe.getMessage(), ioe);
}
}
return result;
}
/**
* Get the dependency model from the project
* @param project The maven projet
* @return The dependency model
* @throws MojoExecutionException If reading fails
*/
@SuppressWarnings("unchecked")
public static Map<String, String> getDependencyModel(final MavenProject project)
throws MojoExecutionException {
return (Map<String, String>) project.getContextValue(DEPENDENCY_MODEL);
}
}