/**
* 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.isis.core.metamodel.services.layout;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Collection;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.xml.bind.Marshaller;
import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
import com.google.common.collect.ImmutableMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.isis.applib.FatalException;
import org.apache.isis.applib.annotation.DomainService;
import org.apache.isis.applib.annotation.NatureOfService;
import org.apache.isis.applib.annotation.Programmatic;
import org.apache.isis.applib.layout.component.Grid;
import org.apache.isis.applib.services.grid.GridService;
import org.apache.isis.applib.services.jaxb.JaxbService;
import org.apache.isis.applib.services.layout.LayoutService;
import org.apache.isis.core.metamodel.facets.object.grid.GridFacet;
import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
import org.apache.isis.objectstore.jdo.metamodel.facets.object.persistencecapable.JdoPersistenceCapableFacet;
@DomainService(
nature = NatureOfService.DOMAIN,
menuOrder = "" + Integer.MAX_VALUE
)
public class LayoutServiceDefault implements LayoutService {
private static final Logger LOG = LoggerFactory.getLogger(LayoutServiceDefault.class);
@Override
public String toXml(final Class<?> domainClass, final Style style) {
final Grid grid = toGrid(domainClass, style);
return jaxbService.toXml(grid,
ImmutableMap.<String,Object>of(
Marshaller.JAXB_SCHEMA_LOCATION,
grid.getTnsAndSchemaLocation()
));
}
protected Grid toGrid(final Class<?> domainClass, final Style style) {
if (style == Style.CURRENT) {
final ObjectSpecification objectSpec = specificationLoader.loadSpecification(domainClass);
final GridFacet facet = objectSpec.getFacet(GridFacet.class);
return facet != null? facet.getGrid(): null;
}
// don't use the grid from the facet, because it will be modified subsequently.
Grid grid = gridService.load(domainClass);
if(grid == null) {
grid = gridService.defaultGridFor(domainClass);
}
gridService.normalize(grid);
if (style == Style.NORMALIZED) {
return grid;
}
if (style == Style.COMPLETE) {
return gridService.complete(grid);
}
if (style == Style.MINIMAL) {
return gridService.minimal(grid);
}
throw new IllegalArgumentException("unsupported style");
}
@Programmatic
public byte[] toZip(final Style style) {
final Collection<ObjectSpecification> allSpecs = specificationLoader.allSpecifications();
final Collection<ObjectSpecification> domainObjectSpecs = Collections2
.filter(allSpecs, new Predicate<ObjectSpecification>(){
@Override
public boolean apply(final ObjectSpecification input) {
return !input.isAbstract() &&
(input.containsDoOpFacet(JdoPersistenceCapableFacet.class) ||
input.containsDoOpFacet(ViewModelFacet.class));
}});
final byte[] bytes;
try {
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final ZipOutputStream zos = new ZipOutputStream(baos);
final OutputStreamWriter writer = new OutputStreamWriter(zos);
for (final ObjectSpecification objectSpec : domainObjectSpecs) {
final Class<?> domainClass = objectSpec.getCorrespondingClass();
final Grid grid = toGrid(domainClass, style);
if(grid != null) {
zos.putNextEntry(new ZipEntry(zipEntryNameFor(objectSpec)));
final String xml = jaxbService.toXml(grid,
ImmutableMap.<String,Object>of(
Marshaller.JAXB_SCHEMA_LOCATION,
grid.getTnsAndSchemaLocation()
));
writer.write(xml);
writer.flush();
zos.closeEntry();
}
}
writer.close();
bytes = baos.toByteArray();
} catch (final IOException ex) {
throw new FatalException("Unable to create zip of layouts", ex);
}
return bytes;
}
private static String zipEntryNameFor(final ObjectSpecification objectSpec) {
final String fqn = objectSpec.getFullIdentifier();
return fqn.replace(".", File.separator)+".layout.xml";
}
@javax.inject.Inject
SpecificationLoader specificationLoader;
@javax.inject.Inject
JaxbService jaxbService;
@javax.inject.Inject
GridService gridService;
}