/*
 * 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 freemarker.debug;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Date;

import freemarker.template.TemplateModelException;

/**
 * Represents the debugger-side mirror of a TemplateModel object, a Template
 * object, or a Configuration object. The Environment objects are also represented
 * by instances of this model, although not directly but through a separate
 * subinterface {@link DebuggedEnvironment}. The interface is a union of
 * almost all of FreeMarker template models with identical method signatures.
 * For purposes of optimizing network traffic there are bulk retrieval methods
 * for sequences and hashes, as well as a {@link #getModelTypes()} method that
 * returns a bit mask of various <tt>TYPE_xxx</tt> constants flagging which
 * template models are implemented by the mirrored object.
 */
public interface DebugModel extends Remote {
    public static final int TYPE_SCALAR        =    1;
    public static final int TYPE_NUMBER        =    2;
    public static final int TYPE_DATE          =    4;
    public static final int TYPE_BOOLEAN       =    8;
    public static final int TYPE_SEQUENCE      =   16;
    public static final int TYPE_COLLECTION    =   32;
    public static final int TYPE_HASH          =   64;
    public static final int TYPE_HASH_EX       =  128;
    public static final int TYPE_METHOD        =  256;
    public static final int TYPE_METHOD_EX     =  512;
    public static final int TYPE_TRANSFORM     = 1024;
    public static final int TYPE_ENVIRONMENT   = 2048;
    public static final int TYPE_TEMPLATE      = 4096;
    public static final int TYPE_CONFIGURATION = 8192;
    
    public String getAsString()
    throws TemplateModelException,
        RemoteException;
        
    public Number getAsNumber()
    throws TemplateModelException,
        RemoteException;
    
    public boolean getAsBoolean()
    throws TemplateModelException,
        RemoteException;
    
    public Date getAsDate()
    throws TemplateModelException,
        RemoteException;
    
    public int getDateType()
    throws TemplateModelException,
        RemoteException;
        
    public int size()
    throws TemplateModelException,
        RemoteException;
        
    public DebugModel get(int index)
    throws TemplateModelException,
        RemoteException;
    
    public DebugModel[] get(int fromIndex, int toIndex)
    throws TemplateModelException,
        RemoteException;
        
    public DebugModel get(String key)
    throws TemplateModelException,
        RemoteException;
        
    public DebugModel[] get(String[] keys)
    throws TemplateModelException,
        RemoteException;
    
    public DebugModel[] getCollection()
    throws TemplateModelException,
        RemoteException;

    public String[] keys()
    throws TemplateModelException,
        RemoteException;
    
    public int getModelTypes()
    throws RemoteException;
}
