/**
* Licensed to Apereo under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright ownership. Apereo
* 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 the
* following location:
*
* <p>http://www.apache.org/licenses/LICENSE-2.0
*
* <p>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.apereo.portal.io.xml.ssd;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.apereo.portal.io.xml.AbstractJaxbDataHandler;
import org.apereo.portal.io.xml.IDataImporter;
import org.apereo.portal.io.xml.IPortalData;
import org.apereo.portal.io.xml.IPortalDataType;
import org.apereo.portal.io.xml.PortalDataKey;
import org.apereo.portal.layout.dao.IStylesheetDescriptorDao;
import org.apereo.portal.layout.dao.jpa.LayoutAttributeDescriptorImpl;
import org.apereo.portal.layout.dao.jpa.OutputPropertyDescriptorImpl;
import org.apereo.portal.layout.dao.jpa.StylesheetParameterDescriptorImpl;
import org.apereo.portal.layout.om.ILayoutAttributeDescriptor;
import org.apereo.portal.layout.om.IOutputPropertyDescriptor;
import org.apereo.portal.layout.om.IStylesheetData;
import org.apereo.portal.layout.om.IStylesheetData.Scope;
import org.apereo.portal.layout.om.IStylesheetDescriptor;
import org.apereo.portal.layout.om.IStylesheetParameterDescriptor;
import org.apereo.portal.utils.SafeFilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
/**
*/
public class StylesheetDescriptorImporterExporter
extends AbstractJaxbDataHandler<ExternalStylesheetDescriptor> {
private StylesheetDescriptorPortalDataType stylesheetDescriptorPortalDataType;
private IStylesheetDescriptorDao stylesheetDescriptorDao;
@Autowired
public void setStylesheetDescriptorPortalDataType(
StylesheetDescriptorPortalDataType stylesheetDescriptorPortalDataType) {
this.stylesheetDescriptorPortalDataType = stylesheetDescriptorPortalDataType;
}
@Autowired
public void setStylesheetDescriptorDao(IStylesheetDescriptorDao stylesheetDescriptorDao) {
this.stylesheetDescriptorDao = stylesheetDescriptorDao;
}
/* (non-Javadoc)
* @see org.apereo.portal.io.xml.IDataImporterExporter#getImportDataKey()
*/
@Override
public Set<PortalDataKey> getImportDataKeys() {
return Collections.singleton(StylesheetDescriptorPortalDataType.IMPORT_40_DATA_KEY);
}
/* (non-Javadoc)
* @see org.apereo.portal.io.xml.IDataImporterExporter#getPortalDataType()
*/
@Override
public IPortalDataType getPortalDataType() {
return this.stylesheetDescriptorPortalDataType;
}
/* (non-Javadoc)
* @see org.apereo.portal.io.xml.IDataImporterExporter#getPortalData()
*/
@Override
public Iterable<? extends IPortalData> getPortalData() {
return this.stylesheetDescriptorDao.getStylesheetDescriptors();
}
/* (non-Javadoc)
* @see org.apereo.portal.io.xml.IDataImporterExporter#importData(java.lang.Object)
*/
@Transactional
@Override
public void importData(ExternalStylesheetDescriptor data) {
final String stylesheetName = data.getName();
final String uri = data.getUri();
IStylesheetDescriptor stylesheetDescriptor =
this.stylesheetDescriptorDao.getStylesheetDescriptorByName(stylesheetName);
if (stylesheetDescriptor == null) {
stylesheetDescriptor =
this.stylesheetDescriptorDao.createStylesheetDescriptor(stylesheetName, uri);
} else {
stylesheetDescriptor.setStylesheetResource(uri);
}
stylesheetDescriptor.setUrlNodeSyntaxHelperName(data.getUrlSyntaxHelper());
stylesheetDescriptor.setDescription(data.getDescription());
final List<ExternalOutputPropertyDescriptor> extOutputProperties =
data.getOutputProperties();
final List<IOutputPropertyDescriptor> outputPropertyDescriptors =
new ArrayList<IOutputPropertyDescriptor>(extOutputProperties.size());
for (final ExternalOutputPropertyDescriptor extOutputProperty : extOutputProperties) {
final String name = extOutputProperty.getName();
final Scope scope = Scope.valueOf(extOutputProperty.getScope().name());
final OutputPropertyDescriptorImpl outputPropertyDescriptor =
new OutputPropertyDescriptorImpl(name, scope);
outputPropertyDescriptor.setDefaultValue(extOutputProperty.getDefaultValue());
outputPropertyDescriptor.setDescription(extOutputProperty.getDescription());
outputPropertyDescriptors.add(outputPropertyDescriptor);
}
stylesheetDescriptor.setOutputPropertyDescriptors(outputPropertyDescriptors);
final List<ExternalStylesheetParameterDescriptor> extStylesheetParameters =
data.getStylesheetParameters();
final List<IStylesheetParameterDescriptor> stylesheetParameterDescriptors =
new ArrayList<IStylesheetParameterDescriptor>(extOutputProperties.size());
for (final ExternalStylesheetParameterDescriptor extStylesheetParameter :
extStylesheetParameters) {
final String name = extStylesheetParameter.getName();
final Scope scope = Scope.valueOf(extStylesheetParameter.getScope().name());
final StylesheetParameterDescriptorImpl stylesheetParameterDescriptor =
new StylesheetParameterDescriptorImpl(name, scope);
stylesheetParameterDescriptor.setDefaultValue(extStylesheetParameter.getDefaultValue());
stylesheetParameterDescriptor.setDescription(extStylesheetParameter.getDescription());
stylesheetParameterDescriptors.add(stylesheetParameterDescriptor);
}
stylesheetDescriptor.setStylesheetParameterDescriptors(stylesheetParameterDescriptors);
final List<ExternalLayoutAttributeDescriptor> extLayoutAttributes =
data.getLayoutAttributes();
final List<ILayoutAttributeDescriptor> layoutAttributeDescriptors =
new ArrayList<ILayoutAttributeDescriptor>(extOutputProperties.size());
for (final ExternalLayoutAttributeDescriptor extLayoutAttribute : extLayoutAttributes) {
final String name = extLayoutAttribute.getName();
final Scope scope = Scope.valueOf(extLayoutAttribute.getScope().name());
final LayoutAttributeDescriptorImpl layoutAttributeDescriptor =
new LayoutAttributeDescriptorImpl(name, scope);
layoutAttributeDescriptor.setDefaultValue(extLayoutAttribute.getDefaultValue());
layoutAttributeDescriptor.setDescription(extLayoutAttribute.getDescription());
layoutAttributeDescriptor.setTargetElementNames(
new LinkedHashSet<String>(extLayoutAttribute.getTargetElements()));
layoutAttributeDescriptors.add(layoutAttributeDescriptor);
}
stylesheetDescriptor.setLayoutAttributeDescriptors(layoutAttributeDescriptors);
this.stylesheetDescriptorDao.updateStylesheetDescriptor(stylesheetDescriptor);
}
/* (non-Javadoc)
* @see org.apereo.portal.io.xml.IDataImporterExporter#exportData(java.lang.String)
*/
@Override
public ExternalStylesheetDescriptor exportData(String name) {
final IStylesheetDescriptor stylesheetDescriptor =
this.stylesheetDescriptorDao.getStylesheetDescriptorByName(name);
if (stylesheetDescriptor == null) {
return null;
}
return convert(stylesheetDescriptor);
}
@Override
public String getFileName(ExternalStylesheetDescriptor data) {
return SafeFilenameUtils.makeSafeFilename(data.getName());
}
/**
* Treats the {@link String} id argument as the stylesheet name.
*
* <p>(non-Javadoc)
*
* @see IDataImporter#deleteData(java.lang.String)
*/
@Override
public ExternalStylesheetDescriptor deleteData(String name) {
final IStylesheetDescriptor stylesheetDescriptor =
this.stylesheetDescriptorDao.getStylesheetDescriptorByName(name);
if (stylesheetDescriptor == null) {
return null;
}
ExternalStylesheetDescriptor result = convert(stylesheetDescriptor);
this.stylesheetDescriptorDao.deleteStylesheetDescriptor(stylesheetDescriptor);
return result;
}
protected void copyProperties(IStylesheetData source, ExternalStylesheetData dest) {
dest.setName(source.getName());
dest.setDefaultValue(source.getDefaultValue());
dest.setDescription(source.getDescription());
dest.setScope(ExternalStylesheetDataScope.valueOf(source.getScope().name()));
}
/**
* Convert the {@link IStylesheetDescriptor} to an {@link ExternalStylesheetDescriptor}.
*
* @param stylesheetDescriptor
* @return converted object, never null
*/
protected ExternalStylesheetDescriptor convert(IStylesheetDescriptor stylesheetDescriptor) {
final ExternalStylesheetDescriptor externalStylesheetDescriptor =
new ExternalStylesheetDescriptor();
externalStylesheetDescriptor.setName(stylesheetDescriptor.getName());
externalStylesheetDescriptor.setUrlSyntaxHelper(
stylesheetDescriptor.getUrlNodeSyntaxHelperName());
externalStylesheetDescriptor.setDescription(stylesheetDescriptor.getDescription());
externalStylesheetDescriptor.setUri(stylesheetDescriptor.getStylesheetResource());
final Collection<IOutputPropertyDescriptor> outputPropertyDescriptors =
stylesheetDescriptor.getOutputPropertyDescriptors();
final List<ExternalOutputPropertyDescriptor> extOutputPropertyDescriptors =
externalStylesheetDescriptor.getOutputProperties();
for (final IOutputPropertyDescriptor outputPropertyDescriptor : outputPropertyDescriptors) {
final ExternalOutputPropertyDescriptor extOutputPropertyDescriptor =
new ExternalOutputPropertyDescriptor();
copyProperties(outputPropertyDescriptor, extOutputPropertyDescriptor);
extOutputPropertyDescriptors.add(extOutputPropertyDescriptor);
}
Collections.sort(
extOutputPropertyDescriptors, ExternalStylesheetDataNameComparator.INSTANCE);
final Collection<IStylesheetParameterDescriptor> stylesheetParameterDescriptors =
stylesheetDescriptor.getStylesheetParameterDescriptors();
final List<ExternalStylesheetParameterDescriptor> extStylesheetParameterDescriptors =
externalStylesheetDescriptor.getStylesheetParameters();
for (final IStylesheetParameterDescriptor stylesheetParameterDescriptor :
stylesheetParameterDescriptors) {
final ExternalStylesheetParameterDescriptor extStylesheetParameterDescriptor =
new ExternalStylesheetParameterDescriptor();
copyProperties(stylesheetParameterDescriptor, extStylesheetParameterDescriptor);
extStylesheetParameterDescriptors.add(extStylesheetParameterDescriptor);
}
Collections.sort(
extStylesheetParameterDescriptors, ExternalStylesheetDataNameComparator.INSTANCE);
final Collection<ILayoutAttributeDescriptor> layoutAttributeDescriptors =
stylesheetDescriptor.getLayoutAttributeDescriptors();
final List<ExternalLayoutAttributeDescriptor> extLayoutAttributeDescriptors =
externalStylesheetDescriptor.getLayoutAttributes();
for (final ILayoutAttributeDescriptor layoutAttributeDescriptor :
layoutAttributeDescriptors) {
final ExternalLayoutAttributeDescriptor extLayoutAttributeDescriptor =
new ExternalLayoutAttributeDescriptor();
copyProperties(layoutAttributeDescriptor, extLayoutAttributeDescriptor);
extLayoutAttributeDescriptor
.getTargetElements()
.addAll(layoutAttributeDescriptor.getTargetElementNames());
extLayoutAttributeDescriptors.add(extLayoutAttributeDescriptor);
}
Collections.sort(
extLayoutAttributeDescriptors, ExternalStylesheetDataNameComparator.INSTANCE);
return externalStylesheetDescriptor;
}
}