com.google.common.css.compiler.ast.CssRootNode.java Source code

Java tutorial

Introduction

Here is the source code for com.google.common.css.compiler.ast.CssRootNode.java

Source

/*
 * Copyright 2008 Google Inc.
 *
 * 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 com.google.common.css.compiler.ast;

import com.google.common.base.Preconditions;

import javax.annotation.Nullable;

/**
 * The root of a node.
 *
 *
 */
public class CssRootNode extends CssNode {
    private CssAtRuleNode charsetRule = null;
    private CssImportBlockNode importRules;

    // TODO(user): Support this.
    // http://www.w3.org/TR/css3-namespace/
    // private List<CssAtRuleNode> namespaceRules;

    // TODO(user): Support this.
    // http://disruptive-innovations.com/zoo/cssvariables/
    // private List<CssAtRuleNode> variablesRules;

    // Contains style rules, media rules, conditional rules, etc.
    private final CssBlockNode body;

    public CssRootNode(CssBlockNode body) {
        Preconditions.checkNotNull(body);
        Preconditions.checkArgument(!body.isEnclosedWithBraces());
        this.body = body;
        this.importRules = new CssImportBlockNode();
        becomeParentForNode(this.body);
        becomeParentForNode(this.importRules);
    }

    public CssRootNode() {
        this(new CssBlockNode(false /* isEnclosedWithBraces */));
    }

    public CssRootNode(CssRootNode node) {
        this(node.getBody().deepCopy());
        this.setParent(node.getParent());
        // TODO(oana): When charset rules are added to the tree, a deep copy of it
        // must be created here.
        this.importRules = node.getImportRules().deepCopy();
    }

    @Override
    public CssRootNode deepCopy() {
        return new CssRootNode(this);
    }

    @Override
    void removeParent() {
        Preconditions.checkState(false, "You cannot remove the parent node of a tree root.");
    }

    @Override
    void setParent(CssNode parent) {
        Preconditions.checkState(parent == null, "You cannot set a non-null parent node of a tree root.");
    }

    public CssAtRuleNode getCharsetRule() {
        return this.charsetRule;
    }

    void setCharsetRule(@Nullable CssAtRuleNode charsetRule) {
        removeAsParentOfNode(this.charsetRule);
        this.charsetRule = charsetRule;
        becomeParentForNode(this.charsetRule);
    }

    public CssImportBlockNode getImportRules() {
        return importRules;
    }

    void setImportRules(@Nullable CssImportBlockNode importRules) {
        removeAsParentOfNode(this.importRules);
        this.importRules = importRules;
        becomeParentForNode(this.importRules);
    }

    public CssBlockNode getBody() {
        return body;
    }

    /**
     * Debugging only.
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        if (getCharsetRule() != null) {
            sb.append(getCharsetRule().toString());
        }
        if (!getImportRules().isEmpty()) {
            sb.append(getImportRules().toString());
        }
        sb.append(getBody().toString());
        return sb.toString();
    }
}