/*
 * 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.lenya.cms.repository;

import org.apache.commons.lang.Validate;
import org.apache.lenya.transaction.IdentifiableFactory;
import org.apache.lenya.transaction.IdentityMap;

/**
 * Wraps a repository item factory to resemble an identifiable factory.
 */
public class RepositoryItemFactoryWrapper implements IdentifiableFactory {
    
    private RepositoryItemFactory delegate;
    //florent : remove session private Session session;
    
    /**
     * Ctor.
     * @param delegate The factory to wrap.
     * @param session The session.
     */
    //public RepositoryItemFactoryWrapper(RepositoryItemFactory delegate, Session session) {
    public RepositoryItemFactoryWrapper(RepositoryItemFactory delegate) {
        Validate.notNull(delegate, "factory");
        //Validate.notNull(session, "session");
        this.delegate = delegate;
        //this.session = session;
    }

    public Object build(IdentityMap map, String key) throws Exception {
        //return delegate.buildItem(this.session, key);
    	return delegate.buildItem(key);
    }

    public String getType() {
        return this.delegate.getItemType();
    }

}
