package io.cattle.platform.configitem.server.agentinclude.impl;
import io.cattle.platform.configitem.context.ConfigItemContextFactory;
import io.cattle.platform.configitem.server.agentinclude.AgentIncludeMap;
import io.cattle.platform.configitem.server.model.ConfigItem;
import io.cattle.platform.configitem.server.model.ConfigItemFactory;
import io.cattle.platform.configitem.server.model.impl.LocalArchiveConfigItem;
import io.cattle.platform.configitem.server.model.util.ConfigItemResourceUtil;
import io.cattle.platform.configitem.server.resource.FileBasedResourceRoot;
import io.cattle.platform.configitem.server.resource.ResourceRoot;
import io.cattle.platform.configitem.server.resource.URLBaseResourceRoot;
import io.cattle.platform.configitem.server.template.TemplateFactory;
import io.cattle.platform.configitem.server.template.TemplatesBasedArchiveItem;
import io.cattle.platform.configitem.version.ConfigItemStatusManager;
import io.cattle.platform.object.ObjectManager;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
public class AgentIncludeConfigItemFactoryImpl implements ConfigItemFactory {
String root;
URL[] resources;
String fileRoot;
AgentIncludeMap map;
TemplateFactory templateFactory;
ConfigItemStatusManager versionManager;
List<ConfigItemContextFactory> factories;
ObjectManager objectManager;
ConfigItemStatusManager statusManager;
@Override
public Collection<ConfigItem> getConfigItems() throws IOException {
Set<String> itemSet = new HashSet<>();
List<ConfigItem> itemList = new ArrayList<>();
for (String name : map.getNamedMaps()) {
itemList.add(new AgentPackagesConfigItem(name, versionManager, getResourceRoot(), templateFactory, map, objectManager, statusManager));
Map<String, String> values = map.getMap(name);
for (String key : values.keySet()) {
String value = values.get(key);
if (value != null && !itemSet.contains(value)) {
if (AgentPackagesConfigItem.isDevVersion(value)) {
File file = new File(value);
if (file.exists() && ! file.isDirectory()) {
LocalArchiveConfigItem item = new LocalArchiveConfigItem(file, key, versionManager);
item.setDynamicallyApplied(true);
itemList.add(item);
} else{
FileBasedResourceRoot itemResource = new FileBasedResourceRoot(new File(value));
itemResource.scan();
TemplatesBasedArchiveItem archiveItem = new TemplatesBasedArchiveItem(key, versionManager, itemResource, templateFactory,
getFactories(key));
archiveItem.setDynamicallyApplied(true);
itemList.add(archiveItem);
}
}
itemSet.add(value);
}
}
}
return itemList;
}
protected List<ConfigItemContextFactory> getFactories(String item) {
return ConfigItemResourceUtil.getFactories(factories, item);
}
protected ResourceRoot getResourceRoot() throws IOException {
if (new File(fileRoot).exists()) {
FileBasedResourceRoot root = new FileBasedResourceRoot(new File(fileRoot));
root.scan();
return root;
} else {
Map<String, Map<String, URL>> configs = ConfigItemResourceUtil.processUrlRoot(false, root, resources);
if (configs.size() == 0) {
throw new IllegalStateException("Failed to find to find agent-include");
}
URLBaseResourceRoot root = new URLBaseResourceRoot(configs.values().iterator().next());
root.scan();
return root;
}
}
public AgentIncludeMap getMap() {
return map;
}
@Inject
public void setMap(AgentIncludeMap map) {
this.map = map;
}
public TemplateFactory getTemplateFactory() {
return templateFactory;
}
@Inject
public void setTemplateFactory(TemplateFactory templateFactory) {
this.templateFactory = templateFactory;
}
public ConfigItemStatusManager getVersionManager() {
return versionManager;
}
@Inject
public void setVersionManager(ConfigItemStatusManager versionManager) {
this.versionManager = versionManager;
}
public String getFileRoot() {
return fileRoot;
}
public void setFileRoot(String fileRoot) {
this.fileRoot = fileRoot;
}
public String getRoot() {
return root;
}
public void setRoot(String root) {
this.root = root;
}
public URL[] getResources() {
return resources;
}
public void setResources(URL[] resources) {
this.resources = resources;
}
public List<ConfigItemContextFactory> getFactories() {
return factories;
}
@Inject
public void setFactories(List<ConfigItemContextFactory> factories) {
this.factories = factories;
}
public ObjectManager getObjectManager() {
return objectManager;
}
@Inject
public void setObjectManager(ObjectManager objectManager) {
this.objectManager = objectManager;
}
public ConfigItemStatusManager getStatusManager() {
return statusManager;
}
@Inject
public void setStatusManager(ConfigItemStatusManager statusManager) {
this.statusManager = statusManager;
}
}