/* * Geotoolkit - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2012, Geomatys * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library 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. */ package org.geotoolkit.coverage.memory; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.concurrent.CancellationException; import java.util.logging.Level; import org.apache.sis.parameter.ParameterBuilder; import org.apache.sis.storage.DataStoreException; import org.geotoolkit.storage.coverage.AbstractCoverageStore; import org.geotoolkit.storage.coverage.AbstractCoverageStoreFactory; import org.geotoolkit.storage.coverage.CoverageReference; import org.geotoolkit.storage.coverage.CoverageStoreContentEvent; import org.geotoolkit.storage.coverage.CoverageStoreFactory; import org.geotoolkit.storage.coverage.CoverageType; import org.geotoolkit.storage.coverage.DefaultCoverageReference; import org.geotoolkit.coverage.GridSampleDimension; import org.geotoolkit.coverage.grid.GeneralGridGeometry; import org.geotoolkit.coverage.grid.GridCoverage2D; import org.geotoolkit.coverage.io.CoverageStoreException; import org.geotoolkit.coverage.io.GridCoverageReadParam; import org.geotoolkit.coverage.io.GridCoverageReader; import org.geotoolkit.coverage.io.GridCoverageWriteParam; import org.geotoolkit.coverage.io.GridCoverageWriter; import org.geotoolkit.factory.FactoryFinder; import org.geotoolkit.util.NamesExt; import org.geotoolkit.storage.DataNode; import org.geotoolkit.storage.DefaultDataNode; import org.opengis.coverage.grid.GridCoverage; import org.opengis.parameter.ParameterDescriptorGroup; import org.opengis.util.GenericName; import org.opengis.util.NameFactory; import org.opengis.util.NameSpace; /** * Simple implementation to provide a {@link MemoryCoverageStore} for a {@link GridCoverage2D}. * * @author Johan Sorel (Geomatys) * @author Cédric Briançon (Geomatys) */ public class MemoryCoverageStore extends AbstractCoverageStore { /** * Dummy parameter descriptor group. */ private static final ParameterDescriptorGroup desc = new ParameterBuilder().addName("Unamed").createGroup(AbstractCoverageStoreFactory.NAMESPACE); private final DataNode rootNode = new DefaultDataNode(); public MemoryCoverageStore() { super(desc.createValue()); } public MemoryCoverageStore(final GridCoverage2D gridCov) { this(gridCov, String.valueOf(gridCov.getName())); } public MemoryCoverageStore(final GridCoverage2D gridCov, final String name) { this(); try { final CoverageReference ref = create(NamesExt.create(getDefaultNamespace(), name)); final GridCoverageWriter writer = ref.acquireWriter(); writer.write(gridCov, null); ref.recycle(writer); } catch (CoverageStoreException ex) { getLogger().log(Level.WARNING, ex.getMessage(), ex); } catch (CancellationException ex) { getLogger().log(Level.WARNING, ex.getMessage(), ex); } catch (DataStoreException ex) { getLogger().log(Level.WARNING, ex.getMessage(), ex); } } /** * Do nothing in this implementation. */ @Override public CoverageStoreFactory getFactory() { return null; } @Override public DataNode getRootNode() { return rootNode; } @Override public CoverageReference create(final GenericName name) throws DataStoreException { final Set<GenericName> names = getNames(); if(names.contains(name)){ throw new DataStoreException("Layer "+name+" already exist"); } rootNode.getChildren().add(new MemoryCoverageReference(name)); fireCoverageAdded(name); return getCoverageReference(name); } /** * Do nothing in this implementation. */ @Override public void close() { } private class MemoryCoverageReference extends DefaultCoverageReference{ private GridCoverage2D coverage; public MemoryCoverageReference(GenericName name) { super(MemoryCoverageStore.this,null,name); } public void setCoverage(GridCoverage2D coverage) { this.coverage = coverage; final CoverageStoreContentEvent event = fireDataUpdated(); ((MemoryCoverageStore)getStore()).forwardContentEvent(event); } @Override public GridCoverageWriter acquireWriter() throws CoverageStoreException { return new MemoryCoverageWriter(this); } @Override public GridCoverageReader acquireReader() throws CoverageStoreException { return new MemoryCoverageReader(this); } } private static class MemoryCoverageReader extends GridCoverageReader { private final MemoryCoverageReference ref; public MemoryCoverageReader(MemoryCoverageReference ref){ this.ref = ref; } @Override public GeneralGridGeometry getGridGeometry(final int i) throws CoverageStoreException, CancellationException { return (GeneralGridGeometry) ref.coverage.getGridGeometry(); } @Override public List<GridSampleDimension> getSampleDimensions(final int i) throws CoverageStoreException, CancellationException { return Arrays.asList(ref.coverage.getSampleDimensions()); } @Override public GridCoverage read(final int i, final GridCoverageReadParam gcrp) throws CoverageStoreException, CancellationException { return ref.coverage; } @Override public List<? extends GenericName> getCoverageNames() throws CoverageStoreException, CancellationException { final NameFactory dnf = FactoryFinder.getNameFactory(null); final String nameSpace = "http://geotoolkit.org" ; final NameSpace ns = dnf.createNameSpace(dnf.createGenericName(null, nameSpace), null); final String covName = ref.getName().tip().toString(); final GenericName gn = dnf.createLocalName(ns, covName); return Collections.singletonList(gn); } } private static class MemoryCoverageWriter extends GridCoverageWriter{ private final MemoryCoverageReference ref; public MemoryCoverageWriter(MemoryCoverageReference ref){ this.ref = ref; } @Override public void write(GridCoverage coverage, GridCoverageWriteParam param) throws CoverageStoreException, CancellationException { ref.setCoverage((GridCoverage2D)coverage); } } @Override public CoverageType getType() { return CoverageType.GRID; } }