/*******************************************************************************
 * Copyright (c) 2010-2014 SAP AG and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.skalli.core.feed.jpa;

import java.io.IOException;
import java.text.MessageFormat;
import java.util.Collection;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;

import org.eclipse.skalli.services.feed.FeedEntry;
import org.eclipse.skalli.services.feed.FeedPersistenceService;
import org.eclipse.skalli.services.persistence.EntityManagerServiceBase;
import org.osgi.service.component.ComponentConstants;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class JPAFeedPersistenceComponent extends EntityManagerServiceBase implements FeedPersistenceService {

    private static final Logger LOG = LoggerFactory.getLogger(JPAFeedPersistenceComponent.class);

    @Override
    protected void activate(ComponentContext context) {
        super.activate(context);
        LOG.info(MessageFormat.format("[FeedPersistenceService][jpa] {0} : activated",
                (String) context.getProperties().get(ComponentConstants.COMPONENT_NAME)));
    }

    @Override
    protected void deactivate(ComponentContext context) {
        LOG.info(MessageFormat.format("[FeedPersistenceService][jpa] {0} : deactivated",
                (String) context.getProperties().get(ComponentConstants.COMPONENT_NAME)));
        super.deactivate(context);
    }

    @Override
    public void merge(Collection<FeedEntry> entries) throws IOException {
        for (FeedEntry entry : entries) {
            EntityManager em = getEntityManager();
            EntityTransaction tx = null;
            try {
                tx = em.getTransaction();
                tx.begin();
                em.merge(entry);
                tx.commit();
            } catch (Exception e) {
                if (tx != null && tx.isActive()) {
                    tx.rollback();
                }
                throw new IOException(MessageFormat.format("Failed to persist {0} ({1})",
                        EntryJPA.class.getSimpleName(), entry.getProjectId().toString()), e);
            } finally {
                em.close();
            }
        }
    }



    @Override
    public EntryJPA createEntry() {
        return new EntryJPA();
    }

}
