package org.ovirt.engine.core.searchbackend; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; public class SyntaxContainer implements Iterable<SyntaxObject> { private final String origText; private final LinkedList<SyntaxObject> objList = new LinkedList<>(); private final List<String> currentCompletions = new ArrayList<>(); private static final String LINE_SEPARATOR = "\n"; private boolean valid = false; private SyntaxError error = SyntaxError.NO_ERROR; private final int[] errorPos = new int[2]; private int privateMaxCount; private long searchFrom = 0; private boolean caseSensitive=true; public boolean isSearchUsingTags() { return origText.contains("tag") || (getSearchObjectStr() != null && getSearchObjectStr().equals(SearchObjects.VDC_USER_OBJ_NAME)) || getCrossRefObjList().contains(SearchObjects.VDC_STORAGE_POOL_OBJ_NAME) || getCrossRefObjList().contains(SearchObjects.VDC_STORAGE_DOMAIN_OBJ_NAME); } public int getMaxCount() { return privateMaxCount; } public void setMaxCount(int value) { privateMaxCount = value; } public long getSearchFrom() { return searchFrom; } public void setSearchFrom(long value) { searchFrom = value; } public boolean getvalid() { return valid; } public void setvalid(boolean value) { valid = value; } public SyntaxError getError() { return error; } public boolean getCaseSensitive() { return caseSensitive; } public void setCaseSensitive(boolean value) { caseSensitive = value; } public int getErrorStartPos() { return errorPos[0]; } public int getErrorEndPos() { return errorPos[1]; } public SyntaxObject getFirst() { return objList.getFirst(); } public String getSearchObjectStr() { if (objList.getFirst() != null) { return getObjSingularName(objList.getFirst().getBody()); } return null; } public SyntaxContainer(final String origText) { this.origText = origText; valid = false; } public void setErr(SyntaxError errCode, int startPos, int endPos) { errorPos[0] = startPos; errorPos[1] = endPos; error = errCode; valid = false; } public void addSyntaxObject(SyntaxObjectType type, String body, int startPos, int endPos) { SyntaxObject newObj = new SyntaxObject(type, body, startPos, endPos); objList.addLast(newObj); } public SyntaxObjectType getState() { SyntaxObjectType retval = SyntaxObjectType.BEGIN; if (objList.size() > 0) { retval = objList.getLast().getType(); } return retval; } public int getLastHandledIndex() { int retval = 0; if (objList.size() > 0) { retval = objList.getLast().getPos()[1]; } return retval; } public String getPreviousSyntaxObject(int steps, SyntaxObjectType type) { String retval = ""; if (objList.size() > steps) { SyntaxObject obj = objList.get(objList.size() - 1 - steps); if (obj.getType() == type) { retval = obj.getBody(); } } if ("".equals(retval) && ((type == SyntaxObjectType.CROSS_REF_OBJ) || (type == SyntaxObjectType.SEARCH_OBJECT))) { retval = objList.getFirst().getBody(); } return retval; } public SyntaxObjectType getPreviousSyntaxObjectType(int steps) { SyntaxObjectType retval = SyntaxObjectType.END; if (objList.size() > steps) { SyntaxObject obj = objList.get(objList.size() - 1 - steps); retval = obj.getType(); } return retval; } public void addToACList(String[] acArr) { for (int idx = 0; idx < acArr.length; idx++) { currentCompletions.add(acArr[idx]); } } public String[] getCompletionArray() { String[] retval = new String[currentCompletions.size()]; for (int idx = 0; idx < currentCompletions.size(); idx++) { retval[idx] = currentCompletions.get(idx); } return retval; } public ArrayList<String> getCrossRefObjList() { ArrayList<String> retval = new ArrayList<>(); String searchObj = getObjSingularName(getSearchObjectStr()); for (SyntaxObject obj : objList) { if (obj.getType() == SyntaxObjectType.CROSS_REF_OBJ) { String objSingularName = getObjSingularName(obj.getBody()); if (!retval.contains(objSingularName) && searchObj != null && !searchObj.equals(objSingularName)) { retval.add(objSingularName); } } } return retval; } public String getObjSingularName(String obj) { String retval = obj; if (obj == null) { return null; } if (SearchObjects.AD_USER_OBJ_NAME.equals(obj) || SearchObjects.AD_USER_PLU_OBJ_NAME.equals(obj)) { retval = SearchObjects.AD_USER_OBJ_NAME; } else if (SearchObjects.AUDIT_OBJ_NAME.equals(obj) || SearchObjects.AUDIT_PLU_OBJ_NAME.equals(obj)) { retval = SearchObjects.AUDIT_OBJ_NAME; } else if (SearchObjects.TEMPLATE_OBJ_NAME.equals(obj) || SearchObjects.TEMPLATE_PLU_OBJ_NAME.equals(obj)) { retval = SearchObjects.TEMPLATE_OBJ_NAME; } else if (SearchObjects.VDC_USER_OBJ_NAME.equals(obj) || SearchObjects.VDC_USER_PLU_OBJ_NAME.equals(obj)) { retval = SearchObjects.VDC_USER_OBJ_NAME; } else if (SearchObjects.VDC_GROUP_OBJ_NAME.equals(obj) || SearchObjects.VDC_GROUP_PLU_OBJ_NAME.equals(obj)) { retval = SearchObjects.VDC_GROUP_OBJ_NAME; } else if (SearchObjects.VDS_OBJ_NAME.equals(obj) || SearchObjects.VDS_PLU_OBJ_NAME.equals(obj)) { retval = SearchObjects.VDS_OBJ_NAME; } else if (SearchObjects.VM_OBJ_NAME.equals(obj) || SearchObjects.VM_PLU_OBJ_NAME.equals(obj)) { retval = SearchObjects.VM_OBJ_NAME; } else if (SearchObjects.DISK_OBJ_NAME.equals(obj) || SearchObjects.DISK_PLU_OBJ_NAME.equals(obj)) { retval = SearchObjects.DISK_OBJ_NAME; } else if (SearchObjects.QUOTA_OBJ_NAME.equals(obj) || SearchObjects.QUOTA_PLU_OBJ_NAME.equals(obj)) { retval = SearchObjects.QUOTA_OBJ_NAME; } else if (SearchObjects.VDC_POOL_OBJ_NAME.equals(obj) || SearchObjects.VDC_POOL_PLU_OBJ_NAME.equals(obj)) { retval = SearchObjects.VDC_POOL_OBJ_NAME; } else if (SearchObjects.VDC_CLUSTER_OBJ_NAME.equals(obj) || SearchObjects.VDC_CLUSTER_PLU_OBJ_NAME.equals(obj)) { retval = SearchObjects.VDC_CLUSTER_OBJ_NAME; } else if (SearchObjects.VDC_STORAGE_DOMAIN_OBJ_NAME.equals(obj) || SearchObjects.VDC_STORAGE_DOMAIN_PLU_OBJ_NAME.equals(obj)) { retval = SearchObjects.VDC_STORAGE_DOMAIN_OBJ_NAME; } else if (SearchObjects.GLUSTER_VOLUME_OBJ_NAME.equals(obj) || SearchObjects.GLUSTER_VOLUME_PLU_OBJ_NAME.equals(obj)) { retval = SearchObjects.GLUSTER_VOLUME_OBJ_NAME; } else if (SearchObjects.NETWORK_OBJ_NAME.equals(obj) || SearchObjects.NETWORK_PLU_OBJ_NAME.equals(obj)) { retval = SearchObjects.NETWORK_OBJ_NAME; } else if (SearchObjects.PROVIDER_OBJ_NAME.equals(obj) || SearchObjects.PROVIDER_PLU_OBJ_NAME.equals(obj)) { retval = SearchObjects.PROVIDER_OBJ_NAME; } else if (SearchObjects.SESSION_OBJ_NAME.equals(obj) || SearchObjects.SESSION_PLU_OBJ_NAME.equals(obj)) { retval = SearchObjects.SESSION_OBJ_NAME; } else { retval = obj; } return retval; } @Override public String toString() { StringBuilder sb = new StringBuilder("---------------- SyntaxContainer ---------------------"); sb.append(LINE_SEPARATOR); sb.append("origText = "); sb.append(origText); sb.append(LINE_SEPARATOR); sb.append("Valid = "); sb.append(Boolean.toString(valid)); sb.append(LINE_SEPARATOR); sb.append("Error = "); sb.append(error.toString()); sb.append(LINE_SEPARATOR); sb.append("CrossRefObjlist = "); for (String cro : getCrossRefObjList()) { sb.append(cro).append(", "); } sb.append("Syntax object list:"); for (SyntaxObject obj : objList) { sb.append(" "); sb.append(LINE_SEPARATOR); sb.append(obj.toString()); } return sb.toString(); } public boolean contains(SyntaxObjectType type, String val) { boolean retval = false; for (SyntaxObject obj : objList) { if ((obj.getType() == type) && val.equalsIgnoreCase(obj.getBody())) { retval = true; break; } } return retval; } public ListIterator<SyntaxObject> listIterator(int index) { return objList.listIterator(index); } @Override public Iterator<SyntaxObject> iterator() { return objList.iterator(); } }