private function addResource($path, PuliResource $resource, $checkParentsForSymlinks = true)
{
$pathInBaseDir = $this->baseDir . $path;
$hasChildren = $resource->hasChildren();
$hasBody = $resource instanceof BodyResource;
if ($hasChildren && $hasBody) {
throw new UnsupportedResourceException(sprintf('Instances of BodyResource do not support child resources in ' . 'FilesystemRepository. Tried to add a BodyResource with ' . 'children at %s.', $path));
}
$resource = clone $resource;
$resource->attachTo($this, $path);
if ($this->symlink && $checkParentsForSymlinks) {
$this->replaceParentSymlinksByCopies($path);
}
if ($resource instanceof FilesystemResource) {
if ($this->symlink) {
$this->symlinkMirror($resource->getFilesystemPath(), $pathInBaseDir);
} elseif ($hasBody) {
$this->filesystem->copy($resource->getFilesystemPath(), $pathInBaseDir);
} else {
$this->filesystem->mirror($resource->getFilesystemPath(), $pathInBaseDir);
}
$this->storeVersion($resource);
return;
}
if ($resource instanceof LinkResource) {
if (!$this->symlink) {
throw new UnsupportedResourceException(sprintf('LinkResource requires support of symbolic links in FilesystemRepository. ' . 'Tried to add a LinkResource at %s.', $path));
}
$this->filesystem->symlink($this->baseDir . $resource->getTargetPath(), $pathInBaseDir);
$this->storeVersion($resource);
return;
}
if ($hasBody) {
file_put_contents($pathInBaseDir, $resource->getBody());
$this->storeVersion($resource);
return;
}
if (is_file($pathInBaseDir)) {
$this->filesystem->remove($pathInBaseDir);
}
if (!file_exists($pathInBaseDir)) {
mkdir($pathInBaseDir, 0777, true);
}
foreach ($resource->listChildren() as $child) {
$this->addResource($path . '/' . $child->getName(), $child, false);
}
$this->storeVersion($resource);
}