/*
 * 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
<<<<<<< Updated upstream
 *
 *     https://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
=======
 * 
 *     https://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 
>>>>>>> Stashed changes
 * limitations under the License.
 */

package javax.jdo.spi;

/**
 * The <code>JDOPermission</code> class is for operations that are reserved for JDO implementations
 * and should not be called by other code. A <code>JDOPermission</code> is a <em>named
 * permission</em> and has no actions. There are two names currently defined. Each named permission
 * has a corresponding public static final field which contains an instance of the named permission.
 *
 * <p>The following table provides a summary description of what each named permission allows, and
 * discusses the risks of granting code the permission.
 *
 * <table border=1 cellpadding=5 summary="">
 * <tr>
 * <th>Permission Target Name</th>
 * <th>What the Permission Allows</th>
 * <th>Risks of Allowing this Permission</th>
 * </tr>
 * <tr>
 *   <td><code>setStateManager</code></td>
 *   <td>This allows setting the <code>StateManager</code> for an instance of
 *   <code>PersistenceCapable</code>. The <code>StateManager</code>
 *   has unlimited access to get and set persistent and transactional fields of
 *   the <code>PersistenceCapable</code> instance.</td>
 *   <td>This is dangerous in that information (possibly confidential)
 *   normally unavailable would be accessible to malicious code.</td>
 * </tr>
 * <tr>
 *   <td><code>getMetadata</code></td>
 *   <td>This allows getting metadata for any <code>PersistenceCapable</code>
 *   class that has registered with <code>JDOImplHelper</code>.</td>
 *   <td>This is dangerous in that metadata information (possibly confidential)
 *   normally unavailable would be accessible to malicious code.</td>
 * </tr>
 * <tr>
 *   <td><code>manageMetadata</code></td>
 *   <td>This allows managing metadata for any <code>PersistenceCapable</code>
 *   class that has registered with <code>JDOImplHelper</code>.</td>
 *   <td>This is dangerous in that metadata information (possibly confidential)
 *   normally unavailable would be manageable (modifiable) by malicious code.
 *   </td>
 * </tr>
 * <tr>
 *   <td><code>closePersistenceManagerFactory</code></td>
 *   <td>This allows closing a <code>PersistenceManagerFactory</code>,
 *       thereby releasing resources.</td>
 *   <td>This is dangerous in that resources bound to the
 *       <code>PersistenceManagerFactory</code> would be releaseable by
 *       malicious code.</td>
 * </tr>
 * </table>
 *
 * @see java.security.Permission
 * @see java.security.BasicPermission
 * @see javax.jdo.spi.JDOImplHelper
 * @see javax.jdo.spi.PersistenceCapable
 * @version 1.0.2
 */
public final class JDOPermission extends java.security.BasicPermission {

  private static final long serialVersionUID = 3087132628681636890L;

  /**
   * Constructs a <code>JDOPermission</code> with the specified name.
   *
   * @param name the name of the <code>JDOPermission</code>
   */
  public JDOPermission(String name) {
    super(name);
  }

  /**
   * Constructs a <code>JDOPermission</code> with the specified name and actions. The actions should
   * be <code>null</code>; they are ignored. This constructor exists for use by the <code>Policy
   * </code> object to instantiate new <code>Permission</code> objects.
   *
   * @param name the name of the <code>JDOPermission</code>
   * @param actions should be <code>null</code>.
   */
  public JDOPermission(String name, String actions) {
    super(name, actions);
  }

  /**
   * An instance of <code>JDOPermission</code> to be used for <code>getMetadata</code> permission
   * checking.
   */
  public static final JDOPermission GET_METADATA = new JDOPermission("getMetadata"); // NOI18N

  /**
   * An instance of <code>JDOPermission</code> to be used for <code>manageMetadata</code> permission
   * checking.
   *
   * @since 1.0.2
   */
  public static final JDOPermission MANAGE_METADATA = new JDOPermission("manageMetadata"); // NOI18N

  /**
   * An instance of <code>JDOPermission</code> to be used for <code>setStateManager</code>
   * permission checking.
   */
  public static final JDOPermission SET_STATE_MANAGER =
      new JDOPermission("setStateManager"); // NOI18N

  /**
   * An instance of <code>JDOPermission</code> to be used for <code>closePersistenceManagerFactory
   * </code> permission checking.
   *
   * @since 1.0.1
   */
  public static final JDOPermission CLOSE_PERSISTENCE_MANAGER_FACTORY =
      new JDOPermission("closePersistenceManagerFactory"); // NOI18N
}
