use of org.apache.sling.provisioning.model.Traceable in project sling by apache.
the class InstallModelTask method transform.
private Result transform(final String name, final String modelText, final int featureIndex, final TaskResource rsrc, final File baseDir) {
Model model = null;
try (final Reader reader = new StringReader(modelText)) {
model = ModelUtility.getEffectiveModel(ModelReader.read(reader, name));
} catch (final IOException ioe) {
logger.warn("Unable to read model file for feature " + name, ioe);
}
if (model == null) {
return null;
}
int index = 0;
final Iterator<Feature> iter = model.getFeatures().iterator();
while (iter.hasNext()) {
iter.next();
if (index != featureIndex) {
iter.remove();
}
index++;
}
if (baseDir != null) {
final List<Artifact> artifacts = new ArrayList<>();
final Feature feature = model.getFeatures().get(0);
for (final RunMode rm : feature.getRunModes()) {
for (final ArtifactGroup group : rm.getArtifactGroups()) {
for (final Artifact a : group) {
artifacts.add(a);
}
}
}
// extract artifacts
final byte[] buffer = new byte[1024 * 1024 * 256];
try (final InputStream is = rsrc.getInputStream()) {
ModelArchiveReader.read(is, new ModelArchiveReader.ArtifactConsumer() {
@Override
public void consume(final Artifact artifact, final InputStream is) throws IOException {
if (artifacts.contains(artifact)) {
final File artifactFile = new File(baseDir, artifact.getRepositoryPath().replace('/', File.separatorChar));
if (!artifactFile.exists()) {
artifactFile.getParentFile().mkdirs();
try (final OutputStream os = new FileOutputStream(artifactFile)) {
int l = 0;
while ((l = is.read(buffer)) > 0) {
os.write(buffer, 0, l);
}
}
}
}
}
});
} catch (final IOException ioe) {
logger.warn("Unable to extract artifacts from model " + name, ioe);
return null;
}
}
final List<ArtifactDescription> files = new ArrayList<>();
Map<Traceable, String> errors = collectArtifacts(model, files, baseDir);
if (errors == null) {
final Result result = new Result();
for (final ArtifactDescription desc : files) {
if (desc.artifactFile != null) {
try {
final InputStream is = new FileInputStream(desc.artifactFile);
final String digest = String.valueOf(desc.artifactFile.lastModified());
// handle start level
final Dictionary<String, Object> dict = new Hashtable<String, Object>();
if (desc.startLevel > 0) {
dict.put(InstallableResource.BUNDLE_START_LEVEL, desc.startLevel);
}
dict.put(InstallableResource.RESOURCE_URI_HINT, desc.artifactFile.toURI().toString());
result.resources.add(new InstallableResource("/" + desc.artifactFile.getName(), is, dict, digest, InstallableResource.TYPE_FILE, null));
} catch (final IOException ioe) {
logger.warn("Unable to read artifact " + desc.artifactFile, ioe);
return null;
}
} else if (desc.cfg != null) {
final String id = (desc.cfg.getFactoryPid() != null ? desc.cfg.getFactoryPid() + "-" + desc.cfg.getPid() : desc.cfg.getPid());
result.resources.add(new InstallableResource("/" + id + ".config", null, desc.cfg.getProperties(), null, InstallableResource.TYPE_CONFIG, null));
} else if (desc.section != null) {
result.repoinit = desc.section.getContents();
}
}
return result;
}
logger.warn("Errors during parsing model file {} : {}", name, errors.values());
return null;
}
use of org.apache.sling.provisioning.model.Traceable in project sling by apache.
the class InstallModelTask method collectArtifacts.
private Map<Traceable, String> collectArtifacts(final Model effectiveModel, final List<ArtifactDescription> files, final File baseDir) {
final RepositoryAccess repo = new RepositoryAccess();
final Map<Traceable, String> errors = new HashMap<>();
for (final Feature f : effectiveModel.getFeatures()) {
if (f.isSpecial()) {
continue;
}
for (final Section section : f.getAdditionalSections()) {
final ArtifactDescription desc = new ArtifactDescription();
desc.section = section;
files.add(desc);
}
for (final RunMode mode : f.getRunModes()) {
if (mode.isSpecial()) {
continue;
}
if (mode.isActive(this.activeRunModes)) {
for (final ArtifactGroup group : mode.getArtifactGroups()) {
for (final Artifact artifact : group) {
File file = (baseDir == null ? null : new File(baseDir, artifact.getRepositoryPath().replace('/', File.separatorChar)));
if (file == null || !file.exists()) {
file = repo.get(artifact);
}
if (file == null) {
errors.put(artifact, "Artifact " + artifact.toMvnUrl() + " not found.");
} else {
final ArtifactDescription desc = new ArtifactDescription();
desc.artifactFile = file;
desc.startLevel = group.getStartLevel();
files.add(desc);
}
}
}
for (final Configuration cfg : mode.getConfigurations()) {
if (cfg.isSpecial()) {
continue;
}
final ArtifactDescription desc = new ArtifactDescription();
desc.cfg = cfg;
files.add(desc);
}
}
}
}
return errors.isEmpty() ? null : errors;
}
use of org.apache.sling.provisioning.model.Traceable in project sling by apache.
the class ModelTransformer method transform.
@Override
public TransformationResult[] transform(final RegisteredResource resource) {
Model model = null;
File baseDir = null;
if (resource.getType().equals(InstallableResource.TYPE_FILE) && resource.getURL().endsWith(".model")) {
try (final Reader reader = new InputStreamReader(resource.getInputStream(), "UTF-8")) {
model = ModelReader.read(reader, resource.getURL());
} catch (final IOException ioe) {
logger.info("Unable to read model from " + resource.getURL(), ioe);
}
}
if (resource.getType().equals(InstallableResource.TYPE_FILE) && resource.getURL().endsWith(".mar")) {
baseDir = this.bundleContext.getDataFile("");
try (final InputStream is = resource.getInputStream()) {
model = ModelArchiveReader.read(is, new ModelArchiveReader.ArtifactConsumer() {
@Override
public void consume(final Artifact artifact, final InputStream is) throws IOException {
// nothing to do, install task does extraction
}
});
} catch (final IOException ioe) {
logger.info("Unable to read model from " + resource.getURL(), ioe);
}
}
if (model != null) {
Map<Traceable, String> errors = ModelUtility.validate(model);
if (errors == null) {
try {
final Model effectiveModel = ModelUtility.getEffectiveModel(model);
errors = ModelUtility.validateIncludingVersion(effectiveModel);
if (errors == null) {
String modelTxt = null;
try (final StringWriter sw = new StringWriter()) {
ModelWriter.write(sw, effectiveModel);
modelTxt = sw.toString();
} catch (final IOException ioe) {
logger.info("Unable to read model from " + resource.getURL(), ioe);
}
if (modelTxt != null) {
final TransformationResult[] result = new TransformationResult[effectiveModel.getFeatures().size()];
int index = 0;
for (final Feature f : effectiveModel.getFeatures()) {
final TransformationResult tr = new TransformationResult();
tr.setResourceType(TYPE_PROV_MODEL);
tr.setId(f.getName());
tr.setVersion(new Version(f.getVersion()));
final Map<String, Object> attributes = new HashMap<>();
attributes.put(ATTR_MODEL, modelTxt);
attributes.put(ATTR_FEATURE_INDEX, index);
attributes.put(ATTR_FEATURE_NAME, f.getName() + "-" + f.getVersion());
if (baseDir != null) {
final File dir = new File(baseDir, f.getName() + "-" + f.getVersion());
attributes.put(ATTR_BASE_PATH, dir.getAbsolutePath());
}
tr.setAttributes(attributes);
result[index] = tr;
index++;
}
return result;
}
}
} catch (final IllegalArgumentException iae) {
errors = Collections.singletonMap((Traceable) model, iae.getMessage());
}
}
if (errors != null) {
logger.warn("Errors during parsing model at {} : {}", resource.getURL(), errors.values());
}
}
return null;
}
use of org.apache.sling.provisioning.model.Traceable in project sling by apache.
the class ModelArchiveWriter method write.
/**
* Create a model archive.
* The output stream will not be closed by this method. The caller
* must call {@link JarOutputStream#close()} or {@link JarOutputStream#finish()}
* on the return output stream. The caller can add additional files through
* the return stream.
*
* In order to create an archive for a model, each feature in the model must
* have a name and a version and the model must be valid, therefore {@link ModelUtility#validateIncludingVersion(Model)}
* is called first. If the model is invalid an {@code IOException} is thrown.
*
* @param out The output stream to write to
* @param model The model to write
* @param baseManifest Optional base manifest used for creating the manifest.
* @param provider The artifact provider
* @return The jar output stream.
* @throws IOException If anything goes wrong
*/
public static JarOutputStream write(final OutputStream out, final Model model, final Manifest baseManifest, final ArtifactProvider provider) throws IOException {
// check model
final Map<Traceable, String> errors = ModelUtility.validate(model);
if (errors != null) {
throw new IOException("Model is not valid: " + errors);
}
// create manifest
final Manifest manifest = (baseManifest == null ? new Manifest() : new Manifest(baseManifest));
manifest.getMainAttributes().putValue("Manifest-Version", "1.0");
manifest.getMainAttributes().putValue(MANIFEST_HEADER, String.valueOf(ARCHIVE_VERSION));
// create archive
final JarOutputStream jos = new JarOutputStream(out, manifest);
// write model first
final JarEntry entry = new JarEntry(MODEL_NAME);
jos.putNextEntry(entry);
final Writer writer = new OutputStreamWriter(jos, "UTF-8");
ModelWriter.write(writer, model);
writer.flush();
jos.closeEntry();
final byte[] buffer = new byte[1024 * 1024 * 256];
for (final Feature f : model.getFeatures()) {
for (final RunMode rm : f.getRunModes()) {
for (final ArtifactGroup g : rm.getArtifactGroups()) {
for (final Artifact a : g) {
final JarEntry artifactEntry = new JarEntry(ARTIFACTS_PREFIX + a.getRepositoryPath());
jos.putNextEntry(artifactEntry);
try (final InputStream is = provider.getInputStream(a)) {
int l = 0;
while ((l = is.read(buffer)) > 0) {
jos.write(buffer, 0, l);
}
}
jos.closeEntry();
}
}
}
}
return jos;
}
use of org.apache.sling.provisioning.model.Traceable in project sling by apache.
the class ModelPreprocessor method readLocalModel.
/**
* Read all model files from the directory in alphabetical order.
* Only files ending with .txt or .model are read.
*
* @param project The current maven project
* @param inlinedModel the inlined model to be merged with the models in modelDirectory (may be null)
* @param modelDirectory The directory to scan for models
* @param pattern Pattern used to find the textual models within the modelDirectory
* @param logger The logger
*/
protected Model readLocalModel(final MavenProject project, final String inlinedModel, final File modelDirectory, final String pattern, final Logger logger) throws MavenExecutionException, IOException {
final Pattern p = Pattern.compile(pattern);
final List<String> candidates = new ArrayList<>();
if (modelDirectory != null && modelDirectory.exists()) {
for (final File f : modelDirectory.listFiles()) {
if (f.isFile() && !f.getName().startsWith(".")) {
if (p.matcher(f.getName()).matches()) {
candidates.add(f.getName());
}
}
}
Collections.sort(candidates);
}
if (candidates.size() == 0 && (inlinedModel == null || inlinedModel.trim().length() == 0)) {
throw new MavenExecutionException("No model files found in " + modelDirectory + ", and no model inlined in POM.", (File) null);
}
final Model result = new Model();
if (inlinedModel != null) {
logger.debug("Reading inlined model from project " + project.getId());
try {
final Reader reader = new StringReader(inlinedModel);
try {
final Model current = ModelReader.read(reader, "pom");
final Map<Traceable, String> errors = ModelUtility.validate(current);
if (errors != null) {
throw new MavenExecutionException("Invalid inlined model : " + errors, (File) null);
}
MergeUtility.merge(result, current, new MergeUtility.MergeOptions().setHandleRemoveRunMode(false));
} finally {
IOUtils.closeQuietly(reader);
}
} catch (final IOException io) {
throw new MavenExecutionException("Unable to read inlined model", io);
}
}
for (final String name : candidates) {
logger.debug("Reading model " + name + " in project " + project.getId());
try {
final File f = new File(modelDirectory, name);
final FileReader reader = new FileReader(f);
try {
final Model current = ModelReader.read(reader, f.getAbsolutePath());
final Map<Traceable, String> errors = ModelUtility.validate(current);
if (errors != null) {
throw new MavenExecutionException("Invalid model at " + name + " : " + errors, (File) null);
}
MergeUtility.merge(result, current, new MergeUtility.MergeOptions().setHandleRemoveRunMode(false));
} finally {
IOUtils.closeQuietly(reader);
}
} catch (final IOException io) {
throw new MavenExecutionException("Unable to read model at " + name, io);
}
}
final Map<Traceable, String> errors = ModelUtility.validate(result);
if (errors != null) {
throw new MavenExecutionException("Invalid assembled model : " + errors, (File) null);
}
return postProcessReadModel(result);
}
Aggregations