1 31 32 package org.opencms.workplace.comparison; 33 34 import org.opencms.file.CmsFile; 35 import org.opencms.file.CmsObject; 36 import org.opencms.file.types.CmsResourceTypeXmlPage; 37 import org.opencms.main.CmsException; 38 import org.opencms.xml.I_CmsXmlDocument; 39 import org.opencms.xml.content.CmsXmlContent; 40 import org.opencms.xml.content.CmsXmlContentFactory; 41 import org.opencms.xml.content.I_CmsXmlContentValueVisitor; 42 import org.opencms.xml.page.CmsXmlPageFactory; 43 import org.opencms.xml.types.I_CmsXmlContentValue; 44 45 import java.util.ArrayList ; 46 import java.util.Iterator ; 47 import java.util.List ; 48 import java.util.Locale ; 49 50 55 public class CmsXmlDocumentComparison extends CmsResourceComparison { 56 57 60 class CmsXmlContentElementPathExtractor implements I_CmsXmlContentValueVisitor { 61 62 63 private List m_elementPaths; 64 65 68 CmsXmlContentElementPathExtractor() { 69 70 m_elementPaths = new ArrayList (); 71 } 72 73 77 public void visit(I_CmsXmlContentValue value) { 78 79 if (value.isSimpleType()) { 81 m_elementPaths.add(new CmsXmlContentElementComparison( 82 value.getLocale().toString(), 83 value.getPath(), 84 value.getTypeName())); 85 } 86 } 87 88 93 List getElementPaths() { 94 95 return m_elementPaths; 96 } 97 } 98 99 100 private List m_elements; 101 102 111 public CmsXmlDocumentComparison(CmsObject cms, CmsFile res1, CmsFile res2) 112 throws CmsException { 113 114 I_CmsXmlDocument resource1; 115 I_CmsXmlDocument resource2; 116 117 List elements1 = null; 118 List elements2 = null; 119 120 if (res1.getTypeId() == CmsResourceTypeXmlPage.getStaticTypeId() 121 && res2.getTypeId() == CmsResourceTypeXmlPage.getStaticTypeId()) { 122 resource1 = CmsXmlPageFactory.unmarshal(cms, res1); 123 resource2 = CmsXmlPageFactory.unmarshal(cms, res2); 124 elements1 = getElements(resource1); 125 elements2 = getElements(resource2); 126 } else { 127 resource1 = CmsXmlContentFactory.unmarshal(cms, res1); 128 CmsXmlContentElementPathExtractor visitor = new CmsXmlContentElementPathExtractor(); 129 ((CmsXmlContent)resource1).visitAllValuesWith(visitor); 130 elements1 = visitor.getElementPaths(); 131 resource2 = CmsXmlContentFactory.unmarshal(cms, res2); 132 visitor = new CmsXmlContentElementPathExtractor(); 133 ((CmsXmlContent)resource2).visitAllValuesWith(visitor); 134 elements2 = visitor.getElementPaths(); 135 } 136 137 List removed = new ArrayList (elements1); 138 removed.removeAll(elements2); 139 Iterator i = removed.iterator(); 140 while (i.hasNext()) { 141 CmsElementComparison elem = (CmsElementComparison)i.next(); 142 elem.setStatus(CmsResourceComparison.TYPE_REMOVED); 143 String value = resource1.getValue(elem.getName(), new Locale (elem.getLocale())).getStringValue(cms); 144 elem.setVersion1(value); 145 elem.setVersion2(""); 146 } 147 List added = new ArrayList (elements2); 148 added.removeAll(elements1); 149 i = added.iterator(); 150 while (i.hasNext()) { 151 CmsElementComparison elem = (CmsElementComparison)i.next(); 152 elem.setStatus(CmsResourceComparison.TYPE_ADDED); 153 elem.setVersion1(""); 154 String value = resource2.getValue(elem.getName(), new Locale (elem.getLocale())).getStringValue(cms); 155 elem.setVersion2(value); 156 } 157 List union = new ArrayList (elements1); 158 union.retainAll(elements2); 159 160 i = new ArrayList (union).iterator(); 162 while (i.hasNext()) { 163 CmsElementComparison elem = (CmsElementComparison)i.next(); 164 String value1 = resource1.getValue(elem.getName(), new Locale (elem.getLocale())).getStringValue(cms); 165 String value2 = resource2.getValue(elem.getName(), new Locale (elem.getLocale())).getStringValue(cms); 166 if (value1 == null) { 167 value1 = ""; 168 } 169 if (value2 == null) { 170 value2 = ""; 171 } 172 elem.setVersion1(value1); 173 elem.setVersion2(value2); 174 if (!value1.equals(value2)) { 175 elem.setStatus(CmsResourceComparison.TYPE_CHANGED); 176 } else { 177 elem.setStatus(CmsResourceComparison.TYPE_UNCHANGED); 178 } 179 } 180 m_elements = new ArrayList (removed); 181 m_elements.addAll(added); 182 m_elements.addAll(union); 183 } 184 185 190 public List getElements() { 191 192 return m_elements; 193 } 194 195 200 private List getElements(I_CmsXmlDocument xmlPage) { 201 202 List elements = new ArrayList (); 203 Iterator locales = xmlPage.getLocales().iterator(); 204 while (locales.hasNext()) { 205 Locale locale = (Locale )locales.next(); 206 Iterator elementNames = xmlPage.getNames(locale).iterator(); 207 while (elementNames.hasNext()) { 208 String elementName = (String )elementNames.next(); 209 elements.add(new CmsElementComparison(locale.toString(), elementName)); 210 } 211 } 212 return elements; 213 } 214 } 215 | Popular Tags |