use of org.apache.sling.installer.api.tasks.RegisteredResource in project sling by apache.
the class OsgiInstallerImpl method getInstallationState.
/**
* @see org.apache.sling.installer.api.info.InfoProvider#getInstallationState()
*/
@Override
public InstallationState getInstallationState() {
synchronized (this.resourcesLock) {
final InstallationState state = new InstallationState() {
private final List<ResourceGroup> activeResources = new ArrayList<>();
private final List<ResourceGroup> installedResources = new ArrayList<>();
private final List<RegisteredResource> untransformedResources = new ArrayList<>();
@Override
public List<ResourceGroup> getActiveResources() {
return activeResources;
}
@Override
public List<ResourceGroup> getInstalledResources() {
return installedResources;
}
@Override
public List<RegisteredResource> getUntransformedResources() {
return untransformedResources;
}
@Override
public String toString() {
return "InstallationState[active resources: " + this.activeResources + ", installed resources: " + this.installedResources + ", untransformed resources: " + this.untransformedResources + "]";
}
};
for (final String entityId : this.persistentList.getEntityIds()) {
if (!this.persistentList.isSpecialEntityId(entityId)) {
final EntityResourceList group = this.persistentList.getEntityResourceList(entityId);
final String alias = group.getAlias();
final List<Resource> resources = new ArrayList<>();
boolean first = true;
boolean isActive = false;
for (final TaskResource tr : group.getResources()) {
final ResourceState resourceState = tr.getState();
if (first) {
if (resourceState == ResourceState.INSTALL || resourceState == ResourceState.UNINSTALL) {
isActive = true;
}
first = false;
}
resources.add(new Resource() {
@Override
public String getScheme() {
return tr.getScheme();
}
@Override
public String getURL() {
return tr.getURL();
}
@Override
public String getType() {
return tr.getType();
}
@Override
public InputStream getInputStream() throws IOException {
return tr.getInputStream();
}
@Override
public Dictionary<String, Object> getDictionary() {
return tr.getDictionary();
}
@Override
public String getDigest() {
return tr.getDigest();
}
@Override
public int getPriority() {
return tr.getPriority();
}
@Override
public String getEntityId() {
return tr.getEntityId();
}
@Override
public ResourceState getState() {
return resourceState;
}
@Override
public Version getVersion() {
return tr.getVersion();
}
@Override
public long getLastChange() {
return ((RegisteredResourceImpl) tr).getLastChange();
}
@Override
public Object getAttribute(final String key) {
return tr.getAttribute(key);
}
@Override
@CheckForNull
public String getError() {
return tr.getError();
}
@Override
public String toString() {
return "resource[entityId=" + getEntityId() + ", scheme=" + getScheme() + ", url=" + getURL() + ", type=" + getType() + ", error=" + getError() + ", state=" + getState() + ", version=" + getVersion() + ", lastChange=" + getLastChange() + ", priority=" + getPriority() + ", digest=" + getDigest() + "]";
}
});
}
final ResourceGroup rg = new ResourceGroup() {
@Override
public List<Resource> getResources() {
return resources;
}
@Override
public String getAlias() {
return alias;
}
@Override
public String toString() {
return "group[" + resources + "]";
}
};
if (isActive) {
state.getActiveResources().add(rg);
} else {
state.getInstalledResources().add(rg);
}
}
}
Collections.sort(state.getActiveResources(), COMPARATOR);
Collections.sort(state.getInstalledResources(), COMPARATOR);
state.getUntransformedResources().addAll(this.persistentList.getUntransformedResources());
return state;
}
}
use of org.apache.sling.installer.api.tasks.RegisteredResource in project sling by apache.
the class OsgiInstallerImpl method printResources.
private void printResources(String hint) {
if (!logger.isDebugEnabled()) {
return;
}
int counter = 0;
final StringBuilder sb = new StringBuilder();
sb.append(hint);
sb.append(" Resources={\n");
for (final String id : this.persistentList.getEntityIds()) {
sb.append("- ").append(hint).append(" RegisteredResource ");
sb.append(id);
sb.append("\n RegisteredResource.info=[");
String sep = "";
for (final RegisteredResource rr : this.persistentList.getEntityResourceList(id).listResources()) {
sb.append(sep);
sep = ", ";
sb.append(rr);
counter++;
}
sb.append("]\n");
}
sb.append("} (").append(hint).append("): ").append(counter).append(" RegisteredResources\n");
logger.debug(sb.toString());
}
use of org.apache.sling.installer.api.tasks.RegisteredResource in project sling by apache.
the class OsgiInstallerImpl method transformResources.
/**
* Invoke the transformers on the resources.
*/
private void transformResources() {
boolean changed = false;
final List<ServiceReference> serviceRefs = this.transformerTracker.getSortedServiceReferences();
if (serviceRefs.size() > 0) {
synchronized (this.resourcesLock) {
// Walk the list of unknown resources and invoke all transformers
int index = 0;
final List<RegisteredResource> unknownList = this.persistentList.getUntransformedResources();
while (index < unknownList.size()) {
final RegisteredResource resource = unknownList.get(index);
for (final ServiceReference reference : serviceRefs) {
final Long id = (Long) reference.getProperty(Constants.SERVICE_ID);
// check if this transformer has already been invoked for the resource
final String transformers = (String) ((RegisteredResourceImpl) resource).getAttribute(ResourceTransformer.class.getName());
if (id == null || (transformers != null && transformers.contains(":" + id + ':'))) {
continue;
}
final ResourceTransformer transformer = (ResourceTransformer) this.transformerTracker.getService(reference);
if (transformer != null) {
try {
final TransformationResult[] result = transformer.transform(resource);
final String newTransformers = (transformers == null ? ":" + id + ':' : transformers + id + ':');
((RegisteredResourceImpl) resource).setAttribute(ResourceTransformer.class.getName(), newTransformers);
if (logger.isDebugEnabled()) {
logger.debug("Invoked transformer {} on {} : {}", new Object[] { transformer, resource, Arrays.toString(result) });
}
if (result != null && result.length > 0) {
this.persistentList.transform(resource, result);
changed = true;
index--;
break;
}
} catch (final Throwable t) {
logger.error("Uncaught exception during resource transformation!", t);
}
}
}
index++;
}
}
if (changed) {
this.persistentList.save();
printResources("Transformed");
}
}
}
use of org.apache.sling.installer.api.tasks.RegisteredResource in project sling by apache.
the class EntityResourceList method compact.
/**
* Compact the resource group by removing uninstalled entries
* @return <code>true</code> if another cycle should be started.
*/
public boolean compact() {
synchronized (lock) {
Collections.sort(this.resources);
boolean startNewCycle = false;
final List<TaskResource> toDelete = new ArrayList<TaskResource>();
boolean first = true;
for (final TaskResource r : resources) {
if (r.getState() == ResourceState.UNINSTALLED || (!first && r.getState() == ResourceState.UNINSTALL)) {
toDelete.add(r);
}
first = false;
}
if (!toDelete.isEmpty()) {
// Avoid resources.remove(r) as the resource might have
// changed since it was added, which causes it to compare()
// differently and trip the TreeSet.remove() search.
final Set<RegisteredResourceImpl> copy = new HashSet<RegisteredResourceImpl>(resources);
for (final RegisteredResource r : toDelete) {
copy.remove(r);
this.cleanup(r);
LOGGER.debug("Removing uninstalled from list: {}", r);
}
resources.clear();
resources.addAll(copy);
if (!this.isEmpty()) {
startNewCycle = true;
}
}
return startNewCycle;
}
}
use of org.apache.sling.installer.api.tasks.RegisteredResource in project sling by apache.
the class OsgiInstallerWebConsolePlugin method printConfiguration.
/**
* Method for the configuration printer.
*/
public void printConfiguration(final PrintWriter pw, final String mode) {
if (!"zip".equals(mode) && !"txt".equals(mode)) {
return;
}
pw.println("Apache Sling OSGi Installer");
pw.println("===========================");
final InstallationState state = this.installer.getInstallationState();
pw.println("Active Resources");
pw.println("----------------");
String rt = null;
for (final ResourceGroup group : state.getActiveResources()) {
final Resource toActivate = group.getResources().get(0);
if (!toActivate.getType().equals(rt)) {
pw.printf("%s:%n", getType(toActivate));
rt = toActivate.getType();
}
pw.printf("- %s: %s, %s, %s%n", getEntityId(toActivate, group.getAlias()), getInfo(toActivate), getURL(toActivate), toActivate.getState());
}
pw.println();
pw.println("Processed Resources");
pw.println("-------------------");
rt = null;
for (final ResourceGroup group : state.getInstalledResources()) {
final Collection<Resource> resources = group.getResources();
if (resources.size() > 0) {
final Iterator<Resource> iter = resources.iterator();
final Resource first = iter.next();
if (!first.getType().equals(rt)) {
pw.printf("%s:%n", getType(first));
rt = first.getType();
}
pw.printf("* %s: %s, %s, %s%n", getEntityId(first, group.getAlias()), getInfo(first), getURL(first), getState(first));
if (first.getAttribute(TaskResource.ATTR_INSTALL_EXCLUDED) != null) {
pw.printf(" : %s", first.getAttribute(TaskResource.ATTR_INSTALL_EXCLUDED));
}
if (first.getAttribute(TaskResource.ATTR_INSTALL_INFO) != null) {
pw.printf(" : %s", first.getAttribute(TaskResource.ATTR_INSTALL_INFO));
}
while (iter.hasNext()) {
final Resource resource = iter.next();
pw.printf(" - %s, %s, %s%n", getInfo(resource), getURL(resource), resource.getState());
}
}
}
pw.println();
pw.println("Untransformed Resources");
pw.println("-----------------------");
rt = null;
for (final RegisteredResource registeredResource : state.getUntransformedResources()) {
if (!registeredResource.getType().equals(rt)) {
pw.printf("%s:%n", getType(registeredResource));
rt = registeredResource.getType();
}
pw.printf("- %s, %s%n", getInfo(registeredResource), registeredResource.getURL());
}
}
Aggregations