Package org.dozer.eclipse.plugin.sourcepage.util

Source Code of org.dozer.eclipse.plugin.sourcepage.util.DozerPluginUtils

/**
* Copyright 2005-2013 Dozer Project
*
* 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 org.dozer.eclipse.plugin.sourcepage.util;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.Signature;
import org.eclipse.swt.graphics.Image;
import org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest;
import org.springframework.ide.eclipse.beans.core.BeansCorePlugin;
import org.springframework.ide.eclipse.beans.core.internal.model.Bean;
import org.springframework.ide.eclipse.beans.core.internal.model.BeanReference;
import org.springframework.ide.eclipse.beans.core.internal.model.BeansList;
import org.springframework.ide.eclipse.beans.core.internal.model.BeansMap;
import org.springframework.ide.eclipse.beans.core.internal.model.BeansMapEntry;
import org.springframework.ide.eclipse.beans.core.internal.model.BeansModelUtils;
import org.springframework.ide.eclipse.beans.core.internal.model.BeansTypedString;
import org.springframework.ide.eclipse.beans.core.model.IBean;
import org.springframework.ide.eclipse.beans.core.model.IBeanProperty;
import org.springframework.ide.eclipse.beans.core.model.IBeansConfig;
import org.springframework.ide.eclipse.beans.core.model.IBeansProject;
import org.springframework.ide.eclipse.beans.ui.BeansUIImages;
import org.springframework.ide.eclipse.beans.ui.editor.contentassist.BeansJavaCompletionProposal;
import org.springframework.ide.eclipse.beans.ui.editor.util.BeansEditorUtils;
import org.springframework.ide.eclipse.core.StringUtils;
import org.springframework.ide.eclipse.core.java.Introspector;
import org.springframework.ide.eclipse.core.java.JdtUtils;
import org.springframework.ide.eclipse.core.model.IModelElement;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class DozerPluginUtils {

  public static char[] DOZER_CONTENT_ASSIST_CHARS = new char[]{'.'};
 
  public static String getMappingClassName(Node aOrBNode) {
    if (!"a".equals(aOrBNode.getNodeName()) && !"b".equals(aOrBNode.getNodeName()))
      return null;
   
    String aOrBNodeName = aOrBNode.getNodeName();   
    Node mappingNode = getMappingNode(aOrBNode);
   
    NodeList childNodes = mappingNode.getChildNodes();
    int len = childNodes.getLength();
   
    //get the class-a/class-b nodes, so we know what class to go into
    for (int i = 0; i < len; i++) {
      Node childNode = childNodes.item(i);
      if (childNode.getNodeType() == Node.ELEMENT_NODE && childNode.getNodeName().equals("class-"+aOrBNodeName)) {
        Text textNode = (Text)childNode.getFirstChild();
        return textNode.getNodeValue();       
      }
    }
   
    return null;
  }
 
  public static Node getMappingNode(Node someNode) {
    Node parentNode = someNode;
    while(!"mapping".equals((parentNode = parentNode.getParentNode()).getNodeName())) {
      //do nothing
    }
    if ("mapping".equals(parentNode.getNodeName()))
      return parentNode;
    else
      return null;
  }
 
  public static IBean getDozerBeanForMappingFile(IFile mappingIFile) {
    Set<IBean> beans = new HashSet<IBean>();
    IBean returnBean = null;
   
    //The mapping file that we are in
    File mappingFile = new File(mappingIFile.getName());
    String mappingFileName = mappingFile.getName();
   
    //First get direct references
    IBeansProject beansProject = BeansCorePlugin.getModel().getProject(mappingIFile.getProject());
   
    if (beansProject == null)
      return null;
   
    Set<IBeansConfig> tempConfigs = beansProject.getConfigs();
   
    if (tempConfigs == null)
      return null;   
   
    //We need some File to later get allBeans from ConfigSets
    IFile someBeansModelFile = null;
   
    //check local beans
    for (IBeansConfig config : tempConfigs) {
      if (someBeansModelFile == null)
        someBeansModelFile = (IFile)config.getElementResource();
     
      beans.addAll(config.getBeans());
    }
    returnBean = getDozerBeanFromBeans(beans, mappingFileName);       
   
    //no local bean for mappingfile found
    if (returnBean == null && someBeansModelFile != null) {
      //check configsets
      Set<IBean> allBeans = BeansEditorUtils.getBeansFromConfigSets(someBeansModelFile);
      returnBean = getDozerBeanFromBeans(allBeans, mappingFileName);
    }
   
    return returnBean;
  }
 
  protected static IBean getDozerBeanFromBeans(Set<IBean> beans, String mappingFileName) {
    //get first bean that uses our mapping file
    for (IBean bean : beans) {
      String className = BeansModelUtils.getBeanClass(bean, null);     
      if ("org.dozer.util.mapping.DozerBeanMapper".equals(className)) {
        //get mappingFiles-property
        IBeanProperty mappingFilesProperty = bean.getProperty("mappingFiles");
        if (mappingFilesProperty == null)
          continue;   
       
        BeansList mappingFilesPropertyValues = (BeansList)mappingFilesProperty.getValue();
        IModelElement[] modelElements = mappingFilesPropertyValues.getElementChildren();
 
        //find reference to our mapping file
        for (IModelElement modelElement : modelElements) {
          String configFilePath = ((BeansTypedString)modelElement).getString();
          File configFile = new File(configFilePath);
         
          //property with mapping file found, so this is our target bean
          if (mappingFileName.equals(configFile.getName())) {
            return bean;
          }
        }
      }
    }
   
    return null;
  }

  public static IModelElement[] getPossibleCCIMappingForMappingFile(IBean bean) {
    if (bean == null)
      return null;
   
    //get customConvertersWithId-property
    IBeanProperty ccwiProperty = bean.getProperty("customConvertersWithId");
   
    //no customConvertersWithId property, return at least the bean
    if (ccwiProperty == null)
      return null;
   
    BeansMap ccwiPropertyValues = (BeansMap)ccwiProperty.getValue();
    return ccwiPropertyValues.getElementChildren();
  }
 
  public static BeansMapEntry getCCIModelElementForMappingFile(IBean bean, String customConverterId) {
    if (bean == null || customConverterId == null || "".equals(customConverterId))
      return null;
   
    IModelElement[] ccwiPropertyMapEntries = getPossibleCCIMappingForMappingFile(bean);
   
    //map entries not found, at least return bean;
    if (ccwiPropertyMapEntries == null)
      return null;
   
    //find the custom-converter-id property
      for (IModelElement beansMapEntry : ccwiPropertyMapEntries) {
        BeansMapEntry entry = (BeansMapEntry)beansMapEntry;
      BeansTypedString key = (BeansTypedString)entry.getKey();
      if (key.getString().equals(customConverterId)) {
        return entry;
      }
    }
     
      return null;
  }
 
  public static String getClassNameForCCI(IFile mappingIFile, String customConverterId) {   
    IBean bean = getDozerBeanForMappingFile(mappingIFile);
   
    if (bean == null)
      return null;
   
    BeansMapEntry beansMapEntry = getCCIModelElementForMappingFile(bean, customConverterId);

    if (beansMapEntry != null) {
      if (beansMapEntry.getValue() instanceof Bean) {
        Bean cciBean = (Bean)beansMapEntry.getValue();
        return cciBean.getBeanDefinition().getBeanClassName();
      } else if (beansMapEntry.getValue() instanceof BeanReference) {
        BeanReference beanRef = (BeanReference)beansMapEntry.getValue();       
        String beanName = beanRef.getBeanName();
       
        Set<IBeansProject> projects = BeansCorePlugin.getModel().getProjects();
        for (IBeansProject beansProject : projects) {
          Set<IBeansConfig> tempConfigs = beansProject.getConfigs();
          for (IBeansConfig config : tempConfigs) {
            IBean foundBean = config.getBean(beanName);
            if (foundBean != null) {
              return foundBean.getClassName();
            }
          }
        }
      }
    }
   
    return null;
 

  public static void addPropertyNameAttributeValueProposals(
      ContentAssistRequest request, String prefix, String oldPrefix,
      IType type) {
   
    // resolve type of indexed and nested property path
    if (prefix.lastIndexOf(".") >= 0) {
      int firstIndex = prefix.indexOf(".");
      String firstPrefix = prefix.substring(0, firstIndex);
      String lastPrefix = prefix.substring(firstIndex);
      if (".".equals(lastPrefix)) {
        lastPrefix = "";
      }
      else if (lastPrefix.startsWith(".")) {
        lastPrefix = lastPrefix.substring(1);
      }
      try {
        Collection<?> methods = Introspector.findReadableProperties(
            type, firstPrefix, true);
        if (methods != null && methods.size() == 1) {

          Iterator<?> iterator = methods.iterator();
          while (iterator.hasNext()) {
            IMethod method = (IMethod) iterator.next();
            IType returnType = JdtUtils
                .getJavaTypeForMethodReturnType(method, type);
            if (returnType != null) {
              String newPrefix = oldPrefix + firstPrefix + ".";

              addPropertyNameAttributeValueProposals(request,
                  lastPrefix, newPrefix, returnType);
            }
            return;
          }
        }
      }
      catch (CoreException e) {
        // do nothing
      }
    }
    else {
      try {
        Collection<?> methods = Introspector.findWritableProperties(
            type, prefix, true);
        if (methods != null && methods.size() > 0) {
          Iterator<?> iterator = methods.iterator();
          while (iterator.hasNext()) {
            createMethodProposal(request,
                (IMethod) iterator.next(), oldPrefix);
          }
        }
      }
      catch (JavaModelException e1) {
        // do nothing
      }
    }
  }

  public static void createMethodProposal(ContentAssistRequest request,
      IMethod method, String prefix) {
    try {
      String[] parameterNames = method.getParameterNames();
      String[] parameterTypes = JdtUtils.getParameterTypesString(method);
      String propertyName = JdtUtils.getPropertyNameFromMethodName(method);

      String replaceText = prefix + propertyName;

      StringBuilder buf = new StringBuilder();
      buf.append(propertyName);
      buf.append(" - ");
      buf.append(method.getParent().getElementName());
      buf.append('.');
      buf.append(method.getElementName());
      buf.append('(');
      buf.append(parameterTypes[0]);
      buf.append(' ');
      buf.append(parameterNames[0]);
      buf.append(')');
      String displayText = buf.toString();

      Image image = BeansUIImages.getImage(BeansUIImages.IMG_OBJS_PROPERTY);

      BeansJavaCompletionProposal proposal = new BeansJavaCompletionProposal(
          replaceText, request.getReplacementBeginPosition(), request
              .getReplacementLength(), replaceText.length(),
              image, displayText, null, 0, method);
      request.addProposal(proposal);
    }
    catch (JavaModelException e) {
      // do nothing
    }
  } 
 
  public static IType hasReadProperty(String property, String className, IProject project, boolean noGetter) throws JavaModelException {
    IType javaType = JdtUtils.getJavaType(project, className);
    String checkProperty = property;
   
    String[] propertySplitted = checkProperty.split("\\.");
    //we only check the first level, if there is some x.y.z property
    if (propertySplitted.length > 1) {
      checkProperty = propertySplitted[0];
    }
    //if we are doing indexed property mapping, we remove the []
    checkProperty = checkProperty.replaceAll("\\[\\]", "");
   
    if (noGetter) {
      IField[] fields = javaType.getFields();
      for (IField field : fields) {
        if (field.getElementName().equals(property)) {
          return field.getDeclaringType();
        }
      }
      return null;
    }
   
    Collection<IMethod> methods = Introspector.findReadableProperties(javaType, checkProperty, true);   
   
    boolean retVal = methods.size() > 0;
    if (!retVal)
      return null;
    else {
      try {
        //className = JdtUtils.resolveClassName(className, javaType);
        if (!Class.forName(className).isPrimitive())
          className = null;         
      } catch (Throwable t) {
        //className = null;
      }
     
      Iterator<?> iterator = methods.iterator();
      while (iterator.hasNext()) {
        IMethod method = (IMethod) iterator.next();
        IType returnType = JdtUtils.getJavaTypeForMethodReturnType(method, javaType);
       
        if (className == null) {
          if (returnType != null)
            className = returnType.getFullyQualifiedName();
        }       
        if (className != null) {
          if (propertySplitted.length > 1) {     
            List<String> l = new ArrayList<String>(Arrays.asList(propertySplitted));
            l.remove(0);     
            property = StringUtils.collectionToDelimitedString(l, ".");
     
            return hasReadProperty(property, returnType.getFullyQualifiedName(), project, false);
          } else {
            return returnType;
          }
        }
      }
    }
   
    return null;
  }
 
  public static IType hasWriteProperty(String property, String className, IProject project) throws JavaModelException {
    IType javaType = JdtUtils.getJavaType(project, className);
    String checkProperty = property;
   
    String[] propertySplitted = checkProperty.split("\\.");
    if (propertySplitted.length > 1) {
      List<String> l = new ArrayList(Arrays.asList(propertySplitted));
      checkProperty = l.get(l.size()-1);
      l.remove(l.size()-1);     
      property = StringUtils.collectionToDelimitedString(l, ".");
     
      javaType = DozerPluginUtils.hasReadProperty(property, className, project, false);
      if (javaType == null)
        return null;     
    }
    //if we are doing indexed property mapping, we remove the []
    checkProperty = checkProperty.replaceAll("\\[\\]", "");
   
    Collection<?> methods = Introspector.findWritableProperties(javaType, checkProperty, true);
   
    boolean retVal = methods.size() > 0;
    if (!retVal)
      return null;
    else
      return javaType;
  }
 
}
TOP

Related Classes of org.dozer.eclipse.plugin.sourcepage.util.DozerPluginUtils

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.