private DataserviceTagElement getCurrentDataserviceElement(
     ContentAssistRequest contentAssistRequest) {
   List<String> path = new ArrayList<String>();
   Node currentNode = getCurrentNode(contentAssistRequest);
   while (currentNode != null) {
     if (!(currentNode instanceof Text) && currentNode.getOwnerDocument() != null) {
       path.add(currentNode.getNodeName());
     }
     currentNode = currentNode.getParentNode();
   }
   DataserviceTagElement rootElement = DataserviceTemplate.getRootElement();
   DataserviceTagElement currentElement = null;
   if (rootElement.getName().equals(path.get(path.size() - 1))) {
     currentElement = rootElement;
   } else {
     return null;
   }
   for (int i = path.size() - 2; i >= 0; i--) {
     String s = path.get(i);
     DataserviceTagElement subElement = currentElement.getSubElement(s);
     if (subElement == null) {
       return null;
     } else {
       currentElement = subElement;
     }
   }
   return currentElement;
 }
 @SuppressWarnings("restriction")
 protected void addTagInsertionProposals(
     ContentAssistRequest contentAssistRequest, int childPosition) {
   DataserviceTagElement currentDataserviceElement =
       getCurrentDataserviceElement(contentAssistRequest);
   if (currentDataserviceElement != null) {
     List<DataserviceTagElement> subElements = currentDataserviceElement.getSubElements();
     Node currentNode = getCurrentNode(contentAssistRequest);
     for (DataserviceTagElement element : subElements) {
       if (element.isUpperLimitUnbound()
           || getChildNodeCount(currentNode, element.getName()) < element.getMaxOccurances()) {
         contentAssistRequest.addProposal(getTagProposal(element));
       }
     }
   } else {
     super.addTagInsertionProposals(contentAssistRequest, childPosition);
   }
 }