/* * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "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 * * 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.wso2.carbon.governance.taxonomy.services; import org.w3c.dom.NodeList; import org.wso2.carbon.governance.taxonomy.beans.QueryBean; import org.wso2.carbon.governance.taxonomy.beans.RXTBean; import org.wso2.carbon.governance.taxonomy.beans.TaxonomyBean; import org.wso2.carbon.governance.taxonomy.util.CommonUtils; import org.wso2.carbon.registry.core.exceptions.RegistryException; import org.wso2.carbon.user.api.UserStoreException; import java.util.List; import java.util.Map; import javax.xml.xpath.*; /** * This class will implements the methods for query operations */ class QueryProviderImpl implements IQueryProvider { /** * This method will return list of nodes for a given query * * @param taxonomyQueryBean taxonomy query meta data * @return NodeList (XML) for specific taxonomy file * @throws XPathExpressionException */ @Override public NodeList query(QueryBean taxonomyQueryBean) throws XPathExpressionException { TaxonomyManager taxonomyManager = new TaxonomyManager(); XPath xPathInstance = XPathFactory.newInstance().newXPath(); XPathExpression exp = xPathInstance.compile(getUpdatedQuery(taxonomyQueryBean)); return (NodeList) exp .evaluate(taxonomyManager.getTaxonomy(taxonomyQueryBean).getDocument(), XPathConstants.NODESET); } /** * This method will update the given query to xpath compilable query * * @param taxonomyQueryBean String front end rest api provided query * @return String update query */ @Override public String getUpdatedQuery(QueryBean taxonomyQueryBean) { StringBuilder updatedStringBuilder = new StringBuilder(); String query = taxonomyQueryBean.getQuery(); // this will execute long queries with /children if (query.contains("/") && !query.contains("/*")) { String[] listIds = query.split("/"); updatedStringBuilder.append("/taxonomy/root[@id='").append(listIds[0]).append("']"); for (int ids = 1; ids < listIds.length; ids++) { if (!(ids == listIds.length - 1 && listIds[ids].equals("children"))) { updatedStringBuilder.append("/node[@id='").append(listIds[ids]).append("']"); } } if (query.contains("children")) { updatedStringBuilder.append("/*"); } } else { updatedStringBuilder.append("/taxonomy/root/*"); } return updatedStringBuilder.toString(); } @Override public List<String> getTaxonomiesByRXT(String artifactType) { return null; } /** * This method will return taxonomy name related to given taxonomy id * (this method will execute when only store page refresh and publisher edit view) * @param taxonomyQueryBean Query bean object * @return taxonomy name * @throws UserStoreException * @throws RegistryException * @throws XPathExpressionException */ @Override public String getTaxonomyNameById(QueryBean taxonomyQueryBean) throws UserStoreException, RegistryException, XPathExpressionException { List<RXTBean> rxtBeanList = CommonUtils.getRxtTaxonomies(); for (RXTBean rxtBean : rxtBeanList) { if (rxtBean.getRxtName().equals(taxonomyQueryBean.getAssetType())) { Map<String, Map<String, Boolean>> objTaxonomies = rxtBean.getTaxonomy(); if (objTaxonomies != null) { if (objTaxonomies.size() > 0) { for (Map.Entry<String, Map<String, Boolean>> entry : objTaxonomies.entrySet()) { taxonomyQueryBean.setTaxonomyName(entry.getKey()); TaxonomyManager taxonomyManager = new TaxonomyManager(); XPath xPathInstance = XPathFactory.newInstance().newXPath(); XPathExpression exp = xPathInstance .compile("/taxonomy/root[@id='" + taxonomyQueryBean.getQuery() + "']"); NodeList nodeList = (NodeList) exp .evaluate(taxonomyManager.getTaxonomy(taxonomyQueryBean).getDocument(), XPathConstants.NODESET); if (nodeList.getLength() > 0) { return entry.getKey(); } } } else { String entry = getGlobalTaxonomyName(taxonomyQueryBean); if (entry != null) { return entry; } } } } else { String entry = getGlobalTaxonomyName(taxonomyQueryBean); if (entry != null) { return entry; } } } return null; } /** * This method will return global taxonomy name * @param taxonomyQueryBean Query bean * @return taxonomy name * @throws XPathExpressionException */ private String getGlobalTaxonomyName(QueryBean taxonomyQueryBean) throws XPathExpressionException { TaxonomyManager taxonomyManager = new TaxonomyManager(); Map<String, TaxonomyBean> beanMap = taxonomyManager.getTaxonomyBeanMap(); for (Map.Entry<String, TaxonomyBean> entry : beanMap.entrySet()) { if (entry.getValue().isTaxonomyGlobal()) { taxonomyQueryBean.setTaxonomyName(entry.getKey()); XPath xPathInstance = XPathFactory.newInstance().newXPath(); XPathExpression exp = xPathInstance .compile("/taxonomy/root[@id='" + taxonomyQueryBean.getQuery() + "']"); NodeList nodeList = (NodeList) exp.evaluate(taxonomyManager.getTaxonomy(taxonomyQueryBean).getDocument(), XPathConstants.NODESET); if (nodeList.getLength() > 0) { return entry.getKey(); } } } return null; } }