diff options
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/include/Slice/JavaUtil.h | 6 | ||||
-rw-r--r-- | cpp/src/Slice/JavaUtil.cpp | 77 | ||||
-rw-r--r-- | cpp/src/slice2java/Gen.cpp | 71 |
3 files changed, 122 insertions, 32 deletions
diff --git a/cpp/include/Slice/JavaUtil.h b/cpp/include/Slice/JavaUtil.h index 336b16e026a..75c576908cb 100644 --- a/cpp/include/Slice/JavaUtil.h +++ b/cpp/include/Slice/JavaUtil.h @@ -23,6 +23,12 @@ SLICE_API long computeSerialVersionUUID(const ClassDefPtr&); // +// Compute Java serialVersionUID for a Slice class +// +SLICE_API long +computeSerialVersionUUID(const ExceptionPtr&); + +// // Compute Java serialVersionUID for a Slice struct // SLICE_API long diff --git a/cpp/src/Slice/JavaUtil.cpp b/cpp/src/Slice/JavaUtil.cpp index 0c75dadedd0..6b6559b4f2f 100644 --- a/cpp/src/Slice/JavaUtil.cpp +++ b/cpp/src/Slice/JavaUtil.cpp @@ -32,6 +32,21 @@ using namespace Slice; using namespace IceUtil; using namespace IceUtilInternal; + +namespace +{ + +void +hashAdd(long& hashCode, const std::string& value) +{ + for(std::string::const_iterator p = value.begin(); p != value.end(); ++p) + { + hashCode = ((hashCode << 5) + hashCode) ^ *p; + } +} + +} + long Slice::computeSerialVersionUUID(const ClassDefPtr& p) { @@ -66,23 +81,9 @@ Slice::computeSerialVersionUUID(const ClassDefPtr& p) 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); + long hashCode = 5381; + hashAdd(hashCode, data); + return hashCode; } long @@ -105,26 +106,38 @@ Slice::computeSerialVersionUUID(const StructPtr& p) 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) + long hashCode = 5381; + hashAdd(hashCode, data); + return hashCode; +} + +long +Slice::computeSerialVersionUUID(const ExceptionPtr& p) +{ + ostringstream os; + + os << "Name: " << p->scoped(); + os << " Members: ["; + DataMemberList members = p->dataMembers(); + for(DataMemberList::const_iterator i = members.begin(); i != members.end();) { - h1 |= (long)bytes[i + 8] << (i * 4); + os << (*i)->name() << ":" << (*i)->type(); + i++; + if(i != members.end()) + { + os << ", "; + } } + os << "]"; - return abs(h0 ^ h1); + const string data = os.str(); + long hashCode = 5381; + hashAdd(hashCode, data); + return hashCode; } + + Slice::JavaOutput::JavaOutput() { } diff --git a/cpp/src/slice2java/Gen.cpp b/cpp/src/slice2java/Gen.cpp index 5d8c60fad01..b85daa68764 100644 --- a/cpp/src/slice2java/Gen.cpp +++ b/cpp/src/slice2java/Gen.cpp @@ -2460,6 +2460,41 @@ Slice::Gen::TieVisitor::visitClassDefStart(const ClassDefPtr& p) } out << sp << nl << "private " << '_' << name << opIntfName << " _ice_delegate;"; + out << sp << 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 << "ignoring invalid serialVersionUID for class `" << p->scoped() << "'; generating default value"; + emitWarning("", "", os.str()); + out << computeSerialVersionUUID(p); + } + else + { + Int64 v = 0; + serialVersionUID = serialVersionUID.substr(pos); + if(serialVersionUID != "0") + { + if(!stringToInt64(serialVersionUID, v)) // conversion error + { + ostringstream os; + os << "ignoring invalid serialVersionUID for class `" << p->scoped() + << "'; generating default value"; + emitWarning("", "", os.str()); + out << computeSerialVersionUUID(p); + } + } + out << v; + } + } + else + { + out << computeSerialVersionUUID(p); + } + out << "L;"; out << eb; close(); @@ -3383,6 +3418,42 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p) } } + out << sp << 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 << "ignoring invalid serialVersionUID for exception `" << p->scoped() << "'; generating default value"; + emitWarning("", "", os.str()); + out << computeSerialVersionUUID(p); + } + else + { + Int64 v = 0; + serialVersionUID = serialVersionUID.substr(pos); + if(serialVersionUID != "0") + { + if(!stringToInt64(serialVersionUID, v)) // conversion error + { + ostringstream os; + os << "ignoring invalid serialVersionUID for exception `" << p->scoped() + << "'; generating default value"; + emitWarning("", "", os.str()); + out << computeSerialVersionUUID(p); + } + } + out << v; + } + } + else + { + out << computeSerialVersionUUID(p); + } + out << "L;"; + out << eb; close(); } |