/*
 *  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.
 */

package org.apache.harmony.security.tests.support.acl;

import java.security.acl.Permission;

/**
 * Additional class for verification Permission interface 
 */
public class PermissionImpl implements Permission {
    
    private String permission;

    public PermissionImpl(String s) {
        permission = s;
    }

    public boolean equals(Object obj) {
        if(obj instanceof Permission) {
            Permission permission1 = (Permission)obj;
            return permission.equals(permission1.toString());
        } else {
            return false;
        }
    }

    public String toString() {
        return permission;
    }

/*    public int hashCode() {
        return toString().hashCode();
    }*/
}