/* * Copyright (c) 2006, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * Licensed 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.wso2.carbon.registry.resource.services; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.wso2.carbon.registry.admin.api.resource.IResourceService; import org.wso2.carbon.registry.api.RegistryException; import org.wso2.carbon.registry.common.ResourceData; import org.wso2.carbon.registry.common.services.RegistryAbstractAdmin; import org.wso2.carbon.registry.common.utils.RegistryUtil; import org.wso2.carbon.registry.core.Registry; import org.wso2.carbon.registry.core.session.UserRegistry; import org.wso2.carbon.registry.core.utils.MediaTypesUtils; import org.wso2.carbon.registry.core.utils.RegistryUtils; import org.wso2.carbon.registry.resource.beans.CollectionContentBean; import org.wso2.carbon.registry.resource.beans.ContentBean; import org.wso2.carbon.registry.resource.beans.ContentDownloadBean; import org.wso2.carbon.registry.resource.beans.MetadataBean; import org.wso2.carbon.registry.resource.beans.PermissionBean; import org.wso2.carbon.registry.resource.beans.ResourceTreeEntryBean; import org.wso2.carbon.registry.resource.beans.VersionsBean; import org.wso2.carbon.registry.resource.internal.ResourceDataHolder; import org.wso2.carbon.registry.resource.services.utils.AddCollectionUtil; import org.wso2.carbon.registry.resource.services.utils.AddRemoteLinkUtil; import org.wso2.carbon.registry.resource.services.utils.AddResourceUtil; import org.wso2.carbon.registry.resource.services.utils.AddRolePermissionUtil; import org.wso2.carbon.registry.resource.services.utils.AddSymbolicLinkUtil; import org.wso2.carbon.registry.resource.services.utils.AddTextResourceUtil; import org.wso2.carbon.registry.resource.services.utils.ChangeRolePermissionsUtil; import org.wso2.carbon.registry.resource.services.utils.CommonUtil; import org.wso2.carbon.registry.resource.services.utils.ContentUtil; import org.wso2.carbon.registry.resource.services.utils.CopyResourceUtil; import org.wso2.carbon.registry.resource.services.utils.CreateVersionUtil; import org.wso2.carbon.registry.resource.services.utils.DeleteUtil; import org.wso2.carbon.registry.resource.services.utils.DeleteVersionUtil; import org.wso2.carbon.registry.resource.services.utils.DescriptionUtil; import org.wso2.carbon.registry.resource.services.utils.GetDownloadContentUtil; import org.wso2.carbon.registry.resource.services.utils.GetPropertyUtil; import org.wso2.carbon.registry.resource.services.utils.GetResourceTreeEntryUtil; import org.wso2.carbon.registry.resource.services.utils.GetTextContentUtil; import org.wso2.carbon.registry.resource.services.utils.GetVersionsUtil; import org.wso2.carbon.registry.resource.services.utils.MediaTypeUtil; import org.wso2.carbon.registry.resource.services.utils.MetadataPopulator; import org.wso2.carbon.registry.resource.services.utils.MoveResourceUtil; import org.wso2.carbon.registry.resource.services.utils.PermissionUtil; import org.wso2.carbon.registry.resource.services.utils.RenameResourceUtil; import org.wso2.carbon.registry.resource.services.utils.ResourceServiceException; import org.wso2.carbon.registry.resource.services.utils.RestoreVersionUtil; import org.wso2.carbon.registry.resource.services.utils.UpdateTextContentUtil; import javax.activation.DataHandler; import java.io.File; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.OutputStream; public class ResourceService extends RegistryAbstractAdmin implements IResourceService<MetadataBean, CollectionContentBean, ResourceData, ContentBean, PermissionBean, VersionsBean, ResourceTreeEntryBean, ContentDownloadBean> { public MetadataBean getMetadata(String path) throws Exception { RegistryUtil.setSessionResourcePath(path); UserRegistry registry = (UserRegistry)getRootRegistry(); return MetadataPopulator.populate(path, registry); } public void setDescription(String path, String description) throws Exception { UserRegistry registry = (UserRegistry) getRootRegistry(); if (RegistryUtils.isRegistryReadOnly(registry.getRegistryContext())) { return; } DescriptionUtil.setDescription(registry, path, description); } public void updateMediaType(String path ,String mediaType) throws Exception { UserRegistry registry = (UserRegistry) getRootRegistry(); if (RegistryUtils.isRegistryReadOnly(registry.getRegistryContext())) { return; } MediaTypeUtil.updateMediaType(registry,path,mediaType); } public CollectionContentBean getCollectionContent(String path) throws Exception { UserRegistry registry = (UserRegistry)getRootRegistry(); return ContentUtil.getCollectionContent(path, registry); } public ResourceData[] getResourceData(String[] paths) throws Exception { UserRegistry registry = (UserRegistry)getRootRegistry(); return ContentUtil.getResourceData(paths, registry); } public ContentBean getContentBean(String path) throws Exception { UserRegistry registry = (UserRegistry)getRootRegistry(); return ContentUtil.getContent(path, registry); } public String addCollection( String parentPath, String collectionName, String mediaType, String description) throws Exception { UserRegistry registry = (UserRegistry) getRootRegistry(); if (RegistryUtils.isRegistryReadOnly(registry.getRegistryContext())) { return null; } return AddCollectionUtil.process(parentPath, collectionName, mediaType, description, registry); } // TODO: this method must be removed, we will only have addTextContent in the future. // Look into proper deprecation procedure. - Senaka. public boolean addTextResource( String parentPath, String fileName, String mediaType, String description, String content) throws Exception { return addTextContent(parentPath, fileName, mediaType, description, content); } public boolean addTextContent( String parentPath, String fileName, String mediaType, String description, String content) throws Exception { UserRegistry registry = (UserRegistry) getRootRegistry(ResourceDataHolder.getInstance().getRegistryService()); if (RegistryUtils.isRegistryReadOnly(registry.getRegistryContext())) { return false; } AddTextResourceUtil.addTextResource(parentPath, fileName, mediaType, description, content, registry); return true; } public void addSymbolicLink (String parentPath, String name, String targetPath) throws Exception { UserRegistry registry = (UserRegistry) getRootRegistry(); if (RegistryUtils.isRegistryReadOnly(registry.getRegistryContext())) { return; } AddSymbolicLinkUtil.addSymbolicLink(registry, parentPath, name, targetPath); } public void addRemoteLink (String parentPath, String name, String instance, String targetPath) throws Exception { UserRegistry registry = (UserRegistry) getRootRegistry(); if (RegistryUtils.isRegistryReadOnly(registry.getRegistryContext())) { return; } AddRemoteLinkUtil.addRemoteLink(registry, parentPath, name, instance, targetPath); } public boolean importResource( String parentPath, String resourceName, String mediaType, String description, String fetchURL, String symlinkLocation, String[][] properties) throws Exception { UserRegistry registry = (UserRegistry) getRootRegistry(ResourceDataHolder.getInstance().getRegistryService()); if (RegistryUtils.isRegistryReadOnly(registry.getRegistryContext())) { return false; } // Fix for file importation security verification - FileSystemImportationSecurityHotFixTestCase if (StringUtils.isNotBlank(fetchURL) && fetchURL.toLowerCase().startsWith("file:")) { String msg = "The source URL must not be file in the server's local file system"; throw new RegistryException(msg); } // Adding Source URL as property to end of the properties array. String[][] newProperties = CommonUtil.setProperties(properties, "sourceURL", fetchURL); // Data is directed to below AddResourceUtil.addResource from ImportResourceUtil.importResource // Hence resource upload path will now go through put. AddResourceUtil.addResource(CommonUtil.calculatePath(parentPath, resourceName), mediaType, description, GetTextContentUtil.getByteContent(fetchURL), symlinkLocation, registry, newProperties); return true; } public boolean delete(String pathToDelete) throws Exception { UserRegistry registry = (UserRegistry) getRootRegistry(); if (RegistryUtils.isRegistryReadOnly(registry.getRegistryContext())) { return false; } DeleteUtil.process(pathToDelete, registry); return true; } public PermissionBean getPermissions(String path) throws Exception { try { return PermissionUtil.getPermissions((UserRegistry)getRootRegistry(), path); } catch (Exception e) { throw new ResourceServiceException(e.getMessage(),e); } } public boolean addUserPermission( String pathToAuthorize, String userToAuthorize, String actionToAuthorize, String permissionType) throws ResourceServiceException { throw new UnsupportedOperationException("This operation is no longer supported"); /*try { AddUserPermissionUtil.addUserPermission( pathToAuthorize, userToAuthorize, actionToAuthorize, permissionType); } catch (Exception e) { throw new ResourceServiceException(e.getMessage(),e); } return true;*/ } public boolean addRolePermission( String pathToAuthorize, String roleToAuthorize, String actionToAuthorize, String permissionType) throws ResourceServiceException { try { AddRolePermissionUtil.addRolePermission((UserRegistry)getRootRegistry(), pathToAuthorize, roleToAuthorize, actionToAuthorize, permissionType); setPermissionUpdateTimestamp(); } catch (Exception e) { throw new ResourceServiceException(e.getMessage(),e); } return true; } public boolean changeUserPermissions(String resourcePath, String permissionInput) throws Exception { throw new UnsupportedOperationException("This operation is no longer supported"); /*try { ChangeUserPermissionsUtil.changeUserPermissions(resourcePath, permissionInput); } catch (Exception e) { throw new ResourceServiceException(e.getMessage(),e); } return true;*/ } public boolean changeRolePermissions(String resourcePath, String permissionsInput) throws Exception { try { ChangeRolePermissionsUtil.changeRolePermissions((UserRegistry)getRootRegistry(), resourcePath, permissionsInput); setPermissionUpdateTimestamp(); } catch (Exception e) { throw new ResourceServiceException(e.getMessage(),e); } return true; } public String getTextContent(String path) throws Exception { Registry registry = (UserRegistry)getRootRegistry(); return GetTextContentUtil.getTextContent(path, registry); } public boolean updateTextContent(String resourcePath, String contentText) throws Exception { UserRegistry registry = (UserRegistry) getRootRegistry(); if (RegistryUtils.isRegistryReadOnly(registry.getRegistryContext())) { return false; } UpdateTextContentUtil.updateTextContent(resourcePath, contentText, registry); return true; } public boolean addResource(String path, String mediaType, String description, DataHandler content, String symlinkLocation, String[][] properties) throws Exception { UserRegistry registry = (UserRegistry) getRootRegistry(ResourceDataHolder.getInstance().getRegistryService()); if (RegistryUtils.isRegistryReadOnly(registry.getRegistryContext())) { return false; } AddResourceUtil.addResource(path, mediaType, description, content, symlinkLocation, registry, properties); return true; } public boolean addExtension(String name, DataHandler content) throws Exception { File extension = new File(RegistryUtils.getExtensionLibDirectoryPath() + File.separator + name); File extensionsDirectory = extension.getParentFile(); if (extensionsDirectory.exists() || extensionsDirectory.mkdir()) { OutputStream os = new FileOutputStream(extension); try { content.writeTo(os); } finally { os.close(); } } return true; } public String[] listExtensions() throws Exception { File extensionsDirectory = new File(RegistryUtils.getExtensionLibDirectoryPath()); if (extensionsDirectory.exists()) { String[] names = extensionsDirectory.list(new FilenameFilter() { public boolean accept(File dir, String name) { return name != null && name.endsWith(".jar"); } }); if (names != null && names.length > 0) { return names; } } return new String[0]; } public boolean removeExtension(String name) throws Exception { File extension = new File(RegistryUtils.getExtensionLibDirectoryPath() + File.separator + name); FileUtils.forceDelete(extension); return true; } public boolean renameResource( String parentPath, String oldResourcePath, String newResourceName) throws Exception { UserRegistry registry = (UserRegistry) getRootRegistry(); if (RegistryUtils.isRegistryReadOnly(registry.getRegistryContext())) { return false; } RenameResourceUtil.renameResource(parentPath, oldResourcePath, newResourceName, registry); return true; } public boolean copyResource( String parentPath, String oldResourcePath, String destinationPath, String resourceName) throws Exception { UserRegistry registry = (UserRegistry) getRootRegistry(); if (RegistryUtils.isRegistryReadOnly(registry.getRegistryContext())) { return false; } CopyResourceUtil.copyResource(registry, parentPath, oldResourcePath, destinationPath, resourceName); return true; } public boolean moveResource( String parentPath, String oldResourcePath, String destinationPath, String resourceName) throws Exception { UserRegistry registry = (UserRegistry) getRootRegistry(); if (RegistryUtils.isRegistryReadOnly(registry.getRegistryContext())) { return false; } MoveResourceUtil.moveResource(registry, parentPath, oldResourcePath, destinationPath, resourceName); return true; } public String getSessionResourcePath() throws Exception { return RegistryUtil.getSessionResourcePath(); } public void setSessionResourcePath(String resourcePath) throws Exception { RegistryUtil.setSessionResourcePath(resourcePath); } public ResourceTreeEntryBean getResourceTreeEntry(String resourcePath) throws Exception { UserRegistry registry = (UserRegistry)getRootRegistry(); return GetResourceTreeEntryUtil.getResourceTreeEntry(resourcePath, registry); } public boolean createVersion(String resourcePath) throws Exception { UserRegistry registry = (UserRegistry) getRootRegistry(); if (RegistryUtils.isRegistryReadOnly(registry.getRegistryContext())) { return false; } CreateVersionUtil.createVersion(registry, resourcePath); return true; } public boolean restoreVersion(String versionPath) throws Exception { UserRegistry registry = (UserRegistry) getRootRegistry(); if (RegistryUtils.isRegistryReadOnly(registry.getRegistryContext())) { return false; } RestoreVersionUtil.restoreVersion(registry, versionPath); return true; } public VersionsBean getVersionsBean(String path) throws Exception { return GetVersionsUtil.getVersionsBean((UserRegistry)getRootRegistry(), path); } public String getMediatypeDefinitions() throws Exception { Registry configSystemRegistry = getConfigSystemRegistry(); return MediaTypesUtils.getResourceMediaTypeMappings(configSystemRegistry); } public String getCollectionMediatypeDefinitions() throws Exception { Registry configSystemRegistry = getConfigSystemRegistry(); return MediaTypesUtils.getCollectionMediaTypeMappings(configSystemRegistry); } public String getCustomUIMediatypeDefinitions() throws Exception { Registry configSystemRegistry = getConfigSystemRegistry(); return MediaTypesUtils.getCustomUIMediaTypeMappings(configSystemRegistry); } public String getProperty(String resourcePath, String key) throws Exception { return GetPropertyUtil.getProperty((UserRegistry)getRootRegistry(), resourcePath, key); } public ContentDownloadBean getContentDownloadBean(String path) throws Exception { UserRegistry userRegistry = (UserRegistry)getRootRegistry(); return GetDownloadContentUtil.getContentDownloadBean(path, userRegistry); } public String getHumanReadableMediaTypes() throws Exception{ return MediaTypesUtils.getAllHumanTypes(); } public String getMimeTypeFromHuman(String mediaType) throws Exception{ return MediaTypesUtils.getMimeTypeFromHumanReadableMediaType(mediaType); } public boolean deleteVersionHistory(String path, String snapshotId) throws Exception { UserRegistry registry = (UserRegistry) getRootRegistry(); long snapshotID = Long.parseLong(snapshotId); DeleteVersionUtil.process(path, snapshotID, registry); return true; } public ContentDownloadBean getZipWithDependencies(String path) throws Exception { UserRegistry registry = (UserRegistry) getRootRegistry(); return ContentUtil.getContentWithDependencies(path,registry); } public boolean hasAssociations(String path,String type) throws Exception { UserRegistry registry = (UserRegistry) getRootRegistry(); return ContentUtil.hasAssociations(path,type,registry); } }