Package wicketforge.psi.hierarchy

Source Code of wicketforge.psi.hierarchy.MarkupWicketIdHierarchy

/*
* Copyright 2010 The WicketForge-Team
*
* 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 wicketforge.psi.hierarchy;

import com.intellij.psi.PsiElement;
import com.intellij.psi.XmlRecursiveElementVisitor;
import com.intellij.psi.xml.XmlAttribute;
import com.intellij.psi.xml.XmlAttributeValue;
import com.intellij.psi.xml.XmlFile;
import org.jetbrains.annotations.NotNull;
import wicketforge.Constants;

import java.util.HashMap;
import java.util.Map;

/**
*/
public class MarkupWicketIdHierarchy {
    private Map<String, MarkupWicketIdItem> wicketIdPathMap;
    private MarkupWicketIdItem root;

    @NotNull
    public static MarkupWicketIdHierarchy create(@NotNull XmlFile xmlFile) {
        return new MarkupWicketIdHierarchy(xmlFile);
    }

    private MarkupWicketIdHierarchy(@NotNull final XmlFile xmlFile) {
        this.wicketIdPathMap = new HashMap<String, MarkupWicketIdItem>();
        this.root = new MarkupWicketIdItem();
        this.wicketIdPathMap.put("", root);

        xmlFile.accept(new XmlRecursiveElementVisitor() {
            private StringBuilder sb = new StringBuilder();
            private MarkupWicketIdItem current = root;

            @Override
            public void visitElement(PsiElement element) {
                // save
                int i = sb.length();
                MarkupWicketIdItem item = current;
                try {
                    // visit
                    super.visitElement(element);
                } finally {
                    // restore
                    if (sb.length() != i) {
                        sb.setLength(i);
                    }
                    current = item;
                }
            }

            @Override
            public void visitXmlAttribute(XmlAttribute attribute) {
                if (Constants.WICKET_ID.equals(attribute.getName())) {
                    XmlAttributeValue attributeValue = attribute.getValueElement();
                    if (attributeValue != null) {
                        String wicketId = attributeValue.getValue();
                        if (wicketId != null) {
                            MarkupWicketIdItem item = new MarkupWicketIdItem(wicketId, attribute, attributeValue);
                            current.addChild(item);
                            sb.append(Constants.HIERARCHYSEPARATOR).append(wicketId);
                            wicketIdPathMap.put(sb.toString(), item);
                            current = item;
                        }
                    }
                }
                super.visitXmlAttribute(attribute);
            }
        });
    }

    @NotNull
    public Map<String, MarkupWicketIdItem> getWicketIdPathMap() {
        return wicketIdPathMap;
    }

    @NotNull
    public MarkupWicketIdItem getRoot() {
        return root;
    }
}
TOP

Related Classes of wicketforge.psi.hierarchy.MarkupWicketIdHierarchy

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.