diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Slice/JavaUtil.cpp | 100 | ||||
-rw-r--r-- | cpp/src/slice2java/Gen.cpp | 87 |
2 files changed, 185 insertions, 2 deletions
diff --git a/cpp/src/Slice/JavaUtil.cpp b/cpp/src/Slice/JavaUtil.cpp index e124b33292d..533342a6593 100644 --- a/cpp/src/Slice/JavaUtil.cpp +++ b/cpp/src/Slice/JavaUtil.cpp @@ -11,6 +11,7 @@ #include <Slice/JavaUtil.h> #include <Slice/FileTracker.h> #include <Slice/Util.h> +#include <Slice/MD5.h> #include <IceUtil/Functional.h> #include <IceUtil/DisableWarnings.h> @@ -31,6 +32,100 @@ using namespace Slice; using namespace IceUtil; using namespace IceUtilInternal; +long +Slice::computeSerialVersionUUID(const ClassDefPtr& p) +{ + ostringstream os; + + ClassList bases = p->bases(); + os << "Name: " << p->scoped(); + + os << " Bases: ["; + for(ClassList::const_iterator i = bases.begin(); i != bases.end();) + { + os << (*i)->scoped(); + i++; + if(i != l.end()) + { + os << ", "; + } + } + os << "]"; + + os << " Members: ["; + DataMemberList members = p->dataMembers(); + for(DataMemberList::const_iterator i = members.begin(); i != members.end();) + { + os << (*i)->name() << ":" << (*i)->type(); + i++; + if(i != l.end()) + { + os << ", "; + } + } + os << "]"; + + const string data = os.str(); + MD5 md5(reinterpret_cast<const unsigned char*>(data.c_str()), static_cast<int>(data.size())); + vector<unsigned char> bytes; + bytes.resize(16); + md5.getDigest(reinterpret_cast<unsigned char*>(&bytes[0])); + + long h0 = 0; + long h1 = 0; + for(int i = 0; i < 8; ++i) + { + h0 |= (long)bytes[i] << (i * 4); + } + if(h0) + + for(int i = 0; i < 8; ++i) + { + h1 |= (long)bytes[i + 8] << (i * 4); + } + return abs(h0 ^ h1); +} + +long +Slice::computeSerialVersionUUID(const StructPtr& p) +{ + ostringstream os; + + os << "Name: " << p->scoped(); + os << " Members: ["; + DataMemberList members = p->dataMembers(); + for(DataMemberList::const_iterator i = members.begin(); i != members.end();) + { + os << (*i)->name() << ":" << (*i)->type(); + i++; + if(i != l.end()) + { + os << ", "; + } + } + os << "]"; + + const string data = os.str(); + MD5 md5(reinterpret_cast<const unsigned char*>(data.c_str()), static_cast<int>(data.size())); + vector<unsigned char> bytes; + bytes.resize(16); + md5.getDigest(reinterpret_cast<unsigned char*>(&bytes[0])); + + long h0 = 0; + long h1 = 0; + for(int i = 0; i < 8; ++i) + { + h0 |= (long)bytes[i] << (i * 4); + } + + for(int i = 0; i < 8; ++i) + { + h1 |= (long)bytes[i + 8] << (i * 4); + } + + return abs(h0 ^ h1); +} + Slice::JavaOutput::JavaOutput() { } @@ -2829,6 +2924,11 @@ Slice::JavaGenerator::MetaDataVisitor::getMetaData(const ContainedPtr& cont) result.push_back(s); continue; } + else if(s.substr(prefix.size(), pos - prefix.size()) == "serialVersionUID") + { + result.push_back(s); + continue; + } emitWarning(cont->file(), cont->line(), "ignoring invalid metadata `" + s + "'"); } diff --git a/cpp/src/slice2java/Gen.cpp b/cpp/src/slice2java/Gen.cpp index da876279cd4..70b91db68fb 100644 --- a/cpp/src/slice2java/Gen.cpp +++ b/cpp/src/slice2java/Gen.cpp @@ -2567,6 +2567,41 @@ void Slice::Gen::TypesVisitor::visitClassDefEnd(const ClassDefPtr& p) { Output& out = output(); + out << nl << "public static final long serialVersionUID = "; + string serialVersionUID; + if(p->findMetaData("java:serialVersionUID", serialVersionUID)) + { + string::size_type pos = serialVersionUID.rfind(":") + 1; + if(pos == string::npos) + { + ostringstream os; + os << "Invalid serialVersionUID for class `" << p->scoped() << "' default to slice2java generated value."; + emitWarning("", "", os.str()); + out << computeSerialVersionUUID(p); + } + else + { + long v = 0; + serialVersionUID = serialVersionUID.substr(pos); + if(serialVersionUID != "0") + { + v = atol(serialVersionUID.c_str()); + if(v == 0) // conversion error + { + ostringstream os; + os << "Invalid serialVersionUID for class `" << p->scoped() << "' default to slice2java generated value."; + emitWarning("", "", os.str()); + out << computeSerialVersionUUID(p); + } + } + out << v; + } + } + else + { + out << computeSerialVersionUUID(p); + } + out << "L;"; out << eb; close(); } @@ -3311,6 +3346,43 @@ Slice::Gen::TypesVisitor::visitStructEnd(const StructPtr& p) out << eb; } } + + out << nl; + out << nl << "public static final long serialVersionUID = "; + string serialVersionUID; + if(p->findMetaData("java:serialVersionUID", serialVersionUID)) + { + string::size_type pos = serialVersionUID.rfind(":") + 1; + if(pos == string::npos) + { + ostringstream os; + os << "Invalid serialVersionUID for struct `" << p->scoped() << "' default to slice2java generated value."; + emitWarning("", "", os.str()); + out << computeSerialVersionUUID(p); + } + else + { + long v = 0; + serialVersionUID = serialVersionUID.substr(pos); + if(serialVersionUID != "0") + { + v = atol(serialVersionUID.c_str()); + if(v == 0) // conversion error + { + ostringstream os; + os << "Invalid serialVersionUID for struct `" << p->scoped() << "' default to slice2java generated value."; + emitWarning("", "", os.str()); + out << computeSerialVersionUUID(p); + } + } + out << v; + } + } + else + { + out << computeSerialVersionUUID(p); + } + out << "L;"; out << eb; close(); @@ -4426,8 +4498,14 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p) out << nl << "return null;"; out << eb; } - + + // + // Avoid serialVersionUID warnings for Proxy Helper classes. + // + out << nl; + out << nl << "public static final long serialVersionUID = 0L;"; out << eb; + close(); if(_stream) @@ -5382,7 +5460,12 @@ Slice::Gen::DispatcherVisitor::visitClassDefStart(const ClassDefPtr& p) out << eb; writeDispatchAndMarshalling(out, p, _stream); - + + // + // Avoid serialVersionUID warnings for dispatch classes. + // + out << nl; + out << nl << "public static final long serialVersionUID = 0L;"; out << eb; close(); |