it.geosolutions.geoserver.rest.encoder.utils.NestedElementEncoder Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of geoserver-manager Show documentation
Show all versions of geoserver-manager Show documentation
GeoServer Manager is a library to interact with GeoServer
The scope of this library is to have a simple API, and use as few external
libs as possible.
The newest version!
/*
* GeoServer-Manager - Simple Manager Library for GeoServer
*
* Copyright (C) 2007,2011 GeoSolutions S.A.S.
* http://www.geo-solutions.it
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package it.geosolutions.geoserver.rest.encoder.utils;
import java.util.Iterator;
import java.util.List;
import org.jdom.Element;
import org.jdom.filter.Filter;
/**
* Encodes lists of entries with key attribute.
* e.g.:
*
*
* {@code
*
* val1
* val2
* val3
* }
*
*
* This can be also add compounded Elements
* e.g.:
*
*
* {@code
*
*
*
* false
*
*
*
*
* true
* ele
* LIST
*
*
* }
*
*
* This can be also add list of compounded Elements
*
*
* {@code
*
*
* AllowMultithreading
* false
*
*
*
* true
* ele
* LIST
*
*
*
* }
*
*
* @author ETj (etj at geo-solutions.it)
* @author Carlo Cancellieri - [email protected]
* @version $Id: $
*/
public class NestedElementEncoder extends XmlElement {
/** Constant ENTRY="entry"
*/
public final static String ENTRY = "entry";
/** Constant KEY="key"
*/
public final static String KEY = "key";
static class NestedElementFilter implements Filter {
private static final long serialVersionUID = 1L;
private final String key;
private final String value;
private final Element root;
/**
* if key is null we only check for children name if value is null we
* only check for key attribute
*
* @param root
* @param key
* @param value
*/
public NestedElementFilter(Element root, String key, String value) {
this.key = key;
this.root = root;
this.value = value;
}
public boolean matches(Object obj) {
if (obj instanceof Element) {
final Element el = ((Element) obj);
if (root.isAncestor(el)) {
if (el.getName().equals(ENTRY)/* && el.getText().equals(value) */) {
boolean keyCheck=true;
if (key != null) {
if (el.getAttribute(KEY).getValue().equals(key)) {
keyCheck=true;
} else {
keyCheck=false;
}
}
if (value != null)
return keyCheck&&checkChilds(el, value);
else
return keyCheck;
}
}
}
return false;
}
private static boolean checkChilds(Element el, String value) {
final List childList = el.getChildren();
final Iterator childIt = childList.iterator();
while (childIt.hasNext()) {
final Element child = childIt.next();
if (child.getName().equals(value)) {
return true;
}
}
return false;
}
};
/**
* Constructor for NestedElementEncoder.
*
* @param listName a {@link java.lang.String} object.
*/
public NestedElementEncoder(String listName) {
super(listName);
}
/**
* set
*
* @param key a {@link java.lang.String} object.
* @param value a {@link java.lang.String} object.
*/
public void set(final String key, final String value) {
// if some previous similar object is found
final Element search;
if ((search = ElementUtils.contains(getRoot(), new NestedElementFilter(
getRoot(), key, null))) != null) {
// remove it
ElementUtils.remove(getRoot(), search);
}
// add the new entry
add(key, value);
}
/**
* set
*
* @param key a {@link java.lang.String} object.
* @param value a {@link org.jdom.Element} object.
*/
public void set(final String key, final Element value) {
// if some previous similar object is found
final Element search;
if ((search = ElementUtils.contains(getRoot(), new NestedElementFilter(
getRoot(), key, value.getName()))) != null) {
// remove it
ElementUtils.remove(getRoot(), search);
}
// add the new entry
add(key, value);
}
/**
* add
*
* @param key a {@link java.lang.String} object.
* @param value a {@link org.jdom.Element} object.
*/
public void add(final String key, final Element value) {
final Element entryElem = new Element(ENTRY);
if (key != null)
entryElem.setAttribute(KEY, key);
entryElem.addContent(value);
this.addContent(entryElem);
}
/**
* add
*
* @param key a {@link java.lang.String} object.
* @param value a {@link java.lang.String} object.
*/
public void add(final String key, final String value) {
final Element entryElem = new Element(ENTRY);
if (key != null)
entryElem.setAttribute(KEY, key);
entryElem.setText(value);
this.addContent(entryElem);
}
/**
* add
*
* @param key a {@link java.lang.String} object.
* @param list a {@link java.util.List} object.
*/
public void add(final String key, final List list) {
final Element entryElem = new Element(ENTRY);
if (key != null)
entryElem.setAttribute(KEY, key);
// final Iterator it=list.iterator();
// while (it.hasNext()){
// final Element child=it.next();
entryElem.addContent(list);
// }
this.addContent(entryElem);
}
/**
* set
*
* @param key a {@link java.lang.String} object.
* @param value a {@link java.util.List} object.
*/
public void set(final String key, final List value) {
// if some previous similar object is found
final Element search;
if ((search = ElementUtils.contains(getRoot(), new NestedElementFilter(
getRoot(), key, value.get(0).getValue()))) != null) {
// remove it
ElementUtils.remove(search, search);
}
// add the new entry
add(key, value);
}
/** {@inheritDoc} */
public boolean remove(final String key) {
// if some previous similar object is found
final Element search;
if ((search = ElementUtils.contains(getRoot(), new NestedElementFilter(
getRoot(), key, null))) != null) {
return ElementUtils.remove(search, search);
} else
return false;
}
}