Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.m2e.model.edit/src/main/java/org/eclipse/m2e/model/edit/pom/translators/PropertiesAdapter.java')
-rw-r--r--org.eclipse.m2e.model.edit/src/main/java/org/eclipse/m2e/model/edit/pom/translators/PropertiesAdapter.java235
1 files changed, 235 insertions, 0 deletions
diff --git a/org.eclipse.m2e.model.edit/src/main/java/org/eclipse/m2e/model/edit/pom/translators/PropertiesAdapter.java b/org.eclipse.m2e.model.edit/src/main/java/org/eclipse/m2e/model/edit/pom/translators/PropertiesAdapter.java
new file mode 100644
index 00000000..85fbbfc3
--- /dev/null
+++ b/org.eclipse.m2e.model.edit/src/main/java/org/eclipse/m2e/model/edit/pom/translators/PropertiesAdapter.java
@@ -0,0 +1,235 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2010 Sonatype, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Sonatype, Inc. - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.m2e.model.edit.pom.translators;
+
+import java.util.List;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.m2e.model.edit.pom.PomFactory;
+import org.eclipse.m2e.model.edit.pom.PropertyElement;
+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+
+/**
+ * Translates a property list using the name and value instead of reflection.
+ *
+ * @author Mike Poindexter
+ *
+ */
+public class PropertiesAdapter extends ListAdapter {
+ protected List<PropertyElement> properties;
+
+ public PropertiesAdapter(SSESyncResource resc, Element containerNode,
+ List<PropertyElement> properties) {
+ super(resc, containerNode, properties, null);
+ this.node = containerNode;
+ this.properties = properties;
+ }
+
+ @Override
+ public void notifyChanged(INodeNotifier notifier, int eventType,
+ Object changedFeature, Object oldValue, Object newValue, int pos) {
+ if (resource.isProcessEvents()) {
+ try {
+ resource.setProcessEvents(false);
+ if (INodeNotifier.ADD == eventType
+ && newValue instanceof Element) {
+ if (notifier == node) {
+ IDOMElement addedElement = (IDOMElement) newValue;
+ int idx = absoluteIndexOf(node, addedElement);
+ if (idx == -1)
+ idx = 0;
+ properties.add(idx, createObject(addedElement));
+ }
+ } else if (INodeNotifier.REMOVE == eventType
+ && oldValue instanceof Element) {
+ if (notifier == node) {
+ for (PropertyElement prop : properties) {
+ PropertyChildAdapter adapter = (PropertyChildAdapter) EcoreUtil
+ .getExistingAdapter(prop,
+ PropertyChildAdapter.class);
+ if (adapter.getElement().equals(oldValue)) {
+ properties.remove(prop);
+ break;
+ }
+ }
+ }
+ } else if (changedFeature instanceof Text) {
+ if (notifier != node && notifier instanceof Element) {
+ Element e = (Element) notifier;
+ String name = e.getLocalName();
+ for (PropertyElement prop : properties) {
+ if (name.equals(prop.getName())) {
+ prop.setValue(getElementText(e));
+ }
+ }
+ }
+ }
+ } finally {
+ resource.setProcessEvents(true);
+ }
+
+ }
+
+ }
+
+ public void add(Object newValue, int position) {
+ final PropertyElement prop = (PropertyElement) newValue;
+ Element newElement = node.getOwnerDocument().createElement(
+ prop.getName());
+ Text value = node.getOwnerDocument().createTextNode(prop.getValue());
+ newElement.appendChild(value);
+
+ if (position < 0)
+ position = 0;
+ Node n = getNthChildWithName(node, "*", position); //$NON-NLS-1$
+ if (n != null) {
+ node.insertBefore(newElement, n);
+ } else {
+ node.appendChild(newElement);
+ }
+ formatNode(newElement);
+ if (null == EcoreUtil.getExistingAdapter(prop,
+ PropertyChildAdapter.class)) {
+ prop.eAdapters().add(new PropertyChildAdapter(prop, newElement));
+ }
+ ((IDOMNode) newElement).addAdapter(this);
+ }
+
+ public void remove(Object oldValue, int position) {
+ if (position == -1)
+ position = 0;
+
+ Element n = getNthChildWithName(node, "*", position); //$NON-NLS-1$
+ if (n != null)
+ removeChildElement(n);
+ }
+
+ public PropertyElement createObject(Element child) {
+ PropertyElement propertyElement = PomFactory.eINSTANCE
+ .createPropertyElement();
+ propertyElement.setName(child.getLocalName());
+ propertyElement.setValue(getElementText(child));
+ if (null == ((IDOMNode) child)
+ .getExistingAdapter(PropertiesAdapter.class)) {
+ ((IDOMNode) child).addAdapter(this);
+ }
+ propertyElement.eAdapters().add(
+ new PropertyChildAdapter(propertyElement, child));
+ return propertyElement;
+ }
+
+ @Override
+ public boolean isAdapterForType(Object type) {
+ return PropertiesAdapter.class.equals(type);
+ }
+
+ @Override
+ public void load() {
+ NodeList children = node.getChildNodes();
+ int nChildren = children.getLength();
+ for (int i = 0; i < nChildren; i++) {
+ Node child = children.item(i);
+ if (child instanceof Element) {
+ properties.add(createObject((Element) child));
+ }
+
+ }
+
+ }
+
+ @Override
+ public void save() {
+ for (PropertyElement o : properties) {
+ add(o, -1);
+ }
+ }
+
+ private class PropertyChildAdapter implements Adapter {
+ private Notifier target;
+ private PropertyElement property;
+ private Element element;
+
+ /**
+ * @param propertyElement
+ * @param container
+ */
+ public PropertyChildAdapter(PropertyElement propertyElement,
+ Element element) {
+ super();
+ this.property = propertyElement;
+ this.element = element;
+ }
+
+ public boolean isAdapterForType(Object type) {
+ return PropertyChildAdapter.class.equals(type);
+ }
+
+ public void notifyChanged(Notification notification) {
+ if (resource.isProcessEvents()) {
+ try {
+ resource.setProcessEvents(false);
+ Element newElement = node.getOwnerDocument().createElement(
+ property.getName());
+ Text value = node.getOwnerDocument().createTextNode(
+ property.getValue());
+ newElement.appendChild(value);
+ node.replaceChild(newElement, element);
+ formatNode(newElement);
+ this.element = newElement;
+ ((IDOMNode) newElement).addAdapter(PropertiesAdapter.this);
+ } finally {
+ resource.setProcessEvents(true);
+ }
+ }
+ }
+
+ /**
+ * @return the target
+ */
+ public Notifier getTarget() {
+ return target;
+ }
+
+ /**
+ * @param target
+ * the target to set
+ */
+ public void setTarget(Notifier target) {
+ this.target = target;
+ }
+
+ /**
+ * @return the property
+ */
+ public PropertyElement getProperty() {
+ return property;
+ }
+
+ /**
+ * @return the element
+ */
+ public Element getElement() {
+ return element;
+ }
+
+ }
+
+}

Back to the top