blob: 262f32ffc0d5baa7f8e82dc1e9d67ee3dc811943 [file] [log] [blame]
/*
* Copyright 2002-2005 Sascha Weinreuter
*
* 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.intellij.plugins.xpathView;
import com.intellij.openapi.components.*;
import com.intellij.openapi.components.StoragePathMacros;
import com.intellij.openapi.project.Project;
import org.intellij.plugins.xpathView.util.Namespace;
import org.intellij.plugins.xpathView.util.Variable;
import org.jdom.Element;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
/**
* Project component.<br>
* Keeps track of history, etc. on project-basis.<br>
* It is configured to write its settings into the .iws file rather
* than the .ipr file. (see plugin.xml)
*/
@State(
name="XPathView.XPathProjectComponent",
storages= {
@Storage(
file = StoragePathMacros.WORKSPACE_FILE
)}
)
public class XPathProjectComponent implements PersistentStateComponent<Element> {
protected static final String HISTORY_ELEMENT = "element";
protected static final String HISTORY = "history";
protected static final String FIND_HISTORY = "find-history";
protected static final String EXPRESSION = "expression";
protected static final String VARIABLE = "variable";
protected static final String NAME = "name";
protected static final String NAMESPACE = "namespace";
protected static final String PREFIX = "prefix";
protected static final String URI = "uri";
/** A set that maintains the history */
private final LinkedHashMap<String, HistoryElement> history = new LinkedHashMap<String, HistoryElement>();
private final LinkedHashMap<String, HistoryElement> findHistory = new LinkedHashMap<String, HistoryElement>();
// private Set<Namespace> namespaces = new HashSet();
public void loadState(Element state) {
readHistory(state, HISTORY, history);
readHistory(state, FIND_HISTORY, findHistory);
}
@SuppressWarnings({"unchecked"})
private static void readHistory(Element element, String s, LinkedHashMap<String, HistoryElement> hst) {
final Element historyElement = element.getChild(s);
if (historyElement != null) {
final List<Element> entries = historyElement.getChildren(HISTORY_ELEMENT);
for (final Element entry : entries) {
final String expression = entry.getAttributeValue(EXPRESSION);
if (expression != null) {
List<Element> children = entry.getChildren(VARIABLE);
final Collection<Variable> variables = new ArrayList<Variable>(children.size());
for (Element e : children) {
variables.add(new Variable(e.getAttributeValue(NAME), e.getAttributeValue(EXPRESSION)));
}
children = entry.getChildren(NAMESPACE);
final Collection<Namespace> namespaces = new ArrayList<Namespace>(children.size());
for (Element namespaceElement : children) {
namespaces.add(new Namespace(namespaceElement.getAttributeValue(PREFIX), namespaceElement.getAttributeValue(URI)));
}
hst.put(expression, new HistoryElement(expression, variables, namespaces));
}
}
}
}
public Element getState() {
Element element = new Element("xpathview");
writeHistory(element, HISTORY, history);
writeHistory(element, FIND_HISTORY, findHistory);
return element;
}
private static void writeHistory(Element element, String s, LinkedHashMap<String, HistoryElement> hst) {
final Element historyElement = new Element(s);
element.addContent(historyElement);
for (String key : hst.keySet()) {
final Element entryElement = new Element(HISTORY_ELEMENT);
entryElement.setAttribute(EXPRESSION, key);
historyElement.addContent(entryElement);
final HistoryElement h = hst.get(key);
for (Variable variable : h.variables) {
final Element varElement = new Element(VARIABLE);
varElement.setAttribute(NAME, variable.getName());
varElement.setAttribute(EXPRESSION, variable.getExpression());
entryElement.addContent(varElement);
}
for (Namespace namespace : h.namespaces) {
final Element namespaceElement = new Element(NAMESPACE);
namespaceElement.setAttribute(PREFIX, namespace.getPrefix());
namespaceElement.setAttribute(URI, namespace.getUri());
entryElement.addContent(namespaceElement);
}
}
}
/**
* Add a string to the history list
*/
public void addHistory(HistoryElement element) {
final String expression = element.expression;
if (history.containsKey(expression)) {
history.remove(expression);
}
history.put(expression, element);
}
public void addFindHistory(HistoryElement element) {
final String expression = element.expression;
if (findHistory.containsKey(expression)) {
findHistory.remove(expression);
}
findHistory.put(expression, element);
}
/**
* Returns the history
* @return the history as an array of strings
*/
public HistoryElement[] getHistory() {
return history.values().toArray(new HistoryElement[history.values().size()]);
}
public HistoryElement[] getFindHistory() {
return findHistory.values().toArray(new HistoryElement[findHistory.values().size()]);
}
public static XPathProjectComponent getInstance(Project project) {
return ServiceManager.getService(project, XPathProjectComponent.class);
}
}