/***************************************************************************** * * 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.padaf.preflight; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.activation.DataSource; import org.apache.padaf.preflight.ValidationResult.ValidationError; import org.apache.padaf.preflight.helpers.AbstractValidationHelper; import org.apache.padaf.preflight.javacc.ParseException; public abstract class AbstractValidator implements PdfAValidator { protected ValidatorConfig config = null; public static final String version = "${project.version}"; public static final String fullName = "PADAF - "+version; protected Collection<AbstractValidationHelper> priorHelpers = new ArrayList<AbstractValidationHelper>(); protected Collection<AbstractValidationHelper> standHelpers = new ArrayList<AbstractValidationHelper>(); /** * * @param cfg * @throws ValidationException */ public AbstractValidator ( ValidatorConfig cfg ) throws ValidationException { config = cfg; Collection<Class<? extends AbstractValidationHelper>> ph = cfg.getPriorHelpers(); for (Class<? extends AbstractValidationHelper> priorHlpCls : ph) { this.priorHelpers.add(instantiateHelper(priorHlpCls, cfg)); } Collection<Class<? extends AbstractValidationHelper>> sh = cfg.getStandHelpers(); for (Class<? extends AbstractValidationHelper> standHlpCls : sh) { this.priorHelpers.add(instantiateHelper(standHlpCls, cfg)); } } /** * Instantiate a ValidationHelper using the given class. * * @param avhCls * @param cfg * @return * @throws ValidationException */ private AbstractValidationHelper instantiateHelper(Class<? extends AbstractValidationHelper> avhCls, ValidatorConfig cfg) throws ValidationException { try { Constructor<? extends AbstractValidationHelper> construct = avhCls.getConstructor(ValidatorConfig.class); return construct.newInstance(cfg); } catch (NoSuchMethodException e) { throw new ValidationException("Unable to create an instance of ValidationHelper : " + e.getMessage(), e); } catch (InvocationTargetException e) { throw new ValidationException("Unable to create an instance of ValidationHelper : " + e.getMessage(), e); } catch (IllegalAccessException e) { throw new ValidationException("Unable to create an instance of ValidationHelper : " + e.getMessage(), e); } catch (InstantiationException e) { throw new ValidationException("Unable to create an instance of ValidationHelper : " + e.getMessage(), e); } } /** * Create an instance of Document Handler. * This method can be override if a inherited class of DocumentHandler * must be used. * * @param source * @return */ protected DocumentHandler createDocumentHandler(DataSource source) { return new DocumentHandler(source); } /** * This method calls the validate method of the given ValidationHelper. A * validation exception will be thrown if the Helper throws a validation * exception and if the list of errors is empty. * * @param handler * the document handler which contains elements for the validation * @param helper * An inherited class of AbstractValidationHelper. * @param errors * A list of validation errors * @throws ValidationException */ protected void runValidation(DocumentHandler handler, AbstractValidationHelper helper, List<ValidationError> errors) throws ValidationException { try { errors.addAll(helper.validate(handler)); } catch (ValidationException e) { if (errors.size() == 0) { // If there are no error, the Exception is thrown because of we can't // know if the // exception is due to a validation error or to a unexpected cause. throw e; } } } /** * Create an instance of ValidationResult. This object contains an instance of * ValidationError. If the ParseException is an instance of PdfParseException, * the embedded validation error is initialized with the error code of the * exception, otherwise it is an UnknownError. * * @param e * @return */ protected ValidationResult createErrorResult(ParseException e) { if (e instanceof PdfParseException) { if (e.getCause()==null) { return new ValidationResult(new ValidationError(((PdfParseException) e) .getErrorCode())); } else if (e.getCause().getMessage()==null) { return new ValidationResult(new ValidationError(((PdfParseException) e) .getErrorCode())); } else { return new ValidationResult(new ValidationError(((PdfParseException) e) .getErrorCode(),e.getCause().getMessage())); } } return createUnknownErrorResult(); } /** * Create an instance of ValidationResult with a * ValidationError(UNKNOWN_ERROR) * * @return */ protected ValidationResult createUnknownErrorResult() { ValidationError error = new ValidationError( ValidationConstants.ERROR_UNKOWN_ERROR); ValidationResult result = new ValidationResult(error); return result; } /* (non-Javadoc) * @see net.padaf.preflight.PdfAValidator#getFullName() */ public String getFullName() { return fullName; } /* * (non-Javadoc) * @see org.apache.padaf.preflight.PdfAValidator#getVersion() */ public String getVersion() { return version; } }