/* * Copyright (c) 2015. Escalon System-Entwicklung, Dietrich Schulten * * 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 de.escalon.hypermedia.spring.uber; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; import de.escalon.hypermedia.affordance.ActionDescriptor; import de.escalon.hypermedia.affordance.PartialUriTemplate; import de.escalon.hypermedia.affordance.PartialUriTemplateComponents; import org.springframework.hateoas.Link; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; public abstract class AbstractUberNode implements Iterable<UberNode> { protected List<UberNode> data = new ArrayList<UberNode>(); public AbstractUberNode() { super(); } @JsonInclude(Include.NON_EMPTY) public List<UberNode> getData() { return data; } public void addData(UberNode item) { data.add(item); } public void addLink(Link link) { List<ActionDescriptor> actionDescriptors = UberUtils.getActionDescriptors(link); List<String> rels = UberUtils.getRels(link); PartialUriTemplateComponents partialUriTemplateComponents = new PartialUriTemplate(link.getHref()).expand (Collections.<String, Object>emptyMap()); for (ActionDescriptor actionDescriptor : actionDescriptors) { UberNode uberLink = UberUtils.toUberLink(link.getHref(), actionDescriptor, rels); data.add(uberLink); } } public void addLinks(Iterable<Link> links) { for (Link link : links) { addLink(link); } } /** * Gets first child of this uber node having the given name attribute. * * @param name * to look up * @return found child or null */ public UberNode getFirstByName(String name) { // TODO consider less naive impl UberNode ret = null; for (UberNode node : data) { if (name.equals(node.getName())) { ret = node; break; } } return ret; } /** * Gets first child of this uber node having the given rel attribute. * * @param rel * to look up * @return found child or null */ public UberNode getFirstByRel(String rel) { // TODO consider less naive impl for (UberNode node : data) { List<String> myRels = node.getRel(); if (myRels != null) { for (String myRel : myRels) { if (rel.equals(myRel)) { return node; } } } } return null; } /** * Allows iterating over children of this uber node which have a data attribute. */ @Override public Iterator<UberNode> iterator() { return new Iterator<UberNode>() { int index = 0; @Override public void remove() { throw new UnsupportedOperationException("removing from uber node is not supported"); } @Override public UberNode next() { index = findNextChildWithData(); return data.get(index++); } @Override public boolean hasNext() { return findNextChildWithData() != -1; } private int findNextChildWithData() { for (int i = index; i < data.size(); i++) { if (!data.get(i) .getData() .isEmpty()) { return i; } } return -1; } }; } }