/******************************************************************************* * * * Copyright (c) 2005, 2010 SAP AG. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Stefan Dimov - initial API, implementation and documentation * * * *******************************************************************************/ package org.eclipse.jpt.jpadiagrameditor.ui.internal.util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Iterator; import java.util.List; import org.eclipse.graphiti.mm.pictograms.Diagram; import org.eclipse.graphiti.mm.pictograms.Shape; import org.eclipse.graphiti.services.Graphiti; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jpt.jpa.core.JpaProject; import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType; import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit; import org.eclipse.jpt.jpadiagrameditor.ui.internal.JPADiagramEditorPlugin; public class JPACheckSum { private static JPACheckSum instance = null; private static MessageDigest md5 = null; public static synchronized JPACheckSum INSTANCE() { if (instance == null) { try { md5 = MessageDigest.getInstance("MD5"); //$NON-NLS-1$ } catch (NoSuchAlgorithmException e) { JPADiagramEditorPlugin.logError("Couldn't create instance of MD5", e); //$NON-NLS-1$ return null; } instance = new JPACheckSum(); } return instance; } public String getSavedShapeMD5(Shape sh) { String checkSumString = Graphiti.getPeService().getPropertyValue(sh, JPAEditorConstants.PROP_ENTITY_CHECKSUM); if (checkSumString == null) return ""; //$NON-NLS-1$ return checkSumString; } public void assignEntityShapesMD5Strings(Diagram d, JpaProject jpaProject) { PersistenceUnit pu = JpaArtifactFactory.instance().getPersistenceUnit(jpaProject); List picts = d.getChildren(); if (picts.size() == 0) return; Iterator it = picts.iterator(); while (it.hasNext()) { Shape pict = it.next(); String name = Graphiti.getPeService().getPropertyValue(pict, JPAEditorConstants.PROP_ENTITY_CLASS_NAME); JavaPersistentType jpt = JpaArtifactFactory.instance().getJPT(name, pu); String hash = ""; //$NON-NLS-1$ if (jpt != null) { ICompilationUnit cu = JPAEditorUtil.getCompilationUnit(jpt); hash = generateCompilationUnitMD5String(cu); } Graphiti.getPeService().setPropertyValue(pict, JPAEditorConstants.PROP_ENTITY_CHECKSUM, hash); } } public String generateCompilationUnitMD5String(ICompilationUnit cu) { String src = null; try { src = cu.getSource(); } catch (JavaModelException e) { JPADiagramEditorPlugin.logError("Can't get the source of the compilation unit", e); //$NON-NLS-1$ return null; } byte[] res = md5.digest(src.getBytes()); StringBuilder sb = new StringBuilder(); for (byte b : res) sb.append(Byte.toString(b)); return sb.toString(); } public boolean isEntityModelChanged(Shape sh, JpaProject jpaProject) { if (sh == null) return true; PersistenceUnit pu = JpaArtifactFactory.instance().getPersistenceUnit(jpaProject); String name = Graphiti.getPeService().getPropertyValue(sh, JPAEditorConstants.PROP_ENTITY_CLASS_NAME); JavaPersistentType jpt = JpaArtifactFactory.instance().getJPT(name, pu); String savedMD5 = getSavedShapeMD5(sh); String actualMD5 = ""; //$NON-NLS-1$ if (jpt != null) { ICompilationUnit cu = JPAEditorUtil.getCompilationUnit(jpt); actualMD5 = generateCompilationUnitMD5String(cu); } return !savedMD5.equals(actualMD5); } public boolean isModelDifferentFromDiagram(Diagram d, JpaProject jpaProject) { List picts = d.getChildren(); if (picts.size() == 0) return false; Iterator it = picts.iterator(); while (it.hasNext()) { Shape pict = it.next(); if (isEntityModelChanged(pict, jpaProject)) return true; } return false; } }