# ApplicationVisitor.java

    /*
     * Copyright (c) 2008, Rickard Öberg. All Rights Reserved.
     *
     * 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.qi4j.library.rdf.model;

    import org.qi4j.api.composite.MethodDescriptor;
    import org.qi4j.api.composite.TransientDescriptor;
    import org.qi4j.api.entity.EntityDescriptor;
    import org.qi4j.api.object.ObjectDescriptor;
    import org.qi4j.api.structure.ApplicationDescriptor;
    import org.qi4j.api.structure.LayerDescriptor;
    import org.qi4j.api.structure.ModuleDescriptor;
    import org.qi4j.functional.HierarchicalVisitorAdapter;
    import org.qi4j.library.rdf.Qi4jRdf;
    import org.qi4j.library.rdf.serializer.SerializerContext;

    import static org.qi4j.functional.Iterables.first;

    /**
     * JAVADOC
     */
    class ApplicationVisitor extends HierarchicalVisitorAdapter<Object, Object, RuntimeException>
    {
        private SerializerContext context;

        private String appUri;

        private String layerUri;

        private String moduleUri;

        private String compositeUri;

        ApplicationVisitor( SerializerContext context )
        {
            this.context = context;
        }

        @Override
        public boolean visitEnter( Object visited )
            throws RuntimeException
        {
            if( visited instanceof ApplicationDescriptor )
            {
                ApplicationDescriptor applicationDescriptor = (ApplicationDescriptor) visited;
                appUri = context.createApplicationUri( applicationDescriptor.name() );
                context.setNameAndType( appUri, applicationDescriptor.name(), Qi4jRdf.TYPE_APPLICATION );
            }

            if( visited instanceof LayerDescriptor )
            {
                LayerDescriptor layerDescriptor = (LayerDescriptor) visited;
                layerUri = context.createLayerUri( appUri, layerDescriptor.name() );
                context.setNameAndType( layerUri, layerDescriptor.name(), Qi4jRdf.TYPE_LAYER );
                context.addRelationship( appUri, Qi4jRdf.RELATIONSHIP_LAYER, layerUri );
            }

            if( visited instanceof ModuleDescriptor )
            {
                ModuleDescriptor moduleDescriptor = (ModuleDescriptor) visited;
                moduleUri = context.createModuleUri( layerUri, moduleDescriptor.name() );
                context.setNameAndType( layerUri, moduleDescriptor.name(), Qi4jRdf.TYPE_MODULE );

                context.addRelationship( layerUri, Qi4jRdf.RELATIONSHIP_MODULE, moduleUri );
            }

            if( visited instanceof TransientDescriptor )
            {
                TransientDescriptor transientDescriptor = (TransientDescriptor) visited;
                compositeUri = context.createCompositeUri( moduleUri, first( transientDescriptor.types() ) );
                context.addType( compositeUri, Qi4jRdf.TYPE_COMPOSITE );
                context.addRelationship( moduleUri, Qi4jRdf.RELATIONSHIP_COMPOSITE, compositeUri );
            }

            if( visited instanceof EntityDescriptor )
            {
                EntityDescriptor entityDescriptor = (EntityDescriptor) visited;
                compositeUri = context.createCompositeUri( moduleUri, first( entityDescriptor.types() ) );
                context.addType( compositeUri, Qi4jRdf.TYPE_ENTITY );
                context.addRelationship( moduleUri, Qi4jRdf.RELATIONSHIP_ENTITY, compositeUri );
            }

            if( visited instanceof ObjectDescriptor )
            {
                ObjectDescriptor objectDescriptor = (ObjectDescriptor) visited;
                compositeUri = context.createCompositeUri( moduleUri, first( objectDescriptor.types() ) );
                context.addType( compositeUri, Qi4jRdf.TYPE_OBJECT );
                context.addRelationship( moduleUri, Qi4jRdf.RELATIONSHIP_OBJECT, compositeUri );
            }

            if( visited instanceof MethodDescriptor )
            {
                MethodDescriptor compositeMethodDescriptor = (MethodDescriptor) visited;
                String compositeMethodUri = context.createCompositeMethodUri( compositeUri, compositeMethodDescriptor.method() );
                context.addType( compositeMethodUri, Qi4jRdf.TYPE_METHOD );
                context.addRelationship( compositeUri, Qi4jRdf.RELATIONSHIP_METHOD, compositeMethodUri );
            }

            return true;
        }
    }