/******************************************************************************* * 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.wink.webdav.model; import java.io.Reader; import java.io.Writer; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Set; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.wink.common.RestException; import org.apache.wink.common.internal.i18n.Messages; import org.apache.wink.webdav.WebDAVConstants; import org.w3c.dom.Document; import org.w3c.dom.Element; public class WebDAVModelHelper { private static final JAXBContext context; private static final DocumentBuilderFactory documentBuilderFactory; private static final Document document; private static final String XML_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"; //$NON-NLS-1$ static { try { context = JAXBContext.newInstance(Propertyupdate.class.getPackage().getName()); documentBuilderFactory = DocumentBuilderFactory.newInstance(); document = documentBuilderFactory.newDocumentBuilder().newDocument(); } catch (Exception e) { throw new RestException(Messages.getMessage("webDAVFailSetupPropertyHelper"), e); //$NON-NLS-1$ } } public static Marshaller createMarshaller() { try { Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); return marshaller; } catch (JAXBException e) { throw new RestException(Messages.getMessage("webDAVFailCreateMarshaller"), e); //$NON-NLS-1$ } } public static Unmarshaller createUnmarshaller() { try { Unmarshaller unmarshaller = context.createUnmarshaller(); return unmarshaller; } catch (JAXBException e) { throw new RestException(Messages.getMessage("webDAVFailCreateUnmarshaller"), e); //$NON-NLS-1$ } } public static void marshal(Marshaller m, Object element, Writer writer, String elementName) { try { m.marshal(element, writer); } catch (JAXBException e) { throw new RestException(Messages .getMessage("webDAVUnableToMarshalElement", elementName), e); //$NON-NLS-1$ } } @SuppressWarnings("unchecked") public static <T> T unmarshal(Unmarshaller u, Reader reader, Class<T> elementClass, String elementName) { try { Object object = u.unmarshal(reader); if (object instanceof JAXBElement) { object = ((JAXBElement<?>)object).getValue(); } if (!(elementClass.equals(object.getClass()))) { throw new RestException(Messages .getMessage("webDAVIncompatibleTypeInRequest", elementName, object.getClass() //$NON-NLS-1$ .getName(), elementClass.getName())); } return (T)object; } catch (JAXBException e) { throw new RestException(Messages.getMessage("webDAVUnableToParseElement", elementName), //$NON-NLS-1$ e); } } public static Set<QName> extractPropertyNames(Prop prop, Set<QName> set) { if (prop != null) { if (prop.getCreationdate() != null) { set.add(WebDAVConstants.PROPERTY_CREATIONDATE); } if (prop.getDisplayname() != null) { set.add(WebDAVConstants.PROPERTY_DISPLAYNAME); } if (prop.getGetcontentlanguage() != null) { set.add(WebDAVConstants.PROPERTY_GETCONTENTLANGUAGE); } if (prop.getGetcontentlength() != null) { set.add(WebDAVConstants.PROPERTY_GETCONTENTLENGTH); } if (prop.getGetcontenttype() != null) { set.add(WebDAVConstants.PROPERTY_GETCONTENTTYPE); } if (prop.getGetetag() != null) { set.add(WebDAVConstants.PROPERTY_GETETAG); } if (prop.getGetlastmodified() != null) { set.add(WebDAVConstants.PROPERTY_GETLASTMODIFIED); } if (prop.getLockdiscovery() != null) { set.add(WebDAVConstants.PROPERTY_LOCKDISCOVERY); } if (prop.getResourcetype() != null) { set.add(WebDAVConstants.PROPERTY_RESOURCETYPE); } if (prop.getSupportedlock() != null) { set.add(WebDAVConstants.PROPERTY_SUPPORTEDLOCK); } for (Element element : prop.getAny()) { set.add(new QName(element.getNamespaceURI(), element.getLocalName())); } } return set; } public static Element createElement(QName qname) { return createElement(qname, (String)null); } public static Element createElement(QName qname, String content) { String name = getFullName(qname); return createElement(qname.getNamespaceURI(), name, content); } public static Element createElement(QName qname, Element content) { String name = getFullName(qname); return createElement(qname.getNamespaceURI(), name, content); } public static String getFullName(QName qname) { String name = qname.getLocalPart(); String prefix = qname.getPrefix(); if (prefix != null && prefix.length() > 0) { name = qname.getPrefix() + ":" + name; //$NON-NLS-1$ } return name; } public static Element createElement(String namespaceURI, String name) { return createElement(namespaceURI, name, (String)null); } public static Element createElement(String namespaceURI, String name, String content) { Element element = document.createElementNS(namespaceURI, name); if (content != null) { element.setTextContent(content); } return element; } public static Element createElement(String namespaceURI, String qualifiedName, Element child) { Element element = document.createElementNS(namespaceURI, qualifiedName); if (child != null) { element.appendChild(child); } return element; } /* package */static JAXBElement<Prop> createProp(Prop prop, QName name) { return new JAXBElement<Prop>(name, Prop.class, prop); } public static String convertDateToXMLDate(Date date) { SimpleDateFormat dateFormat = new SimpleDateFormat(XML_DATE_FORMAT); dateFormat.setLenient(false); return dateFormat.format(date); } public static Date convertXMLDateToDate(String date) throws ParseException { SimpleDateFormat dateFormat = new SimpleDateFormat(XML_DATE_FORMAT); dateFormat.setLenient(false); return dateFormat.parse(date); } }