use of org.craftercms.studio.api.v2.exception.RepositoryLockedException in project studio by craftercms.
the class FormDmContentProcessor method writeContent.
protected void writeContent(PipelineContent content, ResultTO result) throws ServiceLayerException {
String user = content.getProperty(DmConstants.KEY_USER);
String site = content.getProperty(DmConstants.KEY_SITE);
String path = content.getProperty(DmConstants.KEY_PATH);
String fileName = content.getProperty(DmConstants.KEY_FILE_NAME);
String contentType = content.getProperty(DmConstants.KEY_CONTENT_TYPE);
InputStream input = content.getContentStream();
boolean isPreview = ContentFormatUtils.getBooleanValue(content.getProperty(DmConstants.KEY_IS_PREVIEW));
boolean createFolders = ContentFormatUtils.getBooleanValue(content.getProperty(DmConstants.KEY_CREATE_FOLDERS));
String unlockValue = content.getProperty(DmConstants.KEY_UNLOCK);
boolean unlock = (!StringUtils.isEmpty(unlockValue) && unlockValue.equalsIgnoreCase("false")) ? false : true;
String parentContentPath = path;
if (parentContentPath.endsWith(FILE_SEPARATOR + fileName)) {
parentContentPath = parentContentPath.replace(FILE_SEPARATOR + fileName, "");
} else {
path = path + FILE_SEPARATOR + fileName;
}
try {
// look up the path content first
ContentItemTO parentItem = contentService.getContentItem(site, parentContentPath, 0);
boolean parentContentExists = contentService.contentExists(site, parentContentPath);
if (!parentContentExists && createFolders) {
parentItem = createMissingFoldersInPath(site, path, isPreview);
}
if (parentItem != null) {
// look up the path content first
if (parentItem.getName().equals(fileName)) {
ContentItemTO item = contentService.getContentItem(site, path, 0);
InputStream existingContent = contentService.getContent(site, path);
updateFile(site, item, path, input, user, isPreview, unlock, result);
content.addProperty(DmConstants.KEY_ACTIVITY_TYPE, OPERATION_UPDATE);
if (unlock) {
// TODO: We need ability to lock/unlock content in repo
contentService.unLockContent(site, path);
logger.debug("Unlocked the content " + parentContentPath);
}
return;
} else {
// otherwise, create new one
if (path.endsWith(DmConstants.XML_PATTERN) && !path.endsWith(DmConstants.INDEX_FILE)) {
parentContentPath = path.substring(0, path.lastIndexOf(FILE_SEPARATOR));
parentItem = contentService.getContentItem(site, parentContentPath, 0);
}
boolean fileExists = contentService.contentExists(site, path);
if (fileExists) {
ContentItemTO contentItem = contentService.getContentItem(site, path, 0);
InputStream existingContent = contentService.getContent(site, path);
updateFile(site, contentItem, path, input, user, isPreview, unlock, result);
content.addProperty(DmConstants.KEY_ACTIVITY_TYPE, OPERATION_UPDATE);
if (unlock) {
// TODO: We need ability to lock/unlock content in repo
contentService.unLockContent(site, path);
logger.debug("Unlocked the content site: " + site + " path: " + path);
}
return;
} else {
ContentItemTO newFileItem = createNewFile(site, parentItem, fileName, contentType, input, user, unlock, result);
content.addProperty(DmConstants.KEY_ACTIVITY_TYPE, OPERATION_CREATE);
return;
}
}
} else {
throw new ContentNotFoundException(path + " does not exist in site: " + site);
}
} catch (ContentNotFoundException | RepositoryLockedException e) {
throw e;
} catch (Exception e) {
logger.error("Error: ", e);
throw new ContentNotFoundException("Unexpected exception ", e);
} finally {
ContentUtils.release(input);
}
}
use of org.craftercms.studio.api.v2.exception.RepositoryLockedException in project studio by craftercms.
the class BlobAwareContentRepository method writeContent.
@Override
public String writeContent(String site, String path, InputStream content) throws ServiceLayerException {
logger.debug("Writing {0} in site {1}", path, site);
try {
StudioBlobStore store = getBlobStore(site, path);
if (store != null) {
store.writeContent(site, normalize(path), content);
Blob reference = store.getReference(normalize(path));
return localRepositoryV1.writeContent(site, getPointerPath(site, path), new ByteArrayInputStream(objectMapper.writeValueAsBytes(reference)));
}
return localRepositoryV1.writeContent(site, path, content);
} catch (RepositoryLockedException e) {
throw e;
} catch (Exception e) {
logger.error("Error writing content {0} in site {1}", e, path, site);
throw new ServiceLayerException(e);
}
}
use of org.craftercms.studio.api.v2.exception.RepositoryLockedException in project studio by craftercms.
the class GitRepositoryHelper method writeFile.
public boolean writeFile(Repository repo, String site, String path, InputStream content) {
boolean result = true;
try {
// Create basic file
File file = new File(repo.getDirectory().getParent(), path);
// Create parent folders
File folder = file.getParentFile();
if (folder != null) {
if (!folder.exists()) {
folder.mkdirs();
}
}
// Create the file if it doesn't exist already
if (!file.exists()) {
try {
if (!file.createNewFile()) {
logger.error("error creating file: site: " + site + " path: " + path);
result = false;
}
} catch (IOException e) {
logger.error("error creating file: site: " + site + " path: " + path, e);
result = false;
}
}
if (result) {
// Write the bits
try (FileChannel outChannel = new FileOutputStream(file.getPath()).getChannel()) {
logger.debug("created the file output channel");
ReadableByteChannel inChannel = Channels.newChannel(content);
logger.debug("created the file input channel");
// 1MB at a time
long amount = 1024 * 1024;
long count;
long offset = 0;
while ((count = outChannel.transferFrom(inChannel, offset, amount)) > 0) {
logger.debug("writing the bits: offset = " + offset + " count: " + count);
offset += count;
}
}
// Add the file to git
try (Git git = new Git(repo)) {
AddCommand addCommand = git.add().addFilepattern(getGitPath(path));
retryingRepositoryOperationFacade.call(addCommand);
git.close();
result = true;
} catch (JGitInternalException internalException) {
if (internalException.getCause() instanceof LockFailedException) {
throw new RepositoryLockedException("Writing file " + path + " for site " + site + " failed because " + "repository was locked.");
}
} catch (GitAPIException e) {
logger.error("error adding file to git: site: " + site + " path: " + path, e);
result = false;
}
}
} catch (IOException e) {
logger.error("error writing file: site: " + site + " path: " + path, e);
result = false;
}
return result;
}
Aggregations