/* * Copyright (c) 2015, 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.indexing.filter; import org.wso2.carbon.registry.core.Collection; import org.wso2.carbon.registry.core.Resource; import org.wso2.carbon.registry.core.ResourcePath; import org.wso2.carbon.registry.core.exceptions.RegistryException; import org.wso2.carbon.registry.core.jdbc.handlers.RequestContext; import org.wso2.carbon.registry.core.jdbc.handlers.filters.Filter; import org.wso2.carbon.registry.core.utils.RegistryUtils; import org.wso2.carbon.registry.core.utils.VersionedPath; import java.util.regex.Matcher; import java.util.regex.Pattern; public class MediaTypeFilter extends Filter { private String mediaTypeRegEx; private Pattern pattern; public String getMediaTypeRegEx() { return mediaTypeRegEx; } public void setMediaTypeRegEx(String mediaTypeRegEx) { this.mediaTypeRegEx = mediaTypeRegEx; } private static String defaultRegex = "application.*"; public MediaTypeFilter() { this(defaultRegex); } public MediaTypeFilter(String mediaTypeRegEx) { this.mediaTypeRegEx = mediaTypeRegEx; pattern = Pattern.compile(mediaTypeRegEx); } public int hashCode() { return getEqualsComparator().hashCode(); } // Method to generate a unique string that can be used to compare two objects of the same type // for equality. private String getEqualsComparator() { StringBuffer sb = new StringBuffer(); sb.append(getClass().getName()); sb.append("|"); sb.append(mediaTypeRegEx); sb.append("|"); sb.append(invert); return sb.toString(); } public boolean equals(Object other) { if (this == other) { return true; } else if (other == null) { return false; } if (other instanceof MediaTypeFilter) { MediaTypeFilter otherMediaTypeMatcher = (MediaTypeFilter) other; return (getEqualsComparator().equals(otherMediaTypeMatcher.getEqualsComparator())); } return false; } @Override public boolean handleGet(RequestContext requestContext) throws RegistryException { // check if the request is for new resource ResourcePath resourcePath = requestContext.getResourcePath(); if (resourcePath.parameterExists("new")) { String mediaType = resourcePath.getParameterValue("mediaType"); if (mediaType != null){ Matcher matcher = pattern.matcher(mediaType); return matcher.matches(); } } Resource resource = requestContext.getResource(); if (resource == null) { VersionedPath versionedPath = RegistryUtils.getVersionedPath(requestContext.getResourcePath()); if (versionedPath.getVersion() == -1) { resource = requestContext.getRepository(). get(requestContext.getResourcePath().getPath()); requestContext.setResource(resource); } } if (resource != null) { String mType = resource.getMediaType(); if (mType != null){ Matcher matcher = pattern.matcher(mType); return matcher.matches(); } } return false; } @Override public boolean handlePut(RequestContext requestContext) throws RegistryException { Resource resource = requestContext.getResource(); if (resource == null) { return false; } String mType = resource.getMediaType(); if (mType != null){ Matcher matcher = pattern.matcher(mType); return matcher.matches(); } return false; } @Override public boolean handleImportResource(RequestContext requestContext) throws RegistryException { Resource resource = requestContext.getResource(); if (resource == null) { return false; } String mType = resource.getMediaType(); if (mType != null){ Matcher matcher = pattern.matcher(mType); return matcher.matches(); } return false; } @Override public boolean handleDelete(RequestContext requestContext) throws RegistryException { Resource resource = requestContext.getResource(); if (resource == null) { resource = requestContext.getRepository().get(requestContext.getResourcePath().getPath()); requestContext.setResource(resource); } if (resource != null) { String mType = resource.getMediaType(); if (mType != null){ Matcher matcher = pattern.matcher(mType); return matcher.matches(); } } return false; } @Override public boolean handlePutChild(RequestContext requestContext) throws RegistryException { Collection parentCollection = requestContext.getParentCollection(); if (parentCollection == null) { String parentPath = requestContext.getParentPath(); if (parentPath == null) { parentPath = RegistryUtils.getParentPath(requestContext.getResourcePath().getPath()); requestContext.setParentPath(parentPath); } VersionedPath versionedPath = RegistryUtils.getVersionedPath(requestContext.getResourcePath()); if (versionedPath.getVersion() == -1) { Resource parentResource = requestContext.getRepository().get(parentPath); if (parentResource != null) { if (parentResource instanceof Collection) { parentCollection = (Collection) parentResource; requestContext.setParentCollection(parentCollection); } else { // parent should be a collection, already exists a non-collection String msg = "There already exist non collection resource." + parentPath + "Child can only be added to collections"; throw new RegistryException(msg); } } } } if (parentCollection != null) { String parentMediaType = parentCollection.getMediaType(); if (parentMediaType != null){ Matcher matcher = pattern.matcher(parentMediaType); return matcher.matches(); } } return false; } @Override public boolean handleImportChild(RequestContext requestContext) throws RegistryException { Collection parentCollection = requestContext.getParentCollection(); if (parentCollection == null) { String parentPath = requestContext.getParentPath(); if (parentPath == null) { parentPath = RegistryUtils. getParentPath(requestContext.getResourcePath().getPath()); requestContext.setParentPath(parentPath); } VersionedPath versionedPath = RegistryUtils.getVersionedPath(requestContext.getResourcePath()); if (versionedPath.getVersion() == -1) { parentCollection = (Collection) requestContext.getRepository().get(parentPath); requestContext.setParentCollection(parentCollection); } } if (parentCollection != null) { String parentMediaType = parentCollection.getMediaType(); if (parentMediaType != null){ Matcher matcher = pattern.matcher(parentMediaType); return matcher.matches(); } } return false; } }