/**
* Copyright (C) 2015 Orange
* Licensed 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 com.francetelecom.clara.cloud.deployment.common.service;
import com.francetelecom.clara.cloud.commons.UUIDUtils;
import com.francetelecom.clara.cloud.commons.xstream.XStreamUtils;
import com.francetelecom.clara.cloud.deployment.technical.service.ModelItemCloner;
import com.thoughtworks.xstream.XStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.regex.Pattern;
/**
* Technical Deployment duplication factory. Takes a complete TD, and create a
* transient detached copy - adjsting name with a prefix (all ModelItemName) to
* avoid unique constraint conflict - resetting id and version
*
* Impl is based on xstream marshalling + regex pattern + xstream unmarshalling
*
*
* @author APOG7416
*
*/
public class ModelItemClonerXstreamImpl<T> implements ModelItemCloner<T> {
private static Logger logger = LoggerFactory.getLogger(ModelItemClonerXstreamImpl.class.getName());
private static Logger loggerDump = LoggerFactory.getLogger("com.francetelecom.clara.cloud.dump");
// generated by init methods
private final XStream xStream = XStreamUtils.instanciateXstreamForHibernate();
@Override
public T deepCopy(T original) {
String xmlDump = dumpToXml(original);
return preprocessAndImportDump(xmlDump);
}
public String dumpToXml(T original) {
logger.debug("duplicating model " + original);
return xStream.toXML(original);
}
public T preprocessAndImportDump(String xmlDump) {
if (loggerDump.isDebugEnabled()) {
loggerDump.debug("original : \n " + xmlDump);
}
String namePattern = "\\<name\\>.*\\<\\/name\\>";
String idPattern = "\\<id\\>[0-9]*\\<\\/id\\>";
String versionPattern = "\\<version\\>[0-9]*\\<\\/version\\>";
String[] splitString = xmlDump.split(namePattern);
StringBuffer transformedXml = new StringBuffer();
int index = 0;
for (String part : splitString) {
transformedXml.append(part);
if (index != splitString.length - 1) {
transformedXml.append("<name>");
transformedXml.append(UUIDUtils.generateUUID());
transformedXml.append("</name>");
}
index++;
}
if (loggerDump.isDebugEnabled()) {
loggerDump.debug(xmlDump);
loggerDump.debug(transformedXml.toString());
}
// String transformedXml=
// Pattern.compile(namePattern).matcher(xmlDump).replaceAll("\\<name\\>"
// + UUID.randomUUID() + "\\<\\/name\\>");
assert !transformedXml.equals(xmlDump) : "expected at least one name to be replaced";
String transformedXml2 = Pattern.compile(idPattern).matcher(transformedXml).replaceAll("<id>0</id>");
String transformedXml3 = Pattern.compile(versionPattern).matcher(transformedXml2).replaceAll("<version>0</version>");
if (loggerDump.isDebugEnabled()) {
loggerDump.debug("transformed : \n " + transformedXml3);
}
// back to TechnicalDeployment
return (T) xStream.fromXML(transformedXml3);
}
}