blob: b162c3a8a66df65bb1a481f8acd0505dca57bbed [file]
<?php
/*
* 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.
*/
namespace MarmottaClient\Clients;
require_once 'vendor/.composer/autoload.php';
require_once 'util/rdfjson.php';
require_once 'model/content/Content.php';
require_once 'exceptions/MarmottaClientException.php';
require_once 'exceptions/NotFoundException.php';
require_once 'exceptions/ContentFormatException.php';
use \MarmottaClient\Model\Content\Content;
use \MarmottaClient\ClientConfiguration;
use \MarmottaClient\Exceptions\MarmottaClientException;
use \MarmottaClient\Exceptions\NotFoundException;
use \MarmottaClient\Exceptions\ContentFormatException;
use Guzzle\Http\Client;
use Guzzle\Http\Message\BadResponseException;
/**
* Created by IntelliJ IDEA.
* User: sschaffe
* Date: 23.01.12
* Time: 23:13
* To change this template use File | Settings | File Templates.
*/
class ResourceClient
{
protected $config;
private static $URL_RESOURCE_SERVICE = "/resource?uri=";
function __construct(ClientConfiguration $config)
{
$this->config = $config;
}
/**
* Create a resource in the remote Marmotta installation
* @param $uri
* @throws Exception
*/
public /* boolean */ function createResource($uri) {
$client = new Client();
$request = $client->post($this->getServiceUrl($uri),array(
"User-Agent" => "Marmotta Client Library (PHP)",
"Content-Length" => "0",
"Content-Type" => "application/json"
));
// set authentication if given in configuration
if(!_isset($this->config->getUsername())) {
$request->setAuth($this->config->getUsername(),$this->config->getPassword());
}
//$request->getCurlOptions()->set(CURLOPT_PROXY, "localhost:8888");
$request->send();
}
public /* boolean */ function existsResource($uri) {
$client = new Client();
$request = $client->options($this->getServiceUrl($uri),array(
"User-Agent" => "Marmotta Client Library (PHP)"
));
// set authentication if given in configuration
if(!_isset($this->config->getUsername())) {
$request->setAuth($this->config->getUsername(),$this->config->getPassword());
}
$response = $request->send();
if($response->hasHeader("Access-Control-Allow-Methods")) {
if($response->getHeader("Access-Control-Allow-Methods") == "POST") {
return False;
} else if(strpos($response->getHeader("Access-Control-Allow-Methods"),"GET")) {
return True;
} else {
return False;
}
} else {
return False;
}
}
/**
* Return the metadata of the resource identified by the URI passed as argument. In PHP, the returned
* object is an array mapping from property URIs to arrays of RDFNodes, representing the values of this
* property.
* <p/>
* Example:
*
* array(
* "http://xmlns.com/foaf/0.1/name" => array(new Literal("Sepp Huber"))
* )
*
* @param $uri
* @return array
*/
public /* Metadata */ function getResourceMetadata($uri) {
try {
$client = new Client();
$request = $client->get($this->getServiceUrl($uri),array(
"User-Agent" => "Marmotta Client Library (PHP)",
"Accept" => "application/json; rel=meta"
));
// set authentication if given in configuration
if(!_isset($this->config->getUsername())) {
$request->setAuth($this->config->getUsername(),$this->config->getPassword());
}
$response = $request->send();
return decode_metadata($uri,$response->getBody(true));
} catch(BadResponseException $ex) {
if($ex->getResponse()->getStatusCode() == 404) {
throw new NotFoundException("could not retrieve resource metadata for resource $uri; it does not exist");
} else if($ex->getResponse()->getStatusCode() == 406) {
throw new ContentFormatException("server does not offer metadata type application/json for resource $uri");
} else {
throw new MarmottaClientException("could not retrieve resource metadata for resource $uri; ".$ex->getResponse()->getReasonPhrase());
}
}
}
/**
* Update the metadata of the resource identified by the URI passed as argument. The resource must exist before
* this method can be called (e.g. using createResource()).
*
* The metadata must be an array corresponding to the MarmottaClient metadata format.
*
* <p/>
* Example:
*
* array(
* "http://xmlns.com/foaf/0.1/name" => array(new Literal("Sepp Huber"))
* )
*
* @param $uri
* @param $metadata
*/
public /* void */ function updateResourceMetadata($uri, /* Metadata */ $metadata) {
$metadata_json = encode_metadata($uri, $metadata);
$client = new Client();
$request = $client->put($this->getServiceUrl($uri),array(
"User-Agent" => "Marmotta Client Library (PHP)",
"Content-Type" => "application/json; rel=meta"
), $metadata_json);
// set authentication if given in configuration
if(!_isset($this->config->getUsername())) {
$request->setAuth($this->config->getUsername(),$this->config->getPassword());
}
$response = $request->send();
if($response->getStatusCode() >= 400) {
throw new Exception("could not update resource $uri; ".$response->getReasonPhrase());
}
}
/**
* Retrieve the (human-readable) content of the given mimeType of the given resource. Will return a content
* object that allows reading the input stream. In case no content of the given mime type exists for the resource,
* will throw a Exception.
*
* @param $uri
* @param $mimeType
* @return Model\Content\Content
* @throws Exception
*/
public /* Content */ function getResourceContent($uri, $mimeType) {
try {
$client = new Client();
$request = $client->get($this->getServiceUrl($uri),array(
"User-Agent" => "Marmotta Client Library (PHP)",
"Accept" => $mimeType . "; rel=content"
));
// set authentication if given in configuration
if(!_isset($this->config->getUsername())) {
$request->setAuth($this->config->getUsername(),$this->config->getPassword());
}
$response = $request->send();
if($response->getStatusCode() >= 400) {
throw new Exception("could not retrieve resource metadata for resource $uri; ".$response->getReasonPhrase());
}
return new \MarmottaClient\Model\Content\Content($response->getBody(true),$response->getBody()->getSize(),$response->getHeader("Content-Type"));
} catch(BadResponseException $ex) {
if($ex->getResponse()->getStatusCode() == 404) {
throw new NotFoundException("could not retrieve resource content for resource $uri; it does not exist");
} else if($ex->getResponse()->getStatusCode() == 406) {
throw new ContentFormatException("server does not offer content type $mimeType for resource $uri");
} else {
throw new MarmottaClientException("could not retrieve resource content for resource $uri; ".$ex->getResponse()->getReasonPhrase());
}
}
}
/**
* Update the content of the resource identified by the URI given as argument. The resource has to exist before
* content can be uploaded to it. Any existing content will be overridden. Throws Exception if the content type is
* not supported or if the resource does not exist.
*
* @param $uri
* @param Model\Content\Content $content
* @throws Exception
*/
public /* void */ function updateResourceContent($uri, Content $content) {
$client = new Client();
$request = $client->put($this->getServiceUrl($uri),array(
"User-Agent" => "Marmotta Client Library (PHP)",
"Content-Type" => $content->getMimetype() . "; rel=content"
), $content->getData());
// set authentication if given in configuration
if(!_isset($this->config->getUsername())) {
$request->setAuth($this->config->getUsername(),$this->config->getPassword());
}
$response = $request->send();
if($response->getStatusCode() >= 400) {
throw new Exception("could not update resource $uri; ".$response->getReasonPhrase());
}
}
public /* void */ function deleteResource($uri) {
$client = new Client();
$request = $client->delete($this->getServiceUrl($uri),array(
"User-Agent" => "Marmotta Client Library (PHP)",
));
// set authentication if given in configuration
if(!_isset($this->config->getUsername())) {
$request->setAuth($this->config->getUsername(),$this->config->getPassword());
}
$response = $request->send();
if($response->getStatusCode() >= 400) {
throw new Exception("could not delete resource $uri; ".$response->getReasonPhrase());
}
}
public function getServiceUrl($uri) {
return $this->config->getBaseUrl() . ResourceClient::$URL_RESOURCE_SERVICE . encodeURIComponent($uri);
}
}