/** * Returns a {@link JavaClassId} for the given {@link Class}. * @param _c * @return */ public static JavaClassId getClassId(@NotNull Class _c) { return JavaId.parseClassQName(_c.getName()); }
public static JavaClassInit parseClassInitQName(String _s) { if(_s == null || _s.equals("")) throw new IllegalArgumentException("String null or empty"); final int i = _s.indexOf(JavaClassInit.NAME); if(i==-1) throw new IllegalArgumentException("String does not contain brackets " + JavaClassInit.NAME + ", as required for qualified names for Java class initializers"); JavaClassInit clinit = null; try { final JavaClassId cid = JavaId.parseClassQName(_s.substring(0, i-1)); clinit = cid.getClassInit(); } catch(StringIndexOutOfBoundsException e) { JavaId.log.error("Exception while parsing the string '" + _s + "'"); } return clinit; }
/** * In case the archive is rewritten, this method is used to rewrite certain {@link JarEntry}s * (rather than taking the file from the original archive). * The callback registration takes place in {@link #createInstrumentedJar()}. */ @Override public InputStream getInputStream(String _regex, JarEntry _entry) { InputStream is = null; if(_regex.equals(".*.class$")) { JavaId jid = null; // Create JavaId from entry name try { String class_name = _entry.getName(); class_name = class_name.substring(0, class_name.length()-6); // ".class" class_name = class_name.replace('/', '.'); jid = JavaId.parseClassQName(class_name); } catch (Exception e) { JarAnalyzer.log.error("Cannot parse Java Id from Jar Entry [" + _entry.getName() + "]: " + e.getMessage()); jid = null; } // Create input stream if(jid!=null && this.instrumentedClasses.get(jid)!=null) { //new_entry.setSize(this.instrumentedClasses.get(jid).getBytecode().length); is = new ByteArrayInputStream(this.instrumentedClasses.get(jid).getBytecode()); } } return is; }
/** * Creates a {@link JavaMethodId} from the given string, with a definition context of the given type. * Accepted types are {@link JavaId.Type#CLASS} and {@link JavaId.Type#ENUM}. * @param _s * @return */ public static JavaMethodId parseMethodQName(JavaId.Type _ctx_type, String _s) { if(_s == null || _s.equals("")) throw new IllegalArgumentException("String null or empty"); if(_ctx_type==null || (!_ctx_type.equals(JavaId.Type.CLASS) && !_ctx_type.equals(JavaId.Type.ENUM))) throw new IllegalArgumentException("Accepts context types CLASS or ENUM, got [" + _ctx_type + "]"); final int i = _s.indexOf('('); if(i==-1 || !_s.endsWith(")")) throw new IllegalArgumentException("String does not contain brackets (), as required for qualified names for Java methods"); final int j = _s.lastIndexOf('.', i); if(j==-1) throw new IllegalArgumentException("String does not contain dot (.), as required for qualified names for Java methods (as to separate class and method name)"); JavaId def_ctx = null; JavaMethodId mid = null; try { if(_ctx_type.equals(JavaId.Type.CLASS)) def_ctx = JavaId.parseClassQName(_s.substring(0, j)); else if(_ctx_type.equals(JavaId.Type.ENUM)) def_ctx = JavaId.parseEnumQName(_s.substring(0, j)); mid = new JavaMethodId(def_ctx, _s.substring(j+1, i), JavaId.parseParameterTypes(_s.substring(i+1, _s.length()-1))); } catch(StringIndexOutOfBoundsException e) { JavaId.log.error("Exception while parsing the string '" + _s + "'"); } return mid; }
try { if(_ctx_type.equals(JavaId.Type.CLASS)) def_ctx = JavaId.parseClassQName(_s.substring(0, i)); else if(_ctx_type.equals(JavaId.Type.ENUM)) def_ctx = JavaId.parseEnumQName(_s.substring(0, i));
return JavaId.parseClassQName(_qname);
class_name = class_name.substring(16); // "WEB-INF/classes/" class_name = class_name.replace('/', '.'); jid = JavaId.parseClassQName(class_name); } catch (Exception e) { WarAnalyzer.log.error("Cannot parse Java Id from Jar Entry [" + _entry.getName() + "]: " + e.getMessage());
public ConstructId deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { // To be returned ConstructId cid = null; final JsonObject c = (JsonObject)json; final String t = c.getAsJsonPrimitive("type").getAsString(); final String qn = c.getAsJsonPrimitive("qname").getAsString(); if(JavaId.typeToString(JavaId.Type.PACKAGE).equals(t)) cid = new JavaPackageId(qn); else if(JavaId.typeToString(JavaId.Type.CLASS).equals(t)) cid = JavaId.parseClassQName(qn); else if(JavaId.typeToString(JavaId.Type.CLASSINIT).equals(t)) cid = JavaId.parseClassInitQName(qn); else if(JavaId.typeToString(JavaId.Type.METHOD).equals(t)) cid = JavaId.parseMethodQName(qn); else if(JavaId.typeToString(JavaId.Type.CONSTRUCTOR).equals(t)) cid = JavaId.parseConstructorQName(qn); //TODO: Add annotations return cid; } }
if (_method.isClinit()) { qname = _method.getSignature().substring(0, _method.getSignature().indexOf("<") - 1); cid = JavaId.toSharedType(JavaId.parseClassQName(qname).getClassInit()); } else { int p_size = _method.getNumberOfParameters();
public ClassVisitor(CtClass _c) { // Build the JavaId if(_c.isInterface()) throw new IllegalArgumentException("[" + _c.getName() + "]: Interfaces are not supported"); else if(_c.isEnum()) this.javaId = JavaId.parseEnumQName(_c.getName()); else this.javaId = JavaId.parseClassQName(_c.getName()); this.qname = this.javaId.getQualifiedName(); this.c = _c; // Remember major/minor final ClassFile cf = _c.getClassFile(); this.major = cf.getMajorVersion(); this.minor = cf.getMinorVersion(); // For nested classes, get the declaring (outer) class: It is used to skip the first argument in non-static inner classes try { this.declaringClass = _c.getDeclaringClass(); } catch (NotFoundException e) { // Only a problem in case of non-static inner classes, because in that case the 1st argument of the constructor cannot be removed, cf. method visitConstructors(boolean) if(!Modifier.isStatic(this.c.getModifiers())) ClassVisitor.getLog().warn("No declaring class found for non-static inner class [" + this.javaId.getQualifiedName() + "]");//: " + e.getMessage()); } writeCodeToTmp = VulasConfiguration.getGlobal().getConfiguration().getBoolean(CoreConfiguration.INSTR_WRITE_CODE, false); }
/** * Transforms an object with a given shared type (defined in vulas-share) into * an object having the corresponding core type (defined in vulas-core). * @param _cid * @return */ public static com.sap.psr.vulas.ConstructId toCoreType(com.sap.psr.vulas.shared.json.model.ConstructId _cid) { switch(_cid.getType()) { case METH: return JavaId.parseMethodQName(_cid.getQname()); case CONS: return JavaId.parseConstructorQName(_cid.getQname()); case PACK: return new JavaPackageId(_cid.getQname()); case INIT: return JavaId.parseClassInitQName(_cid.getQname()); case ENUM: return JavaId.parseEnumQName(_cid.getQname()); case CLAS: return JavaId.parseClassQName(_cid.getQname()); default: throw new IllegalArgumentException("Unknown type [" + _cid.getType() + "]"); } }