package com.cfsoft.ofbiz.dom.component.impl;
import com.cfsoft.ofbiz.OfbizUtils;
import com.cfsoft.ofbiz.dom.component.ComponentManager;
import com.cfsoft.ofbiz.dom.component.ComponentUrl;
import com.cfsoft.ofbiz.dom.component.api.Component;
import com.cfsoft.ofbiz.dom.component.api.ComponentLoaders;
import com.cfsoft.ofbiz.dom.fieldtype.api.FieldtypeModel;
import com.cfsoft.ofbiz.facet.OfbizFacet;
import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.xml.XmlElement;
import com.intellij.psi.xml.XmlFile;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.xml.DomFileElement;
import com.intellij.util.xml.DomManager;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class ComponentManagerImpl extends ComponentManager {
private final Project project;
public ComponentManagerImpl(Project project) {
this.project = project;
}
@Override
public Component[] getAllComponents() {
List<Component> components =
OfbizUtils.getDomFileElements(Component.class, project, GlobalSearchScope.projectScope(project));
// ComponentLoaders loaderParentdirs = findComponentLoaders(ComponentLoaders.ROOT_PATH);
//
// List<ComponentParentDirectory> list = loaderParentdirs.getComponentParentDirectorys();
//
// for (ComponentParentDirectory directory : list) {
// String dir = directory.getParentDirectory().getValue();
// if (dir.equals(ComponentLoaders.HOT_DEPLOY)) {
// //process hot deploy
// } else {
// ComponentLoaders loader = findComponentLoaders(String.format("%s/%s", dir, ComponentLoaders.NAME));
// if (loader != null) {
// List<ComponentLocation> locations = loader.getComponentLocations();
// for (ComponentLocation location : locations) {
// String componentUrl = String.format("file://%s/%s/%s/%s", project.getBaseDir().getPath(),
// dir, location.getLocation().getValue(), Component.NAME);
// Component component = findComponent(componentUrl);
// if (component != null) {
// components.add(component);
// }
// }
// }
// }
// }
return components.toArray(new Component[components.size()]);
}
private Component findComponent(String url) {
VirtualFile vfile = VirtualFileManager.getInstance().findFileByUrl(url);
PsiFile psiFile = PsiManager.getInstance(project).findFile(vfile);
DomFileElement<Component> fileEle = DomManager.getDomManager(project).getFileElement((XmlFile) psiFile, Component.class);
return fileEle.getRootElement();
}
private ComponentLoaders findComponentLoaders(String relPath) {
//get root
String path = project.getBaseDir().getPath();
VirtualFile vfile = VirtualFileManager.getInstance().findFileByUrl(String.format("file://%s/%s", path, relPath));
if (vfile == null) {
return null;
}
PsiFile psiFile = PsiManager.getInstance(project).findFile(vfile);
DomFileElement<ComponentLoaders> fileEle = DomManager.getDomManager(project).getFileElement((XmlFile) psiFile, ComponentLoaders.class);
return fileEle.getRootElement();
}
@Override
public Component getComponent(String name, Component...components) {
final Component[] list;
if (components.length == 0) {
list = getAllComponents();
}else{
list = components;
}
for (Component component : list) {
if (component.getName().getValue().equals(name)) {
return component;
}
}
return null;
}
@Override
public String getComponentUrl(@NotNull XmlElement xmlElement,Component...components) {
String path = xmlElement.getContainingFile().getVirtualFile().getPath();
return getComponentUrl(path,components);
}
@Override
public Component getComponent(@NotNull XmlElement xmlElement,Component...components) {
if (components.length == 0) {
components = getAllComponents();
}
final String path = xmlElement.getContainingFile().getVirtualFile().getPath();
return ContainerUtil.find(components, new Condition<Component>() {
@Override
public boolean value(Component component) {
return path.startsWith(component.getDirectory());
}
});
}
@Override
public FieldtypeModel getFieldtypeModel(XmlElement xmlElement) {
OfbizFacet facet = OfbizFacet.getInstance(ModuleUtil.findModuleForPsiElement(xmlElement));
if (facet == null) {
return null;
}
String database = facet.getConfiguration().getDatabase();
final String fieldDefName = String.format("fieldtype%s.xml",database);
List<FieldtypeModel> eles = OfbizUtils.getDomFileElements(FieldtypeModel.class, project,
GlobalSearchScope.projectScope(xmlElement.getProject()));
return ContainerUtil.find(eles, new Condition<FieldtypeModel>() {
@Override
public boolean value(FieldtypeModel fieldtypeModel) {
return fieldtypeModel.getXmlElement().getContainingFile().getVirtualFile().
getPath().endsWith("framework/entity/fieldtype/" + fieldDefName);
}
});
}
@Override
public String getComponentUrl(@NotNull String path, Component...components) {
final Component[] list;
if (components.length == 0) {
list = components;
}else{
list = getAllComponents();
}
for (Component component : list) {
if (path.startsWith(component.getDirectory())) {
return String.format("component://%s%s", component.getName().getValue(), path.substring(component.getDirectory().length()));
}
}
return null;
}
@Override
public String getRealPath(@NotNull String componentUrl,Component...components) {
ComponentUrl url = new ComponentUrl(componentUrl);
return url.getRealPath(project, components);
}
@Override
public boolean isComponentUrl(String url,Component...components) {
return url.startsWith("component://");
}
}