http://git-wip-us.apache.org/repos/asf/zeppelin/blob/55f6c91c/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 c397f45..8c87fbc 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,6 +18,20 @@ 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; @@ -38,24 +52,7 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; -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 - */ +/** Client for API SAP Universe */ public class UniverseClient { private static Logger logger = LoggerFactory.getLogger(UniverseClient.class); @@ -76,8 +73,7 @@ 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(); @@ -87,53 +83,55 @@ 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; @@ -150,68 +148,98 @@ 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()) { @@ -225,15 +253,23 @@ 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))); } } @@ -245,23 +281,31 @@ 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))); } } @@ -278,8 +322,11 @@ 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); } @@ -294,8 +341,9 @@ 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<>(); @@ -325,14 +373,19 @@ 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()); @@ -340,7 +393,6 @@ public class UniverseClient { return universeNodeInfoMap; } return Collections.emptyMap(); - } public void loadUniverses(String token) throws UniverseException { @@ -367,19 +419,25 @@ 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()) { @@ -393,39 +451,56 @@ 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"); @@ -434,28 +509,37 @@ 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()) { @@ -506,11 +590,17 @@ 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))); } } } @@ -534,8 +624,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(); @@ -558,8 +648,9 @@ 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; @@ -612,8 +703,9 @@ 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; } } @@ -705,8 +797,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)); } } } @@ -788,7 +880,8 @@ 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/55f6c91c/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 e67011b..b1e304b 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,6 +17,11 @@ 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; @@ -27,15 +32,7 @@ import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -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. - */ +/** SAP Universe auto complete functionality. */ public class UniverseCompleter { private static Logger logger = LoggerFactory.getLogger(UniverseCompleter.class); @@ -47,69 +44,63 @@ 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()); - } - } - }; - - /** - * 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 o1.getName().compareToIgnoreCase(o2.getName()); + } } - } - return pattern.matcher(StringUtils.EMPTY + buffer.charAt(pos)).matches() + }; + + /** 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); - } - }; + } + }; - /** - * 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; @@ -124,8 +115,7 @@ 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(); } @@ -142,8 +132,9 @@ 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(); @@ -152,32 +143,36 @@ 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); } } @@ -188,8 +183,10 @@ 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<>(); @@ -217,8 +214,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) { @@ -236,8 +233,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())); } } } @@ -254,8 +251,10 @@ 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())) { @@ -267,8 +266,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)) { @@ -276,8 +275,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/55f6c91c/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 8086f94..0a3a671 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,10 +17,7 @@ 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) { @@ -34,5 +31,4 @@ public class UniverseException extends Exception { public UniverseException(String msg, Throwable t) { super(msg, t); } - } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/55f6c91c/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 4f40dce..76cc507 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,16 +17,13 @@ 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/55f6c91c/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 fe0c97e..c9eda24 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,9 +17,7 @@ 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; @@ -27,8 +25,7 @@ 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/55f6c91c/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 af46b46..2729440 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,20 +16,16 @@ */ package org.apache.zeppelin.sap.universe; +import java.util.*; import jline.console.completer.Completer; import jline.internal.Preconditions; import org.apache.commons.lang.StringUtils; -import java.util.*; - -/** - * Case-insensitive completer. - */ +/** 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); @@ -56,8 +52,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/55f6c91c/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 43894b2..7347e65 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,13 +17,10 @@ package org.apache.zeppelin.sap.universe; -import org.apache.commons.lang.StringUtils; - import java.util.OptionalInt; +import org.apache.commons.lang.StringUtils; -/** - * Data of universe query - */ +/** Data of universe query */ public class UniverseQuery { private String select; private String where; @@ -31,8 +28,12 @@ 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; @@ -41,8 +42,9 @@ 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/55f6c91c/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 04b2b49..b143275 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,9 +17,7 @@ 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; @@ -30,11 +28,16 @@ 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/55f6c91c/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 6f24639..a727994 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,27 +17,24 @@ package org.apache.zeppelin.sap.universe; +import java.util.*; import jline.console.completer.ArgumentCompleter.WhitespaceArgumentDelimiter; import org.apache.commons.lang.StringUtils; -import java.util.*; - -/** - * Util class for convert request from Zeppelin to SAP - */ +/** 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"; @@ -60,7 +57,6 @@ 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 = ")"; @@ -120,8 +116,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); } @@ -149,8 +145,9 @@ 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) { @@ -181,8 +178,7 @@ public class UniverseUtil { } } - if (!universePart && singleQuoteClosed - && buf.toString().toLowerCase().endsWith("universe")) { + if (!universePart && singleQuoteClosed && buf.toString().toLowerCase().endsWith("universe")) { universePart = true; continue; } @@ -202,7 +198,9 @@ 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"); @@ -218,9 +216,10 @@ 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; } @@ -232,7 +231,8 @@ 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,15 +261,17 @@ 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; @@ -396,8 +398,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"); @@ -447,8 +449,9 @@ 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); @@ -463,10 +466,8 @@ 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); @@ -479,8 +480,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; @@ -503,15 +504,22 @@ 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; } @@ -521,20 +529,26 @@ 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); @@ -548,8 +562,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(); @@ -583,8 +597,12 @@ 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) { @@ -602,22 +620,33 @@ 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); @@ -666,8 +695,11 @@ 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/55f6c91c/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 91a4217..1c0bbf2 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,30 +5,27 @@ * "License"); you may not use this file except in compliance with the License. You may obtain a * copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * <p>http://www.apache.org/licenses/LICENSE-2.0 * - * 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. + * <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. */ package org.apache.zeppelin.sap.universe; -import org.apache.commons.lang.StringUtils; -import org.apache.zeppelin.completer.CachedCompleter; -import org.junit.Before; -import org.junit.Test; - -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 - */ +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 */ public class UniverseCompleterTest { private UniverseCompleter universeCompleter; @@ -46,21 +43,34 @@ 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);
