org.apache.myfaces.trinidadbuild.plugin.javascript.obfuscator.Obfuscator.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.myfaces.trinidadbuild.plugin.javascript.obfuscator.Obfuscator.java

Source

/*
 *  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.myfaces.trinidadbuild.plugin.javascript.obfuscator;

//~--- non-JDK imports --------------------------------------------------------

import org.apache.myfaces.trinidadbuild.plugin.javascript.obfuscator.configuration.ConfigException;
import org.apache.myfaces.trinidadbuild.plugin.javascript.obfuscator.configuration.ObfuscatorConfig;
import org.apache.myfaces.trinidadbuild.plugin.javascript.obfuscator.filters.ObfuscatorFilter;
import org.apache.myfaces.trinidadbuild.plugin.javascript.obfuscator.filters.compression.CompressionFilter;
import org.apache.myfaces.trinidadbuild.plugin.javascript.obfuscator.filters.keywords.SpecialKeywordsFilter;
import org.apache.myfaces.trinidadbuild.plugin.javascript.obfuscator.filters.obfuscation.ObfuscationFilter;
import org.apache.myfaces.trinidadbuild.plugin.javascript.obfuscator.filters.output.OutputGenerator;
import org.apache.myfaces.trinidadbuild.plugin.javascript.obfuscator.javascript15parser.AnnotatedToken;
import org.apache.myfaces.trinidadbuild.plugin.javascript.obfuscator.javascript15parser.JSParser15;
import org.apache.myfaces.trinidadbuild.plugin.javascript.obfuscator.javascript15parser.ParseException;
import org.apache.myfaces.trinidadbuild.plugin.javascript.uixtools.FileProcessor;

//~--- JDK imports ------------------------------------------------------------

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

import java.util.Iterator;
import java.util.Vector;

import org.apache.commons.io.FileUtils;

//~--- classes ----------------------------------------------------------------

public class Obfuscator extends FileProcessor {
    private Vector _filters = new Vector();

    private ObfuscatorFilter _keywordsFilter = new SpecialKeywordsFilter();

    private ObfuscationFilter _obfuscationFilter = new ObfuscationFilter();

    private OutputGenerator _outputGenerator = new OutputGenerator();

    private ObfuscatorConfig _config;

    private JSParser15 _jsParser;

    private boolean _obfuscate;

    private boolean _replaceCharLiterals;

    private boolean _stripComments;

    private boolean _stripNewlines;

    private boolean _stripSpecialKeywords;

    private boolean _stripWhitespaces;

    //~--- constructors -------------------------------------------------------

    public Obfuscator(boolean obfuscate, boolean stripComments, boolean stripWhitespaces, boolean stripNewlines,
            boolean stripSpecialKeywords, boolean replaceCharLiterals, ObfuscatorConfig config)
            throws ConfigException {
        super("js", false);
        _obfuscate = obfuscate;
        _stripComments = stripComments;
        _stripWhitespaces = stripWhitespaces;
        _stripNewlines = stripNewlines;
        _stripSpecialKeywords = stripSpecialKeywords;
        _replaceCharLiterals = replaceCharLiterals;
        _config = config;
    }

    //~--- methods ------------------------------------------------------------

    private void init(InputSource in) {

        // apply overrides
        boolean obfuscate = in.skipObfuscation() ? false : _obfuscate;
        boolean stripComments = in.skipStripComments() ? false : _stripComments;
        boolean stripWhitespaces = in.skipStripWhitespaces() ? false : _stripWhitespaces;
        boolean stripNewLines = in.skipStripNewlines() ? false : _stripNewlines;
        boolean stripSpecialKeywords = in.skipStripSpecialKeywords() ? false : _stripSpecialKeywords;

        // setup filters
        _filters.clear();

        if (stripSpecialKeywords) {
            _filters.add(_keywordsFilter);
        }

        if (stripWhitespaces || stripNewLines || stripComments) {
            _filters.add(new CompressionFilter(stripComments, stripWhitespaces, stripNewLines));
        }

        if (obfuscate) {
            _filters.add(_obfuscationFilter);
        }

        // make output generator the last filter
        _filters.add(_outputGenerator);
    }

    private void initParser(InputStream in) {
        if (_jsParser == null) {
            _jsParser = new JSParser15(in);
        } else {
            _jsParser.ReInit(in);
        }
    }

    public void process(InputSource in, OutputStream out) throws ParseException {
        init(in);
        _outputGenerator.setOutputStream(out);

        AnnotatedToken token = tokenize(in.getInputStream());

        for (Iterator itr = _filters.iterator(); itr.hasNext();) {
            ObfuscatorFilter filter = (ObfuscatorFilter) itr.next();

            token = filter.filter(token);
        }
    }

    protected void processFile(File in, File out) throws Exception {
        if (_obfuscate == true) {
            FileInputStream inStream = new FileInputStream(in);
            FileOutputStream outStream = new FileOutputStream(out);
            String fileName = in.getName();
            InputSource inpSource = new InputSource(inStream, _config.skipObfuscation(fileName),
                    _config.skipStripComments(fileName), _config.skipStripWhitespaces(fileName),
                    _config.skipStripNewlines(fileName), _config.skipStripSpecialKeywords(fileName));

            process(inpSource, outStream);
            inStream.close();
            outStream.close();
        } else {
            // Just copy the files over.
            FileUtils.touch(out);
            FileUtils.copyFile(in, out);
        }
    }

    private AnnotatedToken tokenize(InputStream in) throws ParseException {
        initParser(in);

        return (AnnotatedToken) _jsParser.Program();
    }
}