All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.jackrabbit.webdav.version.LabelInfo Maven / Gradle / Ivy

There is a newer version: 2.23.1-beta
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.apache.jackrabbit.webdav.version;

import org.apache.jackrabbit.webdav.DavConstants;
import org.apache.jackrabbit.webdav.DavException;
import org.apache.jackrabbit.webdav.DavServletResponse;
import org.apache.jackrabbit.webdav.xml.DomUtil;
import org.apache.jackrabbit.webdav.xml.XmlSerializable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 * LabelInfo encapsulates the request body of a LABEL request
 * used to add, set or remove a label from the requested version resource or
 * from that version specified with the Label header in case the requested resource
 * is a version-controlled resource.

* The request body (thus the 'labelElement' passed to the constructor must be * a DAV:label element: *
 * <!ELEMENT label ANY>
 * ANY value: A sequence of elements with at most one DAV:add,
 * DAV:set, or DAV:remove element.
 * <!ELEMENT add (label-name)>
 * <!ELEMENT set (label-name)>
 * <!ELEMENT remove (label-name)>
 * <!ELEMENT label-name (#PCDATA)>
 * PCDATA value: string
 * 
* Please note, that the given implementation only recognizes the predefined elements 'add', * 'set' and 'remove'. */ public class LabelInfo implements DeltaVConstants, XmlSerializable { private static Logger log = LoggerFactory.getLogger(LabelInfo.class); public static final int TYPE_SET = 0; public static final int TYPE_REMOVE = 1; public static final int TYPE_ADD = 2; public static String[] typeNames = new String[] { XML_LABEL_SET , XML_LABEL_REMOVE, XML_LABEL_ADD}; private final int depth; private final int type; private final String labelName; public LabelInfo(String labelName, String type) { if (labelName == null) { throw new IllegalArgumentException("Label name must not be null."); } boolean validType = false; int i = 0; while (i < typeNames.length) { if (typeNames[i].equals(type)) { validType = true; break; } i++; } if (!validType) { throw new IllegalArgumentException("Invalid type: " + type); } this.type = i; this.labelName = labelName; this.depth = DavConstants.DEPTH_0; } public LabelInfo(String labelName, int type) { this(labelName, type, DavConstants.DEPTH_0); } public LabelInfo(String labelName, int type, int depth) { if (labelName == null) { throw new IllegalArgumentException("Label name must not be null."); } if (type < TYPE_SET || type > TYPE_ADD) { throw new IllegalArgumentException("Invalid type: " + type); } this.labelName = labelName; this.type = type; this.depth = depth; } /** * Create a new LabelInfo from the given element and depth * integer. If the specified Xml element does have a {@link DeltaVConstants#XML_LABEL} * root element or no label name is specified with the action to perform * the creation will fail. * * @param labelElement * @param depth * @throws DavException if the specified element does not * start with a {@link DeltaVConstants#XML_LABEL} element or if the DAV:label * element contains illegal instructions e.g. contains multiple DAV:add, DAV:set * or DAV:remove elements. */ public LabelInfo(Element labelElement, int depth) throws DavException { if (!DomUtil.matches(labelElement, DeltaVConstants.XML_LABEL, DeltaVConstants.NAMESPACE)) { log.warn("DAV:label element expected"); throw new DavException(DavServletResponse.SC_BAD_REQUEST); } String label = null; int type = -1; for (int i = 0; i < typeNames.length && type == -1; i++) { if (DomUtil.hasChildElement(labelElement, typeNames[i], NAMESPACE)) { type = i; Element el = DomUtil.getChildElement(labelElement, typeNames[i], NAMESPACE); label = DomUtil.getChildText(el, XML_LABEL_NAME, NAMESPACE); } } if (label == null) { log.warn("DAV:label element must contain at least one set, add or remove element defining a label-name."); throw new DavException(DavServletResponse.SC_BAD_REQUEST); } this.labelName = label; this.type = type; this.depth = depth; } /** * Create a new LabelInfo from the given element. As depth * the default value 0 is assumed. * * @param labelElement * @throws DavException * @see #LabelInfo(org.w3c.dom.Element, int) */ public LabelInfo(Element labelElement) throws DavException { this(labelElement, 0); } /** * Return the text present inside the 'DAV:label-name' element or null * * @return 'label-name' or null */ public String getLabelName() { return labelName; } /** * Return the type of the LABEL request. This might either be {@link #TYPE_SET}, * {@link #TYPE_ADD} or {@link #TYPE_REMOVE}. * * @return type */ public int getType() { return type; } /** * Return the depth * * @return depth */ public int getDepth() { return depth; } /** * @see org.apache.jackrabbit.webdav.xml.XmlSerializable#toXml(Document) * @param document */ public Element toXml(Document document) { Element label = DomUtil.createElement(document, XML_LABEL, NAMESPACE); Element typeElem = DomUtil.addChildElement(label, typeNames[type], NAMESPACE); DomUtil.addChildElement(typeElem, XML_LABEL_NAME, NAMESPACE, labelName); return label; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy