org.springframework.ide.eclipse.beans.core.internal.model.BeansMapEntry.java Source code

Java tutorial

Introduction

Here is the source code for org.springframework.ide.eclipse.beans.core.internal.model.BeansMapEntry.java

Source

/*******************************************************************************
 * Copyright (c) 2007 Spring IDE Developers
 * 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
 * https://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Spring IDE Developers - initial API and implementation
 *******************************************************************************/
package org.springframework.ide.eclipse.beans.core.internal.model;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.IProgressMonitor;
import org.springframework.beans.BeanMetadataElement;
import org.springframework.ide.eclipse.beans.core.model.IBeansMap;
import org.springframework.ide.eclipse.beans.core.model.IBeansMapEntry;
import org.springframework.ide.eclipse.beans.core.model.IBeansModelElementTypes;
import org.springframework.ide.eclipse.beans.core.model.IBeansProperties;
import org.springframework.ide.eclipse.core.model.IModelElement;
import org.springframework.ide.eclipse.core.model.IModelElementVisitor;
import org.springframework.ide.eclipse.core.model.xml.XmlSourceLocation;
import org.springframework.util.ObjectUtils;

/**
 * Holds a {@link Map.Entry}.
 * @author Torsten Juergeleit
 * @author Christian Dupuis
 */
public class BeansMapEntry extends AbstractBeansValueHolder implements IBeansMapEntry {

    private Object key;

    public BeansMapEntry(IBeansMap map, Map.Entry<?, ?> entry) {
        super(map, "(map entry)", null, null);
        setLocation(entry);
    }

    public int getElementType() {
        return IBeansModelElementTypes.MAP_ENTRY_TYPE;
    }

    @Override
    public IModelElement[] getElementChildren() {
        List<IModelElement> children = new ArrayList<IModelElement>();
        if (!(getElementParent() instanceof IBeansProperties) && key instanceof IModelElement) {
            children.add((IModelElement) key);
        }
        Object value = getValue();
        if (value instanceof IModelElement) {
            children.add((IModelElement) value);
        }
        return children.toArray(new IModelElement[children.size()]);
    }

    @Override
    public void accept(IModelElementVisitor visitor, IProgressMonitor monitor) {

        // First visit this bean
        if (!monitor.isCanceled() && visitor.visit(this, monitor)) {

            // Now ask this entry's key
            if (key instanceof IModelElement) {
                ((IModelElement) key).accept(visitor, monitor);
                if (monitor.isCanceled()) {
                    return;
                }
            }

            // Finally ask this entry's value
            super.accept(visitor, monitor);
        }
    }

    public void setKey(Object key) {
        this.key = key;
    }

    public Object getKey() {
        return key;
    }

    @Override
    public boolean equals(Object other) {
        if (this == other) {
            return true;
        }
        if (!(other instanceof BeansMapEntry)) {
            return false;
        }
        BeansMapEntry that = (BeansMapEntry) other;
        if (!ObjectUtils.nullSafeEquals(this.key, that.key))
            return false;
        return super.equals(other);
    }

    @Override
    public int hashCode() {
        int hashCode = ObjectUtils.nullSafeHashCode(key);
        return getElementType() * hashCode + super.hashCode();
    }

    @Override
    public String toString() {
        StringBuffer text = new StringBuffer(super.toString());
        text.append(", key=");
        text.append(key);
        return text.toString();
    }

    private void setLocation(Map.Entry<?, ?> entry) {
        XmlSourceLocation location = null;
        Object key = entry.getKey();
        if (key instanceof BeanMetadataElement) {
            Object source = ((BeanMetadataElement) key).getSource();
            if (source instanceof XmlSourceLocation) {
                location = new XmlSourceLocation((XmlSourceLocation) source);
            }
        }

        Object value = entry.getValue();
        if (value instanceof BeanMetadataElement) {
            Object source = ((BeanMetadataElement) value).getSource();
            if (source instanceof XmlSourceLocation) {
                if (location == null) {
                    location = new XmlSourceLocation((XmlSourceLocation) source);
                } else {
                    location.setEndLine(((XmlSourceLocation) source).getEndLine());
                }
            }
        }
        if (location != null) {
            location.setLocalName("<entry");
            setElementSourceLocation(location);
        }
    }
}