/******************************************************************************* * Copyright (c) 2015 IBH SYSTEMS GmbH. * 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: * IBH SYSTEMS GmbH - initial API and implementation *******************************************************************************/ package org.eclipse.packagedrone.repo.channel.impl; import java.io.Reader; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; import org.eclipse.packagedrone.repo.channel.deploy.DeployGroup; import org.eclipse.packagedrone.storage.apm.AbstractSimpleStorageModelProvider; import org.eclipse.packagedrone.storage.apm.StorageContext; import org.eclipse.packagedrone.storage.apm.util.ReplaceOnCloseWriter; import com.google.gson.Gson; import com.google.gson.GsonBuilder; public class ChannelServiceModelProvider extends AbstractSimpleStorageModelProvider<ChannelServiceAccess, ChannelServiceModify> { public ChannelServiceModelProvider () { super ( ChannelServiceAccess.class, ChannelServiceModify.class ); } @Override protected ChannelServiceAccess makeViewModelTyped ( final ChannelServiceModify writeModel ) { return writeModel; } @Override protected ChannelServiceModify cloneWriteModel ( final ChannelServiceModify writeModel ) { return new ChannelServiceModify ( writeModel ); } private Path makePath ( final StorageContext context ) { return context.getBasePath ().resolve ( "channels.json" ); } protected Gson createGson () { final GsonBuilder builder = new GsonBuilder (); builder.setPrettyPrinting (); builder.serializeNulls (); builder.setDateFormat ( "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" ); builder.registerTypeAdapter ( DeployGroup.class, new DeployGroupTypeAdapter () ); return builder.create (); } @Override protected void persistWriteModel ( final StorageContext context, final ChannelServiceModify writeModel ) throws Exception { try ( final ReplaceOnCloseWriter writer = new ReplaceOnCloseWriter ( makePath ( context ), StandardCharsets.UTF_8 ) ) { createGson ().toJson ( writeModel.getModel (), writer ); writer.commit (); } } @Override protected ChannelServiceModify loadWriteModel ( final StorageContext context ) throws Exception { try ( Reader reader = Files.newBufferedReader ( makePath ( context ), StandardCharsets.UTF_8 ) ) { final ChannelServiceModel model = createGson ().fromJson ( reader, ChannelServiceModel.class ); return new ChannelServiceModify ( model != null ? model : new ChannelServiceModel () ); } catch ( final NoSuchFileException e ) { return new ChannelServiceModify ( new ChannelServiceModel () ); } } }