/***************************************************************************** * * 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.pdfbox.preflight.action; import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_ACTION_FORBIDDEN_ADDITIONAL_ACTION; import java.util.List; import org.apache.pdfbox.cos.COSDictionary; import org.apache.pdfbox.preflight.PreflightContext; import org.apache.pdfbox.preflight.ValidationResult.ValidationError; import org.apache.pdfbox.preflight.exception.ValidationException; public abstract class AbstractActionManager { /** * ActionManager factory used to create new ActionManager */ private ActionManagerFactory actionFact = null; /** * Action name in a Additional Action dictionary */ private String aaKey = null; /** * The action dictionary checked by this class */ protected COSDictionary actionDictionnary = null; /** * The validation context */ protected PreflightContext context = null; /** * * @param amFact * Instance of ActionManagerFactory used to create ActionManager to check Next actions. * @param adict * the COSDictionary of the action wrapped by this class. * @param ctx * the validation context . * @param aaKey * The name of the key which identify the action in a additional action dictionary. */ AbstractActionManager(ActionManagerFactory amFact, COSDictionary adict, PreflightContext ctx, String aaKey) { this.actionFact = amFact; this.actionDictionnary = adict; this.aaKey = aaKey; this.context = ctx; } /** * @return the isAdditionalAction */ public boolean isAdditionalAction() { return this.aaKey != null; } /** * @return the actionDictionnary */ public COSDictionary getActionDictionnary() { return actionDictionnary; } /** * @return the aaKey */ public String getAdditionalActionKey() { return aaKey; } /** * This method create a list of Action Managers which represent actions in the Next entry of the current action * dictionary. For each Next Action, the innerValid is called and the method returns false if a validation fails. * * @return True if all Next Action are valid, false otherwise. * @throws ValidationException */ protected boolean validNextActions() throws ValidationException { List<AbstractActionManager> lActions = this.actionFact.getNextActions(this.context, this.actionDictionnary); for (AbstractActionManager nAction : lActions) { if (!nAction.innerValid()) { return false; } } return true; } /** * Call the {@link AbstractActionManager#valid(boolean)} method with the additionalActionAuth set to false. * * @return the validation state. * @throws ValidationException */ public boolean valid() throws ValidationException { return valid(false); } /** * Validate an Action dictionary. * * Return false if the dictionary is invalid (ex : missing key). If the ActionManager represents an * AdditionalAction, this method returns false and updates the error list when the additonalActionAuth parameter is * set to false. * * This method call the innerValid method to process specific checks according to the action type. * * If innerValid successes, all actions contained in the Next entry of the Action dictionary are validated. * * @param additonalActionAuth * boolean to know if an additional action is authorized. * @return the validation state of the Action dictionary. * @throws ValidationException */ public boolean valid(boolean additonalActionAuth) throws ValidationException { if (isAdditionalAction() && !additonalActionAuth) { context.addValidationError(new ValidationError(ERROR_ACTION_FORBIDDEN_ADDITIONAL_ACTION, "Additional Action are forbidden")); return false; } if (innerValid()) { return validNextActions(); } return true; } /** * This method must be implemented by inherited classes to process specific validation. * * @return True if the action is valid, false otherwise. */ protected abstract boolean innerValid() throws ValidationException; }