/** * 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); } }