blob: 9ac3c48de3a20d03b3b44af99e3f09ac3e798bea [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.distribution.packaging.impl.importer;
import javax.annotation.Nonnull;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.distribution.common.DistributionException;
import org.apache.sling.distribution.component.impl.DistributionComponentKind;
import org.apache.sling.distribution.event.DistributionEventTopics;
import org.apache.sling.distribution.event.impl.DistributionEventFactory;
import org.apache.sling.distribution.packaging.DistributionPackage;
import org.apache.sling.distribution.packaging.DistributionPackageBuilder;
import org.apache.sling.distribution.packaging.impl.DistributionPackageImporter;
import org.apache.sling.distribution.packaging.DistributionPackageInfo;
import org.apache.sling.distribution.packaging.impl.DistributionPackageUtils;
import org.apache.sling.distribution.packaging.impl.ReferencePackage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* {@link DistributionPackageImporter} implementation which imports a
* {@link DistributionPackage} locally.
*/
public class LocalDistributionPackageImporter implements DistributionPackageImporter {
private final Logger log = LoggerFactory.getLogger(getClass());
private final DistributionPackageBuilder packageBuilder;
private final DistributionEventFactory eventFactory;
private final String name;
public LocalDistributionPackageImporter(String name, DistributionEventFactory eventFactory, DistributionPackageBuilder packageBuilder) {
if (packageBuilder == null) {
throw new IllegalArgumentException("A package builder is required");
}
if (eventFactory == null) {
throw new IllegalArgumentException("EventFactory is required");
}
if (name == null) {
throw new IllegalArgumentException("An importer name is required");
}
this.packageBuilder = packageBuilder;
this.eventFactory = eventFactory;
this.name = name;
}
@Override
public void importPackage(@Nonnull ResourceResolver resourceResolver, @Nonnull DistributionPackage distributionPackage) throws DistributionException {
boolean success = packageBuilder.installPackage(resourceResolver, distributionPackage);
if (!success) {
log.warn("could not install distribution package {}", distributionPackage.getId());
}
eventFactory.generatePackageEvent(DistributionEventTopics.IMPORTER_PACKAGE_IMPORTED, DistributionComponentKind.IMPORTER, name, distributionPackage.getInfo());
}
@Override
@Nonnull
public DistributionPackageInfo importStream(@Nonnull ResourceResolver resourceResolver, @Nonnull InputStream stream) throws DistributionException {
if (!stream.markSupported()) {
stream = new BufferedInputStream(stream);
}
Map<String, Object> headerInfo = new HashMap<String, Object>();
DistributionPackageUtils.readInfo(stream, headerInfo);
log.debug("header info: {}", headerInfo);
Object o = headerInfo.get(DistributionPackageUtils.PROPERTY_REMOTE_PACKAGE_ID);
String reference = o != null ? String.valueOf(o) : null;
if (reference != null) {
if (ReferencePackage.isReference(reference)) {
String actualPackageId = ReferencePackage.idFromReference(reference);
if (actualPackageId != null) {
log.info("installing from reference {}", actualPackageId);
DistributionPackage distributionPackage = packageBuilder.getPackage(resourceResolver, actualPackageId);
if (distributionPackage != null) {
if (packageBuilder.installPackage(resourceResolver, distributionPackage)) {
DistributionPackageInfo info = distributionPackage.getInfo();
log.info("package installed {}", info);
eventFactory.generatePackageEvent(DistributionEventTopics.IMPORTER_PACKAGE_IMPORTED, DistributionComponentKind.IMPORTER, name, info);
return info;
} else {
throw new DistributionException("could not install package {}" + distributionPackage);
}
} else {
throw new DistributionException("could not install package from reference " + actualPackageId);
}
} else {
throw new DistributionException("could not install package from invalid reference " + reference);
}
} else {
try {
stream.reset(); // TODO : see if this can be removed entirely
} catch (IOException e) {
// do nothing
}
DistributionPackageInfo packageInfo;
Object rr = headerInfo.get("reference-required");
boolean store = rr != null && Boolean.valueOf(rr.toString());
if (store) {
log.debug("storing actual package");
DistributionPackage distributionPackage = packageBuilder.readPackage(resourceResolver, stream);
packageInfo = distributionPackage.getInfo();
log.info("package stored {}", packageInfo);
} else {
packageInfo = packageBuilder.installPackage(resourceResolver, stream);
log.info("package installed {}", packageInfo);
}
eventFactory.generatePackageEvent(DistributionEventTopics.IMPORTER_PACKAGE_IMPORTED, DistributionComponentKind.IMPORTER, name, packageInfo);
return packageInfo;
}
} else {
DistributionPackageInfo packageInfo = packageBuilder.installPackage(resourceResolver, stream);
log.info("package installed");
eventFactory.generatePackageEvent(DistributionEventTopics.IMPORTER_PACKAGE_IMPORTED, DistributionComponentKind.IMPORTER, name, packageInfo);
return packageInfo;
}
}
}