/** * OpenSpotLight - Open Source IT Governance Platform * * Copyright (c) 2009, CARAVELATECH CONSULTORIA E TECNOLOGIA EM INFORMATICA LTDA * or third-party contributors as indicated by the @author tags or express * copyright attribution statements applied by the authors. All third-party * contributions are distributed under license by CARAVELATECH CONSULTORIA E * TECNOLOGIA EM INFORMATICA LTDA. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA * *********************************************************************** * OpenSpotLight - Plataforma de Governança de TI de Código Aberto * * Direitos Autorais Reservados (c) 2009, CARAVELATECH CONSULTORIA E TECNOLOGIA * EM INFORMATICA LTDA ou como contribuidores terceiros indicados pela etiqueta * @author ou por expressa atribuição de direito autoral declarada e atribuída pelo autor. * Todas as contribuições de terceiros estão distribuídas sob licença da * CARAVELATECH CONSULTORIA E TECNOLOGIA EM INFORMATICA LTDA. * * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo sob os * termos da Licença Pública Geral Menor do GNU conforme publicada pela Free Software * Foundation. * * Este programa é distribuído na expectativa de que seja útil, porém, SEM NENHUMA * GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE OU ADEQUAÇÃO A UMA * FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral Menor do GNU para mais detalhes. * * Você deve ter recebido uma cópia da Licença Pública Geral Menor do GNU junto com este * programa; se não, escreva para: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.openspotlight.federation.loader; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.openspotlight.common.exception.ConfigurationException; import org.openspotlight.common.util.Exceptions; import org.openspotlight.domain.GlobalSettings; import org.openspotlight.domain.Repository; import org.openspotlight.federation.util.GroupDifferences; import org.openspotlight.federation.util.GroupSupport; import org.openspotlight.persist.support.SimplePersistCapable; import org.openspotlight.persist.support.SimplePersistFactory; import org.openspotlight.storage.PartitionFactory.RegularPartitions; import org.openspotlight.storage.StorageSession; import org.openspotlight.storage.domain.StorageNode; import com.google.inject.Inject; /** * A factory for creating JcrSessionConfigurationManager objects. */ public class PersistentConfigurationManagerFactoryImpl implements ConfigurationManagerFactory { private static class ImmutablePersistentConfigurationManager implements org.openspotlight.federation.loader.ImmutableConfigurationManager { /** * The Constant globalSettingsRootNode. */ protected final StorageNode globalSettingsRootNode; /** * The Constant repositoriesRootNode. */ protected final StorageNode repositoriesRootNode; /** * The session. */ protected final SimplePersistCapable<StorageNode, StorageSession> simplePersist; /** * Instantiates a new mutable jcr session configuration manager. */ public ImmutablePersistentConfigurationManager( final SimplePersistCapable<StorageNode, StorageSession> simplePersist) { this.simplePersist = simplePersist; globalSettingsRootNode = simplePersist.getPartitionMethods() .createNewSimpleNode("configuration", "global-settings"); repositoriesRootNode = simplePersist.getPartitionMethods() .createNewSimpleNode("configuration", "repositories"); } protected void applyGroupDeltas(final Repository configuration) { GroupDifferences existentDeltas = GroupSupport.getDifferences( simplePersist, configuration.getName()); if (existentDeltas == null) { existentDeltas = new GroupDifferences(); existentDeltas.setRepositoryName(configuration.getName()); } final Iterable<Repository> existentRepository = simplePersist .findByProperties(repositoriesRootNode, Repository.class, new String[] {"name"}, new Object[] {configuration.getName()}); final Iterator<Repository> it = existentRepository.iterator(); Repository old = null; if (it.hasNext()) { old = it.next(); } GroupSupport.findDifferencesOnAllRepositories(existentDeltas, old, configuration); GroupSupport.saveDifferences(simplePersist, existentDeltas); } /* * (non-Javadoc) * @see org.openspotlight.federation.loader.MutableConfigurationManager#closeResources () */ @Override public void closeResources() { simplePersist.closeResources(); } @Override public Iterable<Repository> getAllRepositories() throws ConfigurationException { final Iterable<Repository> repositories = simplePersist .findByProperties(repositoriesRootNode, Repository.class, new String[] {}, new Object[] {}); return repositories; } @Override public Set<String> getAllRepositoryNames() throws ConfigurationException { final Iterable<Repository> repositories = simplePersist .findByProperties(repositoriesRootNode, Repository.class, new String[] {}, new Object[] {}); final Set<String> repositoryNames = new HashSet<String>(); for (final Repository repo: repositories) { repositoryNames.add(repo.getName()); } return repositoryNames; } /* * (non-Javadoc) * @seeorg.openspotlight.federation.loader.MutableConfigurationManager# getGlobalSettings() */ @Override public GlobalSettings getGlobalSettings() { try { final GlobalSettings settings = simplePersist .findUnique(GlobalSettings.class); return settings; } catch (final Exception e) { throw Exceptions.logAndReturnNew(e, ConfigurationException.class); } } /* * (non-Javadoc) * @seeorg.openspotlight.federation.loader.MutableConfigurationManager# getRepositoryByName(java.lang.String) */ @Override public Repository getRepositoryByName(final String name) throws ConfigurationException { try { final Repository repository = simplePersist .findUniqueByProperties(repositoriesRootNode, Repository.class, new String[] {"name"}, new Object[] {name}); return repository; } catch (final Exception e) { throw Exceptions.logAndReturnNew(e, ConfigurationException.class); } } } /** * The Class MutableConfigurationManager. */ private static class MutablePersistentConfigurationManager extends ImmutablePersistentConfigurationManager implements org.openspotlight.federation.loader.MutableConfigurationManager { public MutablePersistentConfigurationManager( final SimplePersistCapable<StorageNode, StorageSession> simplePersist) { super(simplePersist); } /* * (non-Javadoc) * @seeorg.openspotlight.federation.loader.MutableConfigurationManager# saveGlobalSettings * (org.openspotlight.federation.domain.GlobalSettings) */ @Override public void saveGlobalSettings(final GlobalSettings globalSettings) throws ConfigurationException { try { simplePersist.convertBeanToNode(globalSettingsRootNode, globalSettings); simplePersist.getCurrentSession().flushTransient(); } catch (final Exception e) { throw Exceptions.logAndReturnNew(e, ConfigurationException.class); } } /* * (non-Javadoc) * @see org.openspotlight.federation.loader.MutableConfigurationManager#saveRepository * (org.openspotlight.federation.domain.Repository) */ @Override public void saveRepository(final Repository configuration) throws ConfigurationException { try { applyGroupDeltas(configuration); simplePersist.convertBeanToNode(repositoriesRootNode, configuration); simplePersist.getCurrentSession().flushTransient(); } catch (final Exception e) { throw Exceptions.logAndReturnNew(e, ConfigurationException.class); } } } private final SimplePersistFactory factory; @Inject public PersistentConfigurationManagerFactoryImpl(final SimplePersistFactory factory) { this.factory = factory; } public static org.openspotlight.federation.loader.MutableConfigurationManager createMutableUsingSession( final SimplePersistCapable<StorageNode, StorageSession> simplePersist) { return new MutablePersistentConfigurationManager(simplePersist); } @Override public ImmutableConfigurationManager createImmutable() { return createMutableUsingSession(factory.createSimplePersist(RegularPartitions.FEDERATION)); } @Override public org.openspotlight.federation.loader.MutableConfigurationManager createMutable() { return createMutableUsingSession(factory.createSimplePersist(RegularPartitions.FEDERATION)); } }