http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0d746fa2/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseClient.java ---------------------------------------------------------------------- diff --git a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseClient.java b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseClient.java index 8c87fbc..c397f45 100644 --- a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseClient.java +++ b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseClient.java @@ -18,20 +18,6 @@ package org.apache.zeppelin.sap.universe; import com.sun.org.apache.xpath.internal.NodeSet; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.xpath.XPath; -import javax.xml.xpath.XPathConstants; -import javax.xml.xpath.XPathExpression; -import javax.xml.xpath.XPathExpressionException; -import javax.xml.xpath.XPathFactory; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.http.Header; @@ -52,7 +38,24 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; -/** Client for API SAP Universe */ +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpression; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +/** + * Client for API SAP Universe + */ public class UniverseClient { private static Logger logger = LoggerFactory.getLogger(UniverseClient.class); @@ -73,7 +76,8 @@ public class UniverseClient { private String apiUrl; private String authType; private Header[] commonHeaders = { - new BasicHeader("Accept", "application/xml"), new BasicHeader("Content-Type", "application/xml") + new BasicHeader("Accept", "application/xml"), + new BasicHeader("Content-Type", "application/xml") }; // <name, id> private final Map<String, UniverseInfo> universesMap = new ConcurrentHashMap(); @@ -83,55 +87,53 @@ public class UniverseClient { private long universesUpdated = 0; private Map<String, Long> universesInfoUpdatedMap = new HashMap<>(); - private final String loginRequestTemplate = - "<attrs xmlns=\"http://www.sap.com/rws/bip\">\n" - + "<attr name=\"userName\" type=\"string\">%s</attr>\n" - + "<attr name=\"password\" type=\"string\">%s</attr>\n" - + "<attr name=\"auth\" type=\"string\" " - + "possibilities=\"secEnterprise,secLDAP,secWinAD,secSAPR3\">%s</attr>\n" - + "</attrs>"; + private final String loginRequestTemplate = "<attrs xmlns=\"http://www.sap.com/rws/bip\">\n" + + "<attr name=\"userName\" type=\"string\">%s</attr>\n" + + "<attr name=\"password\" type=\"string\">%s</attr>\n" + + "<attr name=\"auth\" type=\"string\" " + + "possibilities=\"secEnterprise,secLDAP,secWinAD,secSAPR3\">%s</attr>\n" + "</attrs>"; private final String createQueryRequestTemplate = - "<query xmlns=\"http://www.sap.com/rws/sl/universe\" dataSourceType=\"%s\" " - + "dataSourceId=\"%s\">\n" - + "<querySpecification version=\"1.0\">\n" - + " <queryOptions>\n" - + " <queryOption name=\"duplicatedRows\" value=\"%s\"/>\n" - + " <queryOption name=\"maxRowsRetrieved\" activated=\"%s\" value=\"%d\"/>\n" - + " </queryOptions>" - + " <queryData>\n%s\n" - + " %s\n" - + " </queryData>\n" - + "</querySpecification>\n" - + "</query>\n"; + "<query xmlns=\"http://www.sap.com/rws/sl/universe\" dataSourceType=\"%s\" " + + "dataSourceId=\"%s\">\n" + + "<querySpecification version=\"1.0\">\n" + + " <queryOptions>\n" + + " <queryOption name=\"duplicatedRows\" value=\"%s\"/>\n" + + " <queryOption name=\"maxRowsRetrieved\" activated=\"%s\" value=\"%d\"/>\n" + + " </queryOptions>" + + " <queryData>\n%s\n" + + " %s\n" + + " </queryData>\n" + + "</querySpecification>\n" + + "</query>\n"; private final String filterPartTemplate = "<filterPart>%s\n</filterPart>"; private final String errorMessageTemplate = "%s\n\n%s"; - private final String parameterTemplate = - "<parameter type=\"prompt\">\n" + "%s\n" + "%s\n" + "%s\n" + "%s\n" + "</parameter>\n"; - private final String parameterAnswerTemplate = - "<answer constrained=\"%s\" type=\"%s\">\n" - + " <info cardinality=\"%s\" keepLastValues=\"%s\"></info>\n" - + " <values>\n" - + " " - + " <value>%s</value>\n" - + " </values>\n" - + " </answer>\n"; - - public UniverseClient( - String user, String password, String apiUrl, String authType, int queryTimeout) { - RequestConfig requestConfig = - RequestConfig.custom() - .setConnectTimeout(queryTimeout) - .setSocketTimeout(queryTimeout) - .build(); + private final String parameterTemplate = "<parameter type=\"prompt\">\n" + + "%s\n" + + "%s\n" + + "%s\n" + + "%s\n" + + "</parameter>\n"; + private final String parameterAnswerTemplate = "<answer constrained=\"%s\" type=\"%s\">\n" + + " <info cardinality=\"%s\" keepLastValues=\"%s\"></info>\n" + + " <values>\n" + " " + + " <value>%s</value>\n" + + " </values>\n" + + " </answer>\n"; + + public UniverseClient(String user, String password, String apiUrl, String authType, + int queryTimeout) { + RequestConfig requestConfig = RequestConfig.custom() + .setConnectTimeout(queryTimeout) + .setSocketTimeout(queryTimeout) + .build(); PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); cm.setMaxTotal(100); cm.setDefaultMaxPerRoute(100); cm.closeIdleConnections(10, TimeUnit.MINUTES); - httpClient = - HttpClientBuilder.create() - .setConnectionManager(cm) - .setDefaultRequestConfig(requestConfig) - .build(); + httpClient = HttpClientBuilder.create() + .setConnectionManager(cm) + .setDefaultRequestConfig(requestConfig) + .build(); this.user = user; this.password = password; @@ -148,98 +150,68 @@ public class UniverseClient { try { httpClient.close(); } catch (Exception e) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(close all): Error close HTTP client", - ExceptionUtils.getStackTrace(e))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(close all): Error close HTTP client", ExceptionUtils.getStackTrace(e))); } + } public String createQuery(String token, UniverseQuery query) throws UniverseException { try { HttpPost httpPost = new HttpPost(String.format("%s%s", apiUrl, "/sl/v1/queries")); setHeaders(httpPost, token); - String where = - StringUtils.isNotBlank(query.getWhere()) - ? String.format(filterPartTemplate, query.getWhere()) - : StringUtils.EMPTY; - httpPost.setEntity( - new StringEntity( - String.format( - createQueryRequestTemplate, - query.getUniverseInfo().getType(), - query.getUniverseInfo().getId(), - query.getDuplicatedRows(), - query.getMaxRowsRetrieved().isPresent(), - query.getMaxRowsRetrieved().orElse(0), - query.getSelect(), - where), - "UTF-8")); + String where = StringUtils.isNotBlank(query.getWhere()) ? + String.format(filterPartTemplate, query.getWhere()) : StringUtils.EMPTY; + httpPost.setEntity(new StringEntity( + String.format(createQueryRequestTemplate, query.getUniverseInfo().getType(), + query.getUniverseInfo().getId(), query.getDuplicatedRows(), + query.getMaxRowsRetrieved().isPresent(), query.getMaxRowsRetrieved().orElse(0), + query.getSelect(), where), "UTF-8")); HttpResponse response = httpClient.execute(httpPost); if (response.getStatusLine().getStatusCode() == 200) { return getValue(EntityUtils.toString(response.getEntity()), "//success/id"); } - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(create query): Request failed\n", - EntityUtils.toString(response.getEntity()))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(create query): Request failed\n", EntityUtils.toString(response.getEntity()))); } catch (IOException e) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(create query): Request failed", - ExceptionUtils.getStackTrace(e))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(create query): Request failed", ExceptionUtils.getStackTrace(e))); } catch (ParserConfigurationException | SAXException | XPathExpressionException e) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(create query): Response processing failed", - ExceptionUtils.getStackTrace(e))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(create query): Response processing failed", ExceptionUtils.getStackTrace(e))); } } public void deleteQuery(String token, String queryId) throws UniverseException { try { if (StringUtils.isNotBlank(queryId)) { - HttpDelete httpDelete = - new HttpDelete(String.format("%s%s%s", apiUrl, "/sl/v1/queries/", queryId)); + HttpDelete httpDelete = new HttpDelete(String.format("%s%s%s", apiUrl, "/sl/v1/queries/", + queryId)); setHeaders(httpDelete, token); httpClient.execute(httpDelete); } } catch (Exception e) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(delete query): Request failed", - ExceptionUtils.getStackTrace(e))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(delete query): Request failed", ExceptionUtils.getStackTrace(e))); } } public List<List<String>> getResults(String token, String queryId) throws UniverseException { - HttpGet httpGet = - new HttpGet( - String.format("%s%s%s%s", apiUrl, "/sl/v1/queries/", queryId, "/data.svc/Flows0")); + HttpGet httpGet = new HttpGet(String.format("%s%s%s%s", apiUrl, "/sl/v1/queries/", + queryId, "/data.svc/Flows0")); setHeaders(httpGet, token); HttpResponse response = null; try { response = httpClient.execute(httpGet); if (response.getStatusLine().getStatusCode() != 200) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(get results): Request failed\n", - EntityUtils.toString(response.getEntity()))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(get results): Request failed\n", EntityUtils.toString(response.getEntity()))); } } catch (IOException e) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(get results): Request failed", - ExceptionUtils.getStackTrace(e))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(get results): Request failed", ExceptionUtils.getStackTrace(e))); } try (InputStream xmlStream = response.getEntity().getContent()) { @@ -253,23 +225,15 @@ public class UniverseClient { if (resultsNodes != null) { return parseResults(resultsNodes); } else { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(get results): Response processing failed")); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(get results): Response processing failed")); } } catch (IOException e) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(get results): Request failed", - ExceptionUtils.getStackTrace(e))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(get results): Request failed", ExceptionUtils.getStackTrace(e))); } catch (ParserConfigurationException | SAXException | XPathExpressionException e) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(get results): Response processing failed", - ExceptionUtils.getStackTrace(e))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(get results): Response processing failed", ExceptionUtils.getStackTrace(e))); } } @@ -281,31 +245,23 @@ public class UniverseClient { HttpPost httpPost = new HttpPost(String.format("%s%s", apiUrl, "/logon/long")); setHeaders(httpPost); - httpPost.setEntity( - new StringEntity(String.format(loginRequestTemplate, user, password, authType), "UTF-8")); + httpPost.setEntity(new StringEntity( + String.format(loginRequestTemplate, user, password, authType), "UTF-8")); HttpResponse response = httpClient.execute(httpPost); String result = null; if (response.getStatusLine().getStatusCode() == 200) { - result = - getValue( - EntityUtils.toString(response.getEntity()), - "//content/attrs/attr[@name=\"logonToken\"]"); + result = getValue(EntityUtils.toString(response.getEntity()), + "//content/attrs/attr[@name=\"logonToken\"]"); tokens.put(paragraphId, result); } return result; } catch (IOException e) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(get token): Request failed", - ExceptionUtils.getStackTrace(e))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(get token): Request failed", ExceptionUtils.getStackTrace(e))); } catch (ParserConfigurationException | SAXException | XPathExpressionException e) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(get token): Response processing failed", - ExceptionUtils.getStackTrace(e))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(get token): Response processing failed", ExceptionUtils.getStackTrace(e))); } } @@ -322,11 +278,8 @@ public class UniverseClient { return false; } catch (Exception e) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(close session): Request failed", - ExceptionUtils.getStackTrace(e))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(close session): Request failed", ExceptionUtils.getStackTrace(e))); } finally { tokens.remove(paragraphId); } @@ -341,9 +294,8 @@ public class UniverseClient { UniverseInfo universeInfo = universesMap.get(universeName); if (universeInfo != null && StringUtils.isNotBlank(universeInfo.getId())) { Map<String, UniverseNodeInfo> universeNodeInfoMap = universeInfosMap.get(universeName); - if (universeNodeInfoMap != null - && universesInfoUpdatedMap.containsKey(universeName) - && !isExpired(universesInfoUpdatedMap.get(universeName))) { + if (universeNodeInfoMap != null && universesInfoUpdatedMap.containsKey(universeName) && + !isExpired(universesInfoUpdatedMap.get(universeName))) { return universeNodeInfoMap; } else { universeNodeInfoMap = new HashMap<>(); @@ -373,19 +325,14 @@ public class UniverseClient { parseUniverseInfo(universeRootInfoNodes, universeNodeInfoMap); } } catch (Exception e) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(get universe nodes info): Response processing failed", - ExceptionUtils.getStackTrace(e))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(get universe nodes info): Response processing failed", + ExceptionUtils.getStackTrace(e))); } } } catch (IOException e) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(get universe nodes info): Request failed", - ExceptionUtils.getStackTrace(e))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(get universe nodes info): Request failed", ExceptionUtils.getStackTrace(e))); } universeInfosMap.put(universeName, universeNodeInfoMap); universesInfoUpdatedMap.put(universeName, System.currentTimeMillis()); @@ -393,6 +340,7 @@ public class UniverseClient { return universeNodeInfoMap; } return Collections.emptyMap(); + } public void loadUniverses(String token) throws UniverseException { @@ -419,25 +367,19 @@ public class UniverseClient { public List<UniverseQueryPrompt> getParameters(String token, String queryId) throws UniverseException { - HttpGet httpGet = - new HttpGet(String.format("%s%s%s%s", apiUrl, "/sl/v1/queries/", queryId, "/parameters")); + HttpGet httpGet = new HttpGet(String.format("%s%s%s%s", apiUrl, "/sl/v1/queries/", + queryId, "/parameters")); setHeaders(httpGet, token); HttpResponse response = null; try { response = httpClient.execute(httpGet); if (response.getStatusLine().getStatusCode() != 200) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(get parameters): Request failed\n", - EntityUtils.toString(response.getEntity()))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(get parameters): Request failed\n", EntityUtils.toString(response.getEntity()))); } } catch (IOException e) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(get parameters): Request failed", - ExceptionUtils.getStackTrace(e))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(get parameters): Request failed", ExceptionUtils.getStackTrace(e))); } try (InputStream xmlStream = response.getEntity().getContent()) { @@ -451,56 +393,39 @@ public class UniverseClient { if (parametersNodes != null) { return parseParameters(parametersNodes); } else { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(get parameters): Response processing failed")); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(get parameters): Response processing failed")); } } catch (IOException e) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(get parameters): Response processing failed", - ExceptionUtils.getStackTrace(e))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(get parameters): Response processing failed", ExceptionUtils.getStackTrace(e))); } catch (ParserConfigurationException | SAXException | XPathExpressionException e) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(get parameters): Response processing failed", - ExceptionUtils.getStackTrace(e))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(get parameters): Response processing failed", ExceptionUtils.getStackTrace(e))); } } - public void setParametersValues( - String token, String queryId, List<UniverseQueryPrompt> parameters) throws UniverseException { - HttpPut httpPut = - new HttpPut(String.format("%s%s%s%s", apiUrl, "/sl/v1/queries/", queryId, "/parameters")); + public void setParametersValues(String token, String queryId, + List<UniverseQueryPrompt> parameters) throws UniverseException { + HttpPut httpPut = new HttpPut(String.format("%s%s%s%s", apiUrl, "/sl/v1/queries/", + queryId, "/parameters")); setHeaders(httpPut, token); HttpResponse response = null; try { StringBuilder request = new StringBuilder(); request.append("<parameters>\n"); for (UniverseQueryPrompt parameter : parameters) { - String answer = - String.format( - parameterAnswerTemplate, - parameter.getConstrained(), - parameter.getType(), - parameter.getCardinality(), - parameter.getKeepLastValues(), - parameter.getValue()); - String id = - parameter.getId() != null - ? String.format("<id>%s</id>\n", parameter.getId()) - : StringUtils.EMPTY; - String technicalName = - parameter.getTechnicalName() != null - ? String.format("<technicalName>%s</technicalName>\n", parameter.getTechnicalName()) - : StringUtils.EMPTY; - String name = - parameter.getTechnicalName() != null - ? String.format("<name>%s</name>\n", parameter.getName()) - : StringUtils.EMPTY; + String answer = String.format(parameterAnswerTemplate, parameter.getConstrained(), + parameter.getType(), parameter.getCardinality(), parameter.getKeepLastValues(), + parameter.getValue()); + String id = parameter.getId() != null ? String.format("<id>%s</id>\n", parameter.getId()) : + StringUtils.EMPTY; + String technicalName = parameter.getTechnicalName() != null ? + String.format("<technicalName>%s</technicalName>\n", parameter.getTechnicalName()) : + StringUtils.EMPTY; + String name = parameter.getTechnicalName() != null ? + String.format("<name>%s</name>\n", parameter.getName()) : + StringUtils.EMPTY; request.append(String.format(parameterTemplate, id, technicalName, name, answer)); } request.append("</parameters>\n"); @@ -509,37 +434,28 @@ public class UniverseClient { response = httpClient.execute(httpPut); if (response.getStatusLine().getStatusCode() != 200) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(set parameters): Request failed\n", - EntityUtils.toString(response.getEntity()))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(set parameters): Request failed\n", EntityUtils.toString(response.getEntity()))); } } catch (IOException e) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(set parameters): Request failed", - ExceptionUtils.getStackTrace(e))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(set parameters): Request failed", ExceptionUtils.getStackTrace(e))); } } private void loadUniverses(String token, int offset, Map<String, UniverseInfo> universesMap) throws UniverseException { int limit = 50; - HttpGet httpGet = - new HttpGet( - String.format("%s%s?offset=%s&limit=%s", apiUrl, "/sl/v1/universes", offset, limit)); + HttpGet httpGet = new HttpGet(String.format("%s%s?offset=%s&limit=%s", apiUrl, + "/sl/v1/universes", + offset, limit)); setHeaders(httpGet, token); HttpResponse response = null; try { response = httpClient.execute(httpGet); } catch (Exception e) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(get universes): Request failed", - ExceptionUtils.getStackTrace(e))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(get universes): Request failed", ExceptionUtils.getStackTrace(e))); } if (response != null && response.getStatusLine().getStatusCode() == 200) { try (InputStream xmlStream = response.getEntity().getContent()) { @@ -590,17 +506,11 @@ public class UniverseClient { } } } catch (IOException e) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(get universes): Response processing failed", - ExceptionUtils.getStackTrace(e))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(get universes): Response processing failed", ExceptionUtils.getStackTrace(e))); } catch (ParserConfigurationException | SAXException | XPathExpressionException e) { - throw new UniverseException( - String.format( - errorMessageTemplate, - "UniverseClient " + "(get universes): Response processing failed", - ExceptionUtils.getStackTrace(e))); + throw new UniverseException(String.format(errorMessageTemplate, "UniverseClient " + + "(get universes): Response processing failed", ExceptionUtils.getStackTrace(e))); } } } @@ -624,8 +534,8 @@ public class UniverseClient { } } - private String getValue(String response, String xPathString) - throws ParserConfigurationException, IOException, SAXException, XPathExpressionException { + private String getValue(String response, String xPathString) throws ParserConfigurationException, + IOException, SAXException, XPathExpressionException { try (InputStream xmlStream = new ByteArrayInputStream(response.getBytes())) { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); @@ -648,9 +558,8 @@ public class UniverseClient { for (int i = 0; i < count; i++) { Node parameterNode = parametersNodeList.item(i); Node type = parameterNode.getAttributes().getNamedItem("type"); - if (type != null - && type.getTextContent().equalsIgnoreCase("prompt") - && parameterNode.hasChildNodes()) { + if (type != null && type.getTextContent().equalsIgnoreCase("prompt") && + parameterNode.hasChildNodes()) { NodeList parameterInfoNodes = parameterNode.getChildNodes(); int childNodesCount = parameterInfoNodes.getLength(); String name = null; @@ -703,9 +612,8 @@ public class UniverseClient { } } if (name != null && id != null && cardinality != null) { - parameters.add( - new UniverseQueryPrompt( - id, name, cardinality, constrained, valueType, technicalName, keepLastValues)); + parameters.add(new UniverseQueryPrompt(id, name, cardinality, constrained, valueType, + technicalName, keepLastValues)); break; } } @@ -797,8 +705,8 @@ public class UniverseClient { key.append("["); key.append(StringUtils.join(path, "].[")); key.append(String.format("].[%s]", nodeName)); - nodes.put( - key.toString(), new UniverseNodeInfo(nodeId, nodeName, nodeType, folder, nodePath)); + nodes.put(key.toString(), + new UniverseNodeInfo(nodeId, nodeName, nodeType, folder, nodePath)); } } } @@ -880,8 +788,7 @@ public class UniverseClient { key.append(String.format("].[%s]", nodeName)); } } - nodes.put( - key.toString(), + nodes.put(key.toString(), new UniverseNodeInfo(nodeId, nodeName, nodeType, folder, nodePath)); } }
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0d746fa2/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseCompleter.java ---------------------------------------------------------------------- diff --git a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseCompleter.java b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseCompleter.java index b1e304b..e67011b 100644 --- a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseCompleter.java +++ b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseCompleter.java @@ -17,11 +17,6 @@ package org.apache.zeppelin.sap.universe; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.*; -import java.util.regex.Pattern; import jline.console.completer.ArgumentCompleter.ArgumentList; import jline.console.completer.ArgumentCompleter.WhitespaceArgumentDelimiter; import org.apache.commons.lang.StringUtils; @@ -32,7 +27,15 @@ import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -/** SAP Universe auto complete functionality. */ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.*; +import java.util.regex.Pattern; + +/** + * SAP Universe auto complete functionality. + */ public class UniverseCompleter { private static Logger logger = LoggerFactory.getLogger(UniverseCompleter.class); @@ -44,63 +47,69 @@ public class UniverseCompleter { public static final String KW_UNIVERSE = "universe"; public static final String TYPE_FOLDER = "folder"; - private static final Comparator nodeInfoComparator = - new Comparator<UniverseNodeInfo>() { - @Override - public int compare(UniverseNodeInfo o1, UniverseNodeInfo o2) { - if (o1.getType().equalsIgnoreCase(TYPE_FOLDER) - && o2.getType().equalsIgnoreCase(TYPE_FOLDER)) { - return o1.getName().compareToIgnoreCase(o2.getName()); - } - if (o1.getType().equalsIgnoreCase(TYPE_FOLDER)) { - return -1; - } - if (o2.getType().equalsIgnoreCase(TYPE_FOLDER)) { - return 1; - } - if (!o1.getType().equalsIgnoreCase(o2.getType())) { - return o1.getType().compareToIgnoreCase(o2.getType()); - } else { + private static final Comparator nodeInfoComparator = new Comparator<UniverseNodeInfo>() { + @Override + public int compare(UniverseNodeInfo o1, UniverseNodeInfo o2) { + if (o1.getType().equalsIgnoreCase(TYPE_FOLDER) + && o2.getType().equalsIgnoreCase(TYPE_FOLDER)) { + return o1.getName().compareToIgnoreCase(o2.getName()); + } + if (o1.getType().equalsIgnoreCase(TYPE_FOLDER)) { + return -1; + } + if (o2.getType().equalsIgnoreCase(TYPE_FOLDER)) { + return 1; + } + if (!o1.getType().equalsIgnoreCase(o2.getType())) { + return o1.getType().compareToIgnoreCase(o2.getType()); + } else { - return o1.getName().compareToIgnoreCase(o2.getName()); - } + return o1.getName().compareToIgnoreCase(o2.getName()); + } + } + }; + + /** + * Delimiter that can split keyword list + */ + private WhitespaceArgumentDelimiter sqlDelimiter = new WhitespaceArgumentDelimiter() { + + private Pattern pattern = Pattern.compile(",|;"); + + @Override + public boolean isDelimiterChar(CharSequence buffer, int pos) { + char c = buffer.charAt(pos); + boolean endName = false; + for (int i = pos; i > 0; i--) { + char ch = buffer.charAt(i); + if (ch == '\n') { + break; } - }; - - /** Delimiter that can split keyword list */ - private WhitespaceArgumentDelimiter sqlDelimiter = - new WhitespaceArgumentDelimiter() { - - private Pattern pattern = Pattern.compile(",|;"); - - @Override - public boolean isDelimiterChar(CharSequence buffer, int pos) { - char c = buffer.charAt(pos); - boolean endName = false; - for (int i = pos; i > 0; i--) { - char ch = buffer.charAt(i); - if (ch == '\n') { - break; - } - if (ch == START_NAME && !endName) { - return false; - } - if (ch == END_NAME) { - break; - } - } - return pattern.matcher(StringUtils.EMPTY + buffer.charAt(pos)).matches() - || super.isDelimiterChar(buffer, pos); + if (ch == START_NAME && !endName) { + return false; } - }; + if (ch == END_NAME) { + break; + } + } + return pattern.matcher(StringUtils.EMPTY + buffer.charAt(pos)).matches() + || super.isDelimiterChar(buffer, pos); + } + }; - /** Universe completer */ + /** + * Universe completer + */ private CachedCompleter universeCompleter; - /** Keywords completer */ + /** + * Keywords completer + */ private CachedCompleter keywordCompleter; - /** UniverseInfo completers */ + /** + * UniverseInfo completers + */ private Map<String, CachedCompleter> universeInfoCompletersMap = new HashMap<>(); private int ttlInSeconds; @@ -115,7 +124,8 @@ public class UniverseCompleter { String argument = cursorArgument.getCursorArgumentPartForComplete(); if (cursorArgument.isUniverseNamePosition()) { List<CharSequence> universeCandidates = new ArrayList<>(); - universeCompleter.getCompleter().complete(argument, argument.length(), universeCandidates); + universeCompleter.getCompleter().complete(argument, argument.length(), + universeCandidates); addCompletions(candidates, universeCandidates, CompletionType.universe.name()); return universeCandidates.size(); } @@ -132,9 +142,8 @@ public class UniverseCompleter { } List<CharSequence> keywordCandidates = new ArrayList<>(); - keywordCompleter - .getCompleter() - .complete(argument, argument.length() > 0 ? argument.length() : 0, keywordCandidates); + keywordCompleter.getCompleter().complete(argument, + argument.length() > 0 ? argument.length() : 0, keywordCandidates); addCompletions(candidates, keywordCandidates, CompletionType.keyword.name()); return keywordCandidates.size(); @@ -143,36 +152,32 @@ public class UniverseCompleter { public void createOrUpdate(UniverseClient client, String token, String buffer, int cursor) { try { CursorArgument cursorArgument = parseCursorArgument(buffer, cursor); - if (keywordCompleter == null - || keywordCompleter.getCompleter() == null + if (keywordCompleter == null || keywordCompleter.getCompleter() == null || keywordCompleter.isExpired()) { Set<String> keywords = getKeywordsCompletions(); if (keywords != null && !keywords.isEmpty()) { keywordCompleter = new CachedCompleter(new StringsCompleter(keywords), 0); } } - if (cursorArgument.needLoadUniverses() - || (universeCompleter == null - || universeCompleter.getCompleter() == null - || universeCompleter.isExpired())) { + if (cursorArgument.needLoadUniverses() || (universeCompleter == null + || universeCompleter.getCompleter() == null || universeCompleter.isExpired())) { client.cleanUniverses(); client.loadUniverses(token); if (client.getUniversesMap().size() > 0) { - universeCompleter = - new CachedCompleter( - new StringsCompleter(client.getUniversesMap().keySet()), ttlInSeconds); + universeCompleter = new CachedCompleter( + new StringsCompleter(client.getUniversesMap().keySet()), ttlInSeconds); } } - if (cursorArgument.needLoadUniverseInfo() - && (!universeInfoCompletersMap.containsKey(cursorArgument.getUniverse()) - || universeInfoCompletersMap.get(cursorArgument.getUniverse()).getCompleter() == null - || universeInfoCompletersMap.get(cursorArgument.getUniverse()).isExpired())) { + if (cursorArgument.needLoadUniverseInfo() && + (!universeInfoCompletersMap.containsKey(cursorArgument.getUniverse()) || + universeInfoCompletersMap.get(cursorArgument.getUniverse()).getCompleter() == null || + universeInfoCompletersMap.get(cursorArgument.getUniverse()).isExpired())) { if (StringUtils.isNotBlank(cursorArgument.getUniverse())) { client.removeUniverseInfo(cursorArgument.getUniverse()); - Map<String, UniverseNodeInfo> info = - client.getUniverseNodesInfo(token, cursorArgument.getUniverse()); - CachedCompleter completer = - new CachedCompleter(new UniverseNodeInfoCompleter(info.values()), ttlInSeconds); + Map<String, UniverseNodeInfo> info = client.getUniverseNodesInfo(token, cursorArgument + .getUniverse()); + CachedCompleter completer = new CachedCompleter( + new UniverseNodeInfoCompleter(info.values()), ttlInSeconds); universeInfoCompletersMap.put(cursorArgument.getUniverse(), completer); } } @@ -183,10 +188,8 @@ public class UniverseCompleter { private Set<String> getKeywordsCompletions() throws IOException { String keywords = - new BufferedReader( - new InputStreamReader( - UniverseCompleter.class.getResourceAsStream("/universe.keywords"))) - .readLine(); + new BufferedReader(new InputStreamReader( + UniverseCompleter.class.getResourceAsStream("/universe.keywords"))).readLine(); Set<String> completions = new TreeSet<>(); @@ -214,8 +217,8 @@ public class UniverseCompleter { if (argIndex > 0 && argList.getArguments()[argIndex - 1].equalsIgnoreCase(KW_UNIVERSE)) { result.setUniverseNamePosition(true); - result.setCursorArgumentPartForComplete( - cleanName(argList.getCursorArgument().substring(0, argList.getArgumentPosition()))); + result.setCursorArgumentPartForComplete(cleanName(argList.getCursorArgument() + .substring(0, argList.getArgumentPosition()))); return result; } if (argIndex > 1) { @@ -233,8 +236,8 @@ public class UniverseCompleter { result.setUniverseNodePosition(true); return result; } else { - result.setCursorArgumentPartForComplete( - argList.getCursorArgument().substring(0, argList.getArgumentPosition())); + result.setCursorArgumentPartForComplete(argList.getCursorArgument() + .substring(0, argList.getArgumentPosition())); } } } @@ -251,10 +254,8 @@ public class UniverseCompleter { return name.replaceAll(CLEAN_NAME_REGEX, StringUtils.EMPTY); } - private void addCompletions( - List<InterpreterCompletion> interpreterCompletions, - List<CharSequence> candidates, - String meta) { + private void addCompletions(List<InterpreterCompletion> interpreterCompletions, + List<CharSequence> candidates, String meta) { for (CharSequence candidate : candidates) { String value; if (meta.equalsIgnoreCase(CompletionType.universe.name())) { @@ -266,8 +267,8 @@ public class UniverseCompleter { } } - private void addCompletions( - List<InterpreterCompletion> interpreterCompletions, List<UniverseNodeInfo> candidates) { + private void addCompletions(List<InterpreterCompletion> interpreterCompletions, + List<UniverseNodeInfo> candidates) { for (UniverseNodeInfo candidate : candidates) { String value; if (candidate.getType().equalsIgnoreCase(TYPE_FOLDER)) { @@ -275,8 +276,8 @@ public class UniverseCompleter { } else { value = String.format("%s%s", candidate.getName(), END_NAME); } - interpreterCompletions.add( - new InterpreterCompletion(candidate.getName(), value, candidate.getType())); + interpreterCompletions.add(new InterpreterCompletion(candidate.getName(), value, + candidate.getType())); } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0d746fa2/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseException.java ---------------------------------------------------------------------- diff --git a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseException.java b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseException.java index 0a3a671..8086f94 100644 --- a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseException.java +++ b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseException.java @@ -17,7 +17,10 @@ package org.apache.zeppelin.sap.universe; -/** Runtime Exception for SAP universe */ + +/** + * Runtime Exception for SAP universe + */ public class UniverseException extends Exception { public UniverseException(Throwable e) { @@ -31,4 +34,5 @@ public class UniverseException extends Exception { public UniverseException(String msg, Throwable t) { super(msg, t); } + } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0d746fa2/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseInfo.java ---------------------------------------------------------------------- diff --git a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseInfo.java b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseInfo.java index 76cc507..4f40dce 100644 --- a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseInfo.java +++ b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseInfo.java @@ -17,13 +17,16 @@ package org.apache.zeppelin.sap.universe; -/** Info about of universe node */ +/** + * Info about of universe node + */ public class UniverseInfo { private String id; private String name; private String type; - public UniverseInfo() {} + public UniverseInfo() { + } public UniverseInfo(String id, String name, String type) { this.id = id; http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0d746fa2/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseNodeInfo.java ---------------------------------------------------------------------- diff --git a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseNodeInfo.java b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseNodeInfo.java index c9eda24..fe0c97e 100644 --- a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseNodeInfo.java +++ b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseNodeInfo.java @@ -17,7 +17,9 @@ package org.apache.zeppelin.sap.universe; -/** Info about of universe item */ +/** + * Info about of universe item + */ public class UniverseNodeInfo { private String id; private String name; @@ -25,7 +27,8 @@ public class UniverseNodeInfo { private String folder; private String nodePath; - public UniverseNodeInfo() {} + public UniverseNodeInfo() { + } public UniverseNodeInfo(String id, String name, String type, String folder, String nodePath) { this.id = id; http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0d746fa2/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseNodeInfoCompleter.java ---------------------------------------------------------------------- diff --git a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseNodeInfoCompleter.java b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseNodeInfoCompleter.java index 2729440..af46b46 100644 --- a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseNodeInfoCompleter.java +++ b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseNodeInfoCompleter.java @@ -16,16 +16,20 @@ */ package org.apache.zeppelin.sap.universe; -import java.util.*; import jline.console.completer.Completer; import jline.internal.Preconditions; import org.apache.commons.lang.StringUtils; -/** Case-insensitive completer. */ +import java.util.*; + +/** + * Case-insensitive completer. + */ public class UniverseNodeInfoCompleter implements Completer { private final UniverseInfoTreeNode tree = new UniverseInfoTreeNode(); - public UniverseNodeInfoCompleter() {} + public UniverseNodeInfoCompleter() { + } public UniverseNodeInfoCompleter(final Collection<UniverseNodeInfo> nodes) { Preconditions.checkNotNull(nodes); @@ -52,8 +56,8 @@ public class UniverseNodeInfoCompleter implements Completer { return completeCollection(buffer, cursor, candidates); } - private int completeCollection( - final String buffer, final int cursor, final Collection candidates) { + private int completeCollection(final String buffer, final int cursor, + final Collection candidates) { Preconditions.checkNotNull(candidates); if (buffer == null) { candidates.addAll(tree.getNodesInfo()); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0d746fa2/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseQuery.java ---------------------------------------------------------------------- diff --git a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseQuery.java b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseQuery.java index 7347e65..43894b2 100644 --- a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseQuery.java +++ b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseQuery.java @@ -17,10 +17,13 @@ package org.apache.zeppelin.sap.universe; -import java.util.OptionalInt; import org.apache.commons.lang.StringUtils; -/** Data of universe query */ +import java.util.OptionalInt; + +/** + * Data of universe query + */ public class UniverseQuery { private String select; private String where; @@ -28,12 +31,8 @@ public class UniverseQuery { private boolean duplicatedRows = false; private OptionalInt maxRowsRetrieved; - public UniverseQuery( - String select, - String where, - UniverseInfo universeInfo, - boolean duplicatedRows, - OptionalInt maxRowsRetrieved) { + public UniverseQuery(String select, String where, UniverseInfo universeInfo, + boolean duplicatedRows, OptionalInt maxRowsRetrieved) { this.select = select; this.where = where; this.universeInfo = universeInfo; @@ -42,9 +41,8 @@ public class UniverseQuery { } public boolean isCorrect() { - return StringUtils.isNotBlank(select) - && universeInfo != null - && StringUtils.isNotBlank(universeInfo.getId()) + return StringUtils.isNotBlank(select) && universeInfo != null && + StringUtils.isNotBlank(universeInfo.getId()) && StringUtils.isNotBlank(universeInfo.getName()); } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0d746fa2/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseQueryPrompt.java ---------------------------------------------------------------------- diff --git a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseQueryPrompt.java b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseQueryPrompt.java index b143275..04b2b49 100644 --- a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseQueryPrompt.java +++ b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseQueryPrompt.java @@ -17,7 +17,9 @@ package org.apache.zeppelin.sap.universe; -/** Info about parameter of universe query */ +/** + * Info about parameter of universe query + */ public class UniverseQueryPrompt { private Integer id; private String name; @@ -28,16 +30,11 @@ public class UniverseQueryPrompt { private String technicalName; private String keepLastValues; - public UniverseQueryPrompt() {} + public UniverseQueryPrompt() { + } - public UniverseQueryPrompt( - Integer id, - String name, - String cardinality, - String constrained, - String type, - String technicalName, - String keepLastValues) { + public UniverseQueryPrompt(Integer id, String name, String cardinality, String constrained, + String type, String technicalName, String keepLastValues) { this.id = id; this.name = name; this.cardinality = cardinality; http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0d746fa2/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseUtil.java ---------------------------------------------------------------------- diff --git a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseUtil.java b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseUtil.java index a727994..6f24639 100644 --- a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseUtil.java +++ b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseUtil.java @@ -17,24 +17,27 @@ package org.apache.zeppelin.sap.universe; -import java.util.*; import jline.console.completer.ArgumentCompleter.WhitespaceArgumentDelimiter; import org.apache.commons.lang.StringUtils; -/** Util class for convert request from Zeppelin to SAP */ +import java.util.*; + +/** + * Util class for convert request from Zeppelin to SAP + */ public class UniverseUtil { - private static final String COMPRASION_START_TEMPLATE = - "<comparisonFilter path=\"%s\" " + "operator=\"%s\" id=\"%s\">\n"; + private static final String COMPRASION_START_TEMPLATE = "<comparisonFilter path=\"%s\" " + + "operator=\"%s\" id=\"%s\">\n"; private static final String COMPRASION_END_TEMPLATE = "</comparisonFilter>\n"; - private static final String COMPARISON_FILTER = - "<comparisonFilter id=\"%s\" path=\"%s\" " + "operator=\"%s\"/>\n"; + private static final String COMPARISON_FILTER = "<comparisonFilter id=\"%s\" path=\"%s\" " + + "operator=\"%s\"/>\n"; private static final String CONST_OPERAND_START_TEMPLATE = "<constantOperand>\n"; private static final String CONST_OPERAND_END_TEMPLATE = "</constantOperand>\n"; - private static final String CONST_OPERAND_VALUE_TEMPLATE = - "<value>\n" + "<caption type=\"%s\">%s</caption>\n</value>\n"; - private static final String PREDEFINED_FILTER_TEMPLATE = - "<predefinedFilter path=\"%s\"" + " id=\"%s\"/>\n"; + private static final String CONST_OPERAND_VALUE_TEMPLATE = "<value>\n" + + "<caption type=\"%s\">%s</caption>\n</value>\n"; + private static final String PREDEFINED_FILTER_TEMPLATE = "<predefinedFilter path=\"%s\"" + + " id=\"%s\"/>\n"; private static final String OBJECT_OPERAND_TEMPLATE = "<objectOperand id=\"%s\" path=\"%s\"/>\n"; private static final String RESULT_START_TEMPLATE = "<resultObjects>\n"; private static final String RESULT_END_TEMPLATE = "</resultObjects>\n"; @@ -57,6 +60,7 @@ public class UniverseUtil { private static final String MARKER_LEFT_BRACE = "#left_brace#"; private static final String MARKER_RIGHT_BRACE = "#right_brace#"; + private static final String LEFT_BRACE = "("; private static final String RIGHT_BRACE = ")"; @@ -116,8 +120,8 @@ public class UniverseUtil { limit = parseInt(arguments[length - 2]); } else if (arguments[length - 2].equals("limit")) { final String toParse = arguments[length - 1]; - limit = - parseInt(toParse.endsWith(";") ? toParse.substring(0, toParse.length() - 1) : toParse); + limit = parseInt(toParse.endsWith(";") ? + toParse.substring(0, toParse.length() - 1) : toParse); } text = text.substring(0, limitIndex); } @@ -145,9 +149,8 @@ public class UniverseUtil { pathClosed = true; if (wherePart) { operatorPosition = true; - if (i + 1 == array.length - || (array[i + 1] != '.' - && isFilter(String.format("%s]", whereBuf.toString()), text.substring(i + 1)))) { + if (i + 1 == array.length || (array[i + 1] != '.' + && isFilter(String.format("%s]", whereBuf.toString()), text.substring(i + 1)))) { whereBuf.append(c); whereBuf.append(MARKER_FILTER); if (i + 1 == array.length) { @@ -178,7 +181,8 @@ public class UniverseUtil { } } - if (!universePart && singleQuoteClosed && buf.toString().toLowerCase().endsWith("universe")) { + if (!universePart && singleQuoteClosed + && buf.toString().toLowerCase().endsWith("universe")) { universePart = true; continue; } @@ -198,9 +202,7 @@ public class UniverseUtil { continue; } - if (!selectPart - && pathClosed - && singleQuoteClosed + if (!selectPart && pathClosed && singleQuoteClosed && buf.toString().toLowerCase().endsWith("select")) { if (StringUtils.isBlank(universe.toString())) { throw new UniverseException("Not found universe name"); @@ -216,10 +218,9 @@ public class UniverseUtil { } if (buf.toString().toLowerCase().endsWith("where") || i == array.length - 1) { selectPart = false; - select.append( - parseResultObj( - resultObj.toString().replaceAll("(?i)wher$", "").replaceAll("(?i)distinc", ""), - nodeInfos)); + select.append(parseResultObj(resultObj.toString() + .replaceAll("(?i)wher$", "").replaceAll("(?i)distinc", ""), + nodeInfos)); select.append(RESULT_END_TEMPLATE); continue; } @@ -231,8 +232,7 @@ public class UniverseUtil { continue; } if (pathClosed && singleQuoteClosed && c == ',') { - select.append( - parseResultObj(resultObj.toString().replaceAll("(?i)distinc", ""), nodeInfos)); + select.append(parseResultObj(resultObj.toString().replaceAll("(?i)distinc", ""), nodeInfos)); resultObj = new StringBuilder(); } else { resultObj.append(c); @@ -261,17 +261,15 @@ public class UniverseUtil { whereBuf.append(c); } } else if (pathClosed) { - if ((c == 'a' || c == 'A') - && i < array.length - 2 - && text.substring(i, i + 3).equalsIgnoreCase("and")) { + if ((c == 'a' || c == 'A') && i < array.length - 2 && + text.substring(i, i + 3).equalsIgnoreCase("and")) { i += 2; whereBuf.append(MARKER_AND); operatorPosition = false; continue; } - if ((c == 'o' || c == 'O') - && i < array.length - 1 - && text.substring(i, i + 2).equalsIgnoreCase("or")) { + if ((c == 'o' || c == 'O') && i < array.length - 1 && + text.substring(i, i + 2).equalsIgnoreCase("or")) { i += 1; whereBuf.append(MARKER_OR); operatorPosition = false; @@ -398,8 +396,8 @@ public class UniverseUtil { throw new UniverseException("Incorrect block where"); } - UniverseQuery universeQuery = - new UniverseQuery(select.toString().trim(), where, universeInfo, duplicatedRows, limit); + UniverseQuery universeQuery = new UniverseQuery(select.toString().trim(), + where, universeInfo, duplicatedRows, limit); if (!universeQuery.isCorrect()) { throw new UniverseException("Incorrect query"); @@ -449,9 +447,8 @@ public class UniverseUtil { } stack.pop(); } else { - while (!stack.empty() - && !stack.peek().equals(LEFT_BRACE) - && (OPERATIONS.get(nextOperation) >= OPERATIONS.get(stack.peek()))) { + while (!stack.empty() && !stack.peek().equals(LEFT_BRACE) && + (OPERATIONS.get(nextOperation) >= OPERATIONS.get(stack.peek()))) { out.add(stack.pop()); } stack.push(nextOperation); @@ -466,8 +463,10 @@ public class UniverseUtil { out.add(stack.pop()); } StringBuffer result = new StringBuffer(); - if (!out.isEmpty()) result.append(out.remove(0)); - while (!out.isEmpty()) result.append(" ").append(out.remove(0)); + if (!out.isEmpty()) + result.append(out.remove(0)); + while (!out.isEmpty()) + result.append(" ").append(out.remove(0)); // result contains the reverse polish notation return convertWhereToXml(result.toString(), nodeInfos); @@ -480,8 +479,8 @@ public class UniverseUtil { if (nodeInfo != null) { return String.format(RESULT_OBJ_TEMPLATE, nodeInfo.getNodePath(), nodeInfo.getId()); } - throw new UniverseException( - String.format("Not found information about: \"%s\"", resultObj.trim())); + throw new UniverseException(String.format("Not found information about: \"%s\"", + resultObj.trim())); } return StringUtils.EMPTY; @@ -504,22 +503,15 @@ public class UniverseUtil { if (token.equalsIgnoreCase(MARKER_NOT_NULL) || token.equalsIgnoreCase(MARKER_NULL)) { UniverseNodeInfo rightOperandInfo = nodeInfos.get(rightOperand); - stack.push( - String.format( - COMPARISON_FILTER, - rightOperandInfo.getId(), - rightOperandInfo.getNodePath(), - operator)); + stack.push(String.format(COMPARISON_FILTER, rightOperandInfo.getId(), + rightOperandInfo.getNodePath(), operator)); continue; } if (token.equalsIgnoreCase(MARKER_FILTER)) { UniverseNodeInfo rightOperandInfo = nodeInfos.get(rightOperand); - stack.push( - String.format( - PREDEFINED_FILTER_TEMPLATE, - rightOperandInfo.getNodePath(), - rightOperandInfo.getId())); + stack.push(String.format(PREDEFINED_FILTER_TEMPLATE, rightOperandInfo.getNodePath(), + rightOperandInfo.getId())); continue; } @@ -529,26 +521,20 @@ public class UniverseUtil { if (rightOperand.matches("^\\[.*\\]$")) { UniverseNodeInfo rightOperandInfo = nodeInfos.get(rightOperand); if (rightOperandInfo == null) { - throw new UniverseException( - String.format("Not found information about: \"%s\"", rightOperand)); + throw new UniverseException(String.format("Not found information about: \"%s\"", + rightOperand)); } - rightOperand = - String.format( - PREDEFINED_FILTER_TEMPLATE, - rightOperandInfo.getNodePath(), - rightOperandInfo.getId()); + rightOperand = String.format(PREDEFINED_FILTER_TEMPLATE, + rightOperandInfo.getNodePath(), rightOperandInfo.getId()); } if (leftOperand.matches("^\\[.*\\]$")) { UniverseNodeInfo leftOperandInfo = nodeInfos.get(leftOperand); if (leftOperandInfo == null) { - throw new UniverseException( - String.format("Not found information about: \"%s\"", leftOperand)); + throw new UniverseException(String.format("Not found information about: \"%s\"", + leftOperand)); } - leftOperand = - String.format( - PREDEFINED_FILTER_TEMPLATE, - leftOperandInfo.getNodePath(), - leftOperandInfo.getId()); + leftOperand = String.format(PREDEFINED_FILTER_TEMPLATE, leftOperandInfo.getNodePath(), + leftOperandInfo.getId()); } tmp.append(String.format("<%s>\n", operator)); tmp.append(leftOperand); @@ -562,8 +548,8 @@ public class UniverseUtil { UniverseNodeInfo leftOperandInfo = nodeInfos.get(leftOperand); if (leftOperandInfo == null) { - throw new UniverseException( - String.format("Not found information about: \"%s\"", leftOperand)); + throw new UniverseException(String.format("Not found information about: \"%s\"", + leftOperand)); } if (token.equalsIgnoreCase(MARKER_IN) || token.equalsIgnoreCase(MARKER_NOT_IN)) { String listValues = rightOperand.replaceAll("^\\(|\\)$", "").trim(); @@ -597,12 +583,8 @@ public class UniverseUtil { } if (!values.isEmpty()) { - tmp.append( - String.format( - COMPRASION_START_TEMPLATE, - leftOperandInfo.getNodePath(), - operator, - leftOperandInfo.getId())); + tmp.append(String.format(COMPRASION_START_TEMPLATE, leftOperandInfo.getNodePath(), + operator, leftOperandInfo.getId())); tmp.append(CONST_OPERAND_START_TEMPLATE); String type = isNumericList ? "Numeric" : "String"; for (String v : values) { @@ -620,33 +602,22 @@ public class UniverseUtil { if (rightOperand.startsWith("[") && rightOperand.endsWith("]")) { rightOperandInfo = nodeInfos.get(rightOperand); if (rightOperandInfo == null) { - throw new UniverseException( - String.format("Not found information about: \"%s\"", rightOperand)); + throw new UniverseException(String.format("Not found information about: \"%s\"", + rightOperand)); } } if (OPERATIONS.containsKey(token)) { if (rightOperandInfo != null) { - tmp.append( - String.format( - COMPRASION_START_TEMPLATE, - leftOperandInfo.getNodePath(), - operator, - leftOperandInfo.getId())); - tmp.append( - String.format( - OBJECT_OPERAND_TEMPLATE, - rightOperandInfo.getId(), - rightOperandInfo.getNodePath())); + tmp.append(String.format(COMPRASION_START_TEMPLATE, leftOperandInfo.getNodePath(), + operator, leftOperandInfo.getId())); + tmp.append(String.format(OBJECT_OPERAND_TEMPLATE, rightOperandInfo.getId(), + rightOperandInfo.getNodePath())); tmp.append(COMPRASION_END_TEMPLATE); } else { String type = rightOperand.startsWith("'") ? "String" : "Numeric"; String value = rightOperand.replaceAll("^'|'$", ""); - tmp.append( - String.format( - COMPRASION_START_TEMPLATE, - leftOperandInfo.getNodePath(), - operator, - leftOperandInfo.getId())); + tmp.append(String.format(COMPRASION_START_TEMPLATE, leftOperandInfo.getNodePath(), + operator, leftOperandInfo.getId())); tmp.append(CONST_OPERAND_START_TEMPLATE); tmp.append(String.format(CONST_OPERAND_VALUE_TEMPLATE, type, value)); tmp.append(CONST_OPERAND_END_TEMPLATE); @@ -695,11 +666,8 @@ public class UniverseUtil { } after = after.trim(); // check after - if (result - && !after.startsWith("and") - && !after.startsWith("or") - && !after.startsWith(";") - && StringUtils.isNotBlank(after)) { + if (result && !after.startsWith("and") && !after.startsWith("or") && + !after.startsWith(";") && StringUtils.isNotBlank(after)) { result = false; } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0d746fa2/sap/src/test/java/org/apache/zeppelin/sap/universe/UniverseCompleterTest.java ---------------------------------------------------------------------- diff --git a/sap/src/test/java/org/apache/zeppelin/sap/universe/UniverseCompleterTest.java b/sap/src/test/java/org/apache/zeppelin/sap/universe/UniverseCompleterTest.java index 1c0bbf2..91a4217 100644 --- a/sap/src/test/java/org/apache/zeppelin/sap/universe/UniverseCompleterTest.java +++ b/sap/src/test/java/org/apache/zeppelin/sap/universe/UniverseCompleterTest.java @@ -5,27 +5,30 @@ * "License"); you may not use this file except in compliance with the License. You may obtain a * copy of the License at * - * <p>http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * - * <p>Unless required by applicable law or agreed to in writing, software distributed under the - * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing permissions and - * limitations under the License. + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. */ package org.apache.zeppelin.sap.universe; -import static org.junit.Assert.*; -import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.util.*; import org.apache.commons.lang.StringUtils; import org.apache.zeppelin.completer.CachedCompleter; import org.junit.Before; import org.junit.Test; -/** Universe completer unit tests */ +import java.util.*; + +import static org.junit.Assert.*; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * Universe completer unit tests + */ public class UniverseCompleterTest { private UniverseCompleter universeCompleter; @@ -43,34 +46,21 @@ public class UniverseCompleterTest { universes.put("(GLOBAL) universe", new UniverseInfo("3", "(GLOBAL) universe", "uvx")); UniverseInfo universeInfo = new UniverseInfo("1", "testUniverse", "uvx"); Map<String, UniverseNodeInfo> testUniverseNodes = new HashMap<>(); - testUniverseNodes.put( - "[Dimension].[Test].[name1]", - new UniverseNodeInfo( - "name1id", - "name1", - "dimension", - "Dimension\\Test", + testUniverseNodes.put("[Dimension].[Test].[name1]", + new UniverseNodeInfo("name1id", "name1", "dimension", "Dimension\\Test", "Dimension|folder\\Test|folder\\name1|dimension")); - testUniverseNodes.put( - "[Dimension].[Test].[name2]", - new UniverseNodeInfo( - "name2id", - "name2", - "dimension", - "Dimension\\Test", + testUniverseNodes.put("[Dimension].[Test].[name2]", + new UniverseNodeInfo("name2id", "name2", "dimension", "Dimension\\Test", "Dimension|folder\\Test|folder\\name2|dimension")); - testUniverseNodes.put( - "[Filter].[name3]", - new UniverseNodeInfo( - "name3id", "name3", "filter", "Filter", "Filter|folder\\name3|filter")); - testUniverseNodes.put( - "[Filter].[name4]", - new UniverseNodeInfo( - "name4id", "name4", "filter", "Filter", "Filter|folder\\name4|filter")); - testUniverseNodes.put( - "[Measure].[name5]", - new UniverseNodeInfo( - "name5id", "name5", "measure", "Measure", "Measure|folder\\name5|measure")); + testUniverseNodes.put("[Filter].[name3]", + new UniverseNodeInfo("name3id", "name3", "filter", "Filter", + "Filter|folder\\name3|filter")); + testUniverseNodes.put("[Filter].[name4]", + new UniverseNodeInfo("name4id", "name4", "filter", "Filter", + "Filter|folder\\name4|filter")); + testUniverseNodes.put("[Measure].[name5]", + new UniverseNodeInfo("name5id", "name5", "measure", "Measure", + "Measure|folder\\name5|measure")); universeClient = mock(UniverseClient.class); when(universeClient.getUniverseInfo(anyString())).thenReturn(universeInfo);
