package com.cfsoft.ofbiz.dom.component.impl;
import com.cfsoft.ofbiz.OfbizUtils;
import com.cfsoft.ofbiz.dom.component.api.Component;
import com.cfsoft.ofbiz.dom.controller.api.Controller;
import com.cfsoft.ofbiz.dom.entity.api.Entity;
import com.cfsoft.ofbiz.dom.entity.api.EntityModel;
import com.cfsoft.ofbiz.dom.screen.api.Screen;
import com.cfsoft.ofbiz.dom.screen.api.Screens;
import com.cfsoft.ofbiz.dom.service.api.Service;
import com.cfsoft.ofbiz.dom.service.api.Services;
import com.cfsoft.ofbiz.dom.simplemethod.api.SimpleMethod;
import com.cfsoft.ofbiz.dom.simplemethod.api.SimpleMethods;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.search.FilenameIndex;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.xml.XmlFile;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.xml.DomElement;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
import java.util.List;
import static com.cfsoft.ofbiz.OfbizUtils.getDomFileElements;
public abstract class ComponentImpl implements Component {
@Override
public String getDirectory() {
return getXmlElement().getContainingFile().getContainingDirectory().getVirtualFile().getPath();
}
@Override
public List<Controller> getAllControllers() {
return getDomFileElements(Controller.class, getXmlElement().getProject(), scope);
}
@Override
public List<Service> getAllServices() {
List<Services> list = getDomFileElements(Services.class, getXmlElement().getProject(), scope);
return ContainerUtil.concat(list, new Function<Services, Collection<? extends Service>>() {
@Override
public Collection<Service> fun(Services services) {
return services.getServices();
}
});
}
@Override
public List<Screen> getAllScreens() {
List<Screens> list = getDomFileElements(Screens.class, getXmlElement().getProject(), scope);
return ContainerUtil.concat(list, new Function<Screens, Collection<? extends Screen>>() {
@Override
public Collection<Screen> fun(Screens screens) {
return screens.getScreens();
}
});
}
@Override
public List<SimpleMethod> getAllSimpleMethods() {
List<SimpleMethods> list = getDomFileElements(SimpleMethods.class, getXmlElement().getProject(), scope);
return ContainerUtil.concat(list, new Function<SimpleMethods, Collection<? extends SimpleMethod>>() {
@Override
public Collection<? extends SimpleMethod> fun(SimpleMethods simpleMethods) {
return simpleMethods.getSimpleMethods();
}
});
}
public <T extends DomElement> List<T> getDomElements(Class<T> clazz) {
return OfbizUtils.getDomFileElements(clazz, getXmlElement().getProject(), scope);
}
@Override
public GlobalSearchScope getScope() {
return scope;
}
@Override
public List<Entity> getAllEntities() {
List<EntityModel> entityModels = getDomFileElements(EntityModel.class, getXmlElement().getProject(), scope);
return ContainerUtil.concat(entityModels, new Function<EntityModel, Collection<? extends Entity>>() {
@Override
public Collection<? extends Entity> fun(EntityModel entityModel) {
return entityModel.getEntities();
}
});
}
private GlobalSearchScope scope = new GlobalSearchScope(){
@Override
public boolean contains(VirtualFile virtualFile) {
return StdFileTypes.XML == virtualFile.getFileType();
}
@Override
public int compare(VirtualFile virtualFile, VirtualFile virtualFile1) {
return virtualFile.getPath().equals(virtualFile1.getPath())?0:1;
}
@Override
public boolean isSearchInModuleContent(@NotNull Module module) {
return getDirectory().startsWith(module.getModuleFilePath());
}
@Override
public boolean isSearchInLibraries() {
return false;
}
};
}