cz.muni.fi.lessappcache.parser.modules.ImportModule.java Source code

Java tutorial

Introduction

Here is the source code for cz.muni.fi.lessappcache.parser.modules.ImportModule.java

Source

/*
 * Copyright 2013 Petr Kunc.
 *
 * 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 cz.muni.fi.lessappcache.parser.modules;

import cz.muni.fi.lessappcache.filesystem.PathUtils;
import cz.muni.fi.lessappcache.importer.Importer;
import cz.muni.fi.lessappcache.parser.ManifestParser;
import cz.muni.fi.lessappcache.parser.ParsingContext;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

/**
 * Handles import of other lesscache manifest files. If file is not found, throws {@link ModuleException}
 *
 * @author Petr Kunc
 */
public class ImportModule extends AbstractModule implements Module {

    private final static Logger logger = Logger.getLogger(ImportModule.class.getName());

    /**
     * Constructs module and sets priority.
     */
    public ImportModule() {
        setPriority(6.0);
    }

    @Override
    public ModuleOutput parse(String line, ParsingContext pc) throws ModuleException {
        ModuleOutput output = new ModuleOutput();
        if (line.startsWith("@import")) {
            output.setControl(ModuleControl.STOP);
            String url = line.replaceAll("(?i)^@import\\s+(.*)$", "$1");
            //TODO: regex should be more aggresive
            url = StringUtils.strip(url, "\'\"");
            Path base = PathUtils.isAbsoluteOrRemote(url) ? Paths.get("") : pc.getContext();
            Path file = base.resolve(Paths.get(url));
            if (Importer.isImported(file)) {
                logger.warn("File " + file + " already imported. Skipping...");
                return output;
            }
            ManifestParser mp = new ManifestParser(file);
            try {
                mp.getLoadedResources().putAll(pc.getLoadedResources());
                mp.setMode(pc.getMode());
                output.getOutput().addAll(mp.processFile());
                output.setLoadedResources(mp.getLoadedResources());
                output.setMode(mp.getMode());
            } catch (IOException ex) {
                logger.error("File " + file + " not found.");
                throw new ModuleException(ex);
            }
        }
        return output;
    }
}