/*
 * Copyright 2006 Stephen J. McConnell.
 *
 * 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 org.acme;

import java.awt.Color;
import java.io.File;
import java.net.URI;
import java.util.Map;

import java.util.logging.Logger;
import java.util.logging.Level;

/**
 * A component with a context
 
 @author <a href="@PUBLISHER-URL@">@PUBLISHER-NAME@</a>
 @version @PROJECT-VERSION@
 */
public class Demo
{
    //------------------------------------------------------------------
    // context
    //------------------------------------------------------------------
    
   /**
    * Declaration of the component context contract.  This example
    * demonstrates the default pattern-based approach (a inner interface named
    * "Context") to context declaration.  The context interface demonstrates
    * a broad-spectrum of possibilities covering requitred and optional entries, 
    * primative, and complex values, arrays and maps.
    */
    public interface Context
    {
       /**
        * Return the assigned color.
        @return the required color value
        */
        Color getColor();
        
       /**
        * Return the optional color.
        @param color the default color value
        @return the resolved color value 
        */
        Color getOptionalColorColor color );
        
       /**
        * Return a constructed color.
        @return the color value 
        */
        Color getAnotherColor();
        
       /**
        * Return as assigned non-optional integer value.
        @return the integer value
        */
        int getInteger();
        
       /**
        * Return as resolved optional integer value.
        @param value the default value
        @return the integer value
        */
        int getOptionalIntegerint value );
        
       /**
        * Return as assigned non-optional short value.
        @return the short value
        */
        short getShort();
        
       /**
        * Return as resolved optional short value.
        @param value the default value
        @return the short value
        */
        short getOptionalShortshort value );
        
       /**
        * Return as assigned non-optional long value.
        @return the long value
        */
        long getLong();
        
       /**
        * Return as resolved optional long value.
        @param value the default value
        @return the long value
        */
        long getOptionalLonglong value );
        
       /**
        * Return as assigned non-optional byte value.
        @return the byte value
        */
        byte getByte();
        
       /**
        * Return as resolved optional byte value.
        @param value the default value
        @return the byte value
        */
        byte getOptionalBytebyte value );
        
       /**
        * Return as assigned non-optional double value.
        @return the double value
        */
        double getDouble();
        
       /**
        * Return as resolved optional double value.
        @param value the default value
        @return the double value
        */
        double getOptionalDoubledouble value );
        
       /**
        * Return as assigned non-optional float value.
        @return the float value
        */
        float getFloat();
        
       /**
        * Return as resolved optional float value.
        @param value the default value
        @return the float value
        */
        float getOptionalFloatfloat value );
        
       /**
        * Return as assigned non-optional char value.
        @return the char value
        */
        char getChar();
        
       /**
        * Return as resolved optional char value.
        @param value the default value
        @return the char value
        */
        char getOptionalCharchar value );
        
       /**
        * Return as assigned non-optional boolean value.
        @return the boolean value
        */
        boolean getBoolean();
        
       /**
        * Return as resolved optional boolean value.
        @param flag the default value
        @return the boolean value
        */
        boolean getOptionalBooleanboolean flag );
        
       /**
        * Return as assigned non-optional file value.
        @return the file value
        */
        File getFile();
        
       /**
        * Return as resolved optional file value.
        @param value the default value
        @return the file value
        */
        File getOptionalFileFile value );
        
       /**
        * Return a non-optional temporary file value.
        @return the temp file value
        */
        File getTempFile();
        
       /**
        * Return as assigned non-optional uri value.
        @return the uri value
        */
        URI getURI();
        
       /**
        * Return a optional uri value.
        @param value the default value
        @return the uri value
        */
        URI getOptionalURIURI value );
        
       /**
        * Return as assigned non-optional name.
        @return the name
        */
        String getName();
        
       /**
        * Return as assigned non-optional path.
        @return the path
        */
        String getPath();
        
       /**
        * Return as assigned non-optional array of names.
        @return the name array
        */
        String[] getNames();
        
       /**
        * Return a map with string keys and instances of Color as values. 
        @return a color map
        */
        Map<String,Color> getColors();
    }
    
    //------------------------------------------------------------------
    // constructor
    //------------------------------------------------------------------
    
   /**
    * Creation of a new object using a supplied logging channel.
    @param logger the logging channel
    @param context the deployment context
    @exception Exception if an error occurs
    */
    public Demofinal Logger logger, final Context context throws Exception
    {
        short s = 9;
        long l = 21;
        byte b = 3;
        double d = 0.001;
        float f = 3.142f;
        char c = '#';
        File file = new FileSystem.getProperty"user.dir" ) );
        File tmp = new FileSystem.getProperty"java.io.tmpdir" ) );
        URI uri = file.toURI();
        
        iflogger.isLoggableLevel.INFO ) )
        {
            logger.info"color: " + context.getColor() );
            logger.info"anotherColor: " + context.getAnotherColor() );
            logger.info"integer: " + context.getInteger() );
            logger.info"short: " + context.getShort() );
            logger.info"long: " + context.getLong() );
            logger.info"byte: " + context.getByte() );
            logger.info"double: " + context.getDouble() );
            logger.info"float: " + context.getFloat() );
            logger.info"char: " + context.getChar() );
            logger.info"boolean: " + context.getBoolean() );
            logger.info"file: " + context.getFile() );
            logger.info"temp: " + context.getTempFile() );
            logger.info"uri: " + context.getURI() );
            logger.info"name: " + context.getName() );
            logger.info"path: " + context.getPath() );
            logger.info"names: " + context.getNames().length );
            logger.info"optionalColor: " + context.getOptionalColorColor.BLUE ) );
            logger.info"optionalInteger: " + context.getOptionalInteger42 ) );
            logger.info"optionalShort: " + context.getOptionalLong) );
            logger.info"optionalLong: " + context.getOptionalLong) );
            logger.info"optionalByte: " + context.getOptionalByte) );
            logger.info"optionalDouble: " + context.getOptionalDouble) );
            logger.info"optionalFloat: " + context.getOptionalFloat) );
            logger.info"optionalChar: " + context.getOptionalChar) );
            logger.info"optionalBoolean: " + context.getOptionalBooleanfalse ) );
            logger.info"optionalFile: " + context.getOptionalFilefile ) );
            logger.info"optionalURI: " + context.getOptionalURIuri ) );
            forString key : context.getColors().keySet() )
            {
                Color color = context.getColors().getkey );
                logger.info"color (" + key + "): " + color );
            }
        }
    }
}