content: /**
   * Licensed to the Apache Software Foundation (ASF) under one or more
   * contributor license agreements.  See the NOTICE file distributed with
   * this work for additional information regarding copyright ownership.
   * The ASF licenses this file to You 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.apache.activemq.openwire.tool;
  
  import org.codehaus.jam.JAnnotation;
  import org.codehaus.jam.JAnnotationValue;
  import org.codehaus.jam.JClass;
  import org.codehaus.jam.JField;
  import org.codehaus.jam.JMethod;
  import org.codehaus.jam.JProperty;
  import org.codehaus.jam.JamClassIterator;
  import org.codehaus.jam.JamService;
  
  /**
   * 
   */
  public abstract class OpenWireGenerator {
  
      protected int openwireVersion;
      protected String filePostFix = ".java";
      protected JamService jam;
  
      public boolean isValidProperty(JProperty it) {
          JMethod getter = it.getGetter();
          return getter != null && it.getSetter() != null && !getter.isStatic() && getter.getAnnotation("openwire:property") != null;
      }
  
      public boolean isCachedProperty(JProperty it) {
          JMethod getter = it.getGetter();
          if (!isValidProperty(it)) {
              return false;
          }
          JAnnotationValue value = getter.getAnnotation("openwire:property").getValue("cache");
          return value != null && value.asBoolean();
      }
  
      public boolean isAbstract(JClass j) {
          JField[] fields = j.getFields();
          for (int i = 0; i < fields.length; i++) {
              JField field = fields[i];
              if (field.isStatic() && field.isPublic() && field.isFinal() && field.getSimpleName().equals("DATA_STRUCTURE_TYPE")) {
                  return false;
              }
          }
          return true;
      }
  
      public boolean isThrowable(JClass j) {
          if (j.getQualifiedName().equals(Throwable.class.getName())) {
              return true;
          }
          return j.getSuperclass() != null && isThrowable(j.getSuperclass());
      }
  
      public boolean isMarshallAware(JClass j) {
          if (filePostFix.endsWith("java")) {
              JClass[] interfaces = j.getInterfaces();
              for (int i = 0; i < interfaces.length; i++) {
                  if (interfaces[i].getQualifiedName().equals("org.apache.activemq.command.MarshallAware")) {
                      return true;
                  }
              }
              return false;
          } else {
              String simpleName = j.getSimpleName();
              return simpleName.equals("ActiveMQMessage") || simpleName.equals("WireFormatInfo");
          }
          /*
           * else { // is it a message type String simpleName = j.getSimpleName();
           * JClass superclass = j.getSuperclass(); return
           * simpleName.equals("ActiveMQMessage") || (superclass != null &&
           * superclass.getSimpleName().equals("ActiveMQMessage")); }
           */
      }
  
      public JamService getJam() {
          return jam;
      }
  
      public JamClassIterator getClasses() {
          return getJam().getClasses();
      }
  
      public int getOpenwireVersion() {
          return openwireVersion;
      }
  
      public void setOpenwireVersion(int openwireVersion) {
          this.openwireVersion = openwireVersion;
      }
  
      /**
       * Converts the Java type to a C# type name
       */
      public String toCSharpType(JClass type) {
          String name = type.getSimpleName();
          if (name.equals("String")) {
              return "string";
          } else if (name.equals("Throwable") || name.equals("Exception")) {
              return "BrokerError";
          } else if (name.equals("ByteSequence")) {
              return "byte[]";
          } else if (name.equals("boolean")) {
              return "bool";
          } else {
              return name;
          }
      }
  
      public String getOpenWireOpCode(JClass element) {
          if (element != null) {
              JAnnotation annotation = element.getAnnotation("openwire:marshaller");
              return stringValue(annotation, "code", "0");
          }
          return "0";
      }
  
      protected String stringValue(JAnnotation annotation, String name) {
          return stringValue(annotation, name, null);
      }
  
      protected String stringValue(JAnnotation annotation, String name, String defaultValue) {
          if (annotation != null) {
              JAnnotationValue value = annotation.getValue(name);
              if (value != null) {
                  return value.asString();
              }
          }
          return defaultValue;
      }
  
      public void setJam(JamService jam) {
          this.jam = jam;
      }
  
      public String decapitalize(String text) {
          if (text == null) {
              return null;
          }
          return text.substring(0, 1).toLowerCase() + text.substring(1);
      }
  
      public String capitalize(String text) {
          if (text == null) {
              return null;
          }
          return text.substring(0, 1).toUpperCase() + text.substring(1);
      }
  }
  