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

org.opencastproject.mediapackage.DefaultMediaPackageSerializerImpl Maven / Gradle / Ivy

There is a newer version: 16.6
Show newest version
/*
 * Licensed to The Apereo Foundation under one or more contributor license
 * agreements. See the NOTICE file distributed with this work for additional
 * information regarding copyright ownership.
 *
 *
 * The Apereo Foundation licenses this file to you under the Educational
 * Community 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://opensource.org/licenses/ecl2.txt
 *
 * 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.opencastproject.mediapackage;

import org.opencastproject.util.UrlSupport;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;

/**
 * Default implementation of a {@link MediaPackageSerializer} that is able to deal with relative urls in manifest.
 */
public class DefaultMediaPackageSerializerImpl implements MediaPackageSerializer {

  /** Optional package root file */
  protected URL packageRoot = null;

  /** It's very likely that this should be the first serializer when encoding an URI, therefore choose a high ranking */
  public static final int RANKING = 1000;

  /**
   * Creates a new package serializer that will work completely transparent, therefore resolving urls by simply
   * returning them as is.
   */
  public DefaultMediaPackageSerializerImpl() {
  }

  /**
   * Creates a new package serializer that enables the resolution of relative urls from the manifest by taking
   * packageRoot as the root url.
   *
   * @param packageRoot
   *          the root url
   */
  public DefaultMediaPackageSerializerImpl(URL packageRoot) {
    this.packageRoot = packageRoot;
  }

  /**
   * Creates a new package serializer that enables the resolution of relative urls from the manifest by taking
   * packageRoot as the root directory.
   *
   * @param packageRoot
   *          the root url
   * @throws MalformedURLException
   *           if the file cannot be converted to a url
   */
  public DefaultMediaPackageSerializerImpl(File packageRoot) throws MalformedURLException {
    if (packageRoot != null)
      this.packageRoot = packageRoot.toURI().toURL();
  }

  /**
   * Returns the package root that is used determine and resolve relative paths. Note that the package root may be
   * null.
   *
   * @return the packageRoot
   */
  public URL getPackageRoot() {
    return packageRoot;
  }

  /**
   * Sets the package root.
   *
   * @param packageRoot
   *          the packageRoot to set
   * @see #getPackageRoot()
   */
  public void setPackageRoot(URL packageRoot) {
    this.packageRoot = packageRoot;
  }

  /**
   * This serializer implementation tries to cope with relative urls. Should the root url be set to any value other than
   * null, the serializer will try to convert element urls to relative paths if possible. .
   *
   * @throws URISyntaxException
   *           if the resulting URI contains syntax errors
   * @see org.opencastproject.mediapackage.MediaPackageSerializer#encodeURI(URI)
   */
  @Override
  public URI encodeURI(URI uri) throws URISyntaxException {
    if (uri == null)
      throw new IllegalArgumentException("Argument url is null");

    String path = uri.toString();

    // Has a package root been set? If not, no relative paths!
    if (packageRoot == null)
      return uri;

    // A package root has been set
    String rootPath = packageRoot.toExternalForm();
    if (path.startsWith(rootPath)) {
      path = path.substring(rootPath.length());
    }

    return new URI(path);
  }

  /**
   * This serializer implementation tries to cope with relative urls. Should the path start with neither a protocol nor
   * a path separator, the packageRoot is used to create the url relative to the root url that was passed in the
   * constructor.
   * 

* Note that for absolute paths without a protocol, the file:// protocol is assumed. * * @see #DefaultMediaPackageSerializerImpl(URL) * @see org.opencastproject.mediapackage.MediaPackageSerializer#decodeURI(URI) */ @Override public URI decodeURI(URI uri) throws URISyntaxException { if (uri == null) throw new IllegalArgumentException("Argument uri is null"); // If the path starts with neither a protocol nor a path separator, the packageRoot is used to // create the url relative to the root String path = uri.toString(); boolean isRelative = false; try { uri = new URI(path); isRelative = !uri.getPath().startsWith("/"); if (!isRelative) return uri; } catch (URISyntaxException e) { // this may happen, we're still fine isRelative = !path.startsWith("/"); if (!isRelative) { path = "file:" + path; uri = new URI(path); return uri; } } // This is a relative path if (isRelative && packageRoot != null) { uri = new URI(UrlSupport.concat(packageRoot.toExternalForm(), path)); return uri; } return uri; } @Override public int getRanking() { return RANKING; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy