end
end
+ def get_xml_doc
+ doc = XML::Document.new
+ doc.encoding = 'UTF-8'
+ root = XML::Node.new 'osm'
+ root['version'] = API_VERSION
+ root['generator'] = 'OpenStreetMap server'
+ doc.root = root
+ return doc
+ end
+
private
def get_auth_data
user, pass = '', ''
end
- def history
- response.headers["Content-Type"] = 'application/xml'
- node = Node.find(params[:id])
-
- unless node
- render :nothing => true, :staus => 404
- return
- end
-
- doc = XML::Document.new
- doc.encoding = 'UTF-8'
- root = XML::Node.new 'osm'
- root['version'] = '0.4'
- root['generator'] = 'OpenStreetMap server'
- doc.root = root
-
- node.old_nodes.each do |old_node|
- el1 = XML::Node.new 'node'
- el1['id'] = old_node.id.to_s
- el1['lat'] = old_node.latitude.to_s
- el1['lon'] = old_node.longitude.to_s
- Node.split_tags(el1, old_node.tags)
- el1['visible'] = old_node.visible.to_s
- el1['timestamp'] = old_node.timestamp.xmlschema
- root << el1
- end
-
- render :text => doc.to_s
- end
end
class OldNodeController < ApplicationController
+
+ def history
+ response.headers["Content-Type"] = 'application/xml'
+ node = Node.find(params[:id])
+
+ unless node
+ render :nothing => true, :staus => 404
+ return
+ end
+
+ doc = get_xml_doc
+
+ node.old_nodes.each do |old_node|
+ doc.root << old_node.to_xml_node
+ end
+
+ render :text => doc.to_s
+ end
+
+
end
class OldSegmentController < ApplicationController
+
+ def history
+ response.headers["Content-Type"] = 'application/xml'
+ segment = Segment.find(params[:id])
+
+ unless segment
+ render :nothing => true, :staus => 404
+ return
+ end
+
+ doc = get_xml_doc
+
+ segment.old_segments.each do |old_segment|
+ doc.root << old_segment.to_xml_node
+ end
+
+ render :text => doc.to_s
+ end
+
+
+
+
+
end
class OldWayController < ApplicationController
+ def history
+ response.headers["Content-Type"] = 'application/xml'
+ way = Way.find(params[:id])
+
+ unless way
+ render :nothing => true, :staus => 404
+ return
+ end
+
+ doc = get_xml_doc
+
+ way.old_ways.each do |old_way|
+ doc.root << old_way.to_xml_node
+ end
+
+ render :text => doc.to_s
+ end
end
end
- def history
- response.headers["Content-Type"] = 'application/xml'
- segment = Segment.find(params[:id])
-
- unless segment
- render :nothing => true, :staus => 404
- return
- end
-
- doc = XML::Document.new
- doc.encoding = 'UTF-8'
- root = XML::Node.new 'osm'
- root['version'] = '0.4'
- root['generator'] = 'OpenStreetMap server'
- doc.root = root
-
- segment.old_segments.each do |old_segment|
- el1 = XML::Node.new 'segment'
- el1['id'] = old_segment.id.to_s
- el1['from'] = old_segment.node_a.to_s
- el1['to'] = old_segment.node_b.to_s
- Segment.split_tags(el1, old_segment.tags)
- el1['visible'] = old_segment.visible.to_s
- el1['timestamp'] = old_segment.timestamp.xmlschema
- root << el1
- end
-
- render :text => doc.to_s
- end
-
-
end
render :nothing => true
return
when :put
- way = Way.from_xml(request.raw_post, true)
+ way = Way.from_xml(request.raw_post)
if way
way_in_db = Way.find(way.id)
end
end
end
+
end
return old_node
end
+ def to_xml_node
+ el1 = XML::Node.new 'node'
+ el1['id'] = self.id.to_s
+ el1['lat'] = self.latitude.to_s
+ el1['lon'] = self.longitude.to_s
+ Node.split_tags(el1, self.tags)
+ el1['visible'] = self.visible.to_s
+ el1['timestamp'] = self.timestamp.xmlschema
+ return el1
+ end
+
end
return old_segment
end
+ def to_xml_node
+ el1 = XML::Node.new 'segment'
+ el1['id'] = self.id.to_s
+ el1['from'] = self.node_a.to_s
+ el1['to'] = self.node_b.to_s
+ Segment.split_tags(el1, self.tags)
+ el1['visible'] = self.visible.to_s
+ el1['timestamp'] = self.timestamp.xmlschema
+ return el1
+ end
end
end
def save_with_dependencies
+
+ # dont touch this unless you really have figured out why it's called
+ # (Rails doesn't deal well with the old ways table (called 'ways') because
+ # it doesn't have a unique key. It knows how to insert and auto_increment
+ # id and get it back but we have that and we want to get the 'version' back
+ # we could add another column but thats a lot of data. No, set_primary_key
+ # doesn't work either.
save()
- self.reload()
+ clear_aggregation_cache
+ clear_association_cache
+ @attributes.update(OldWay.find(:first, :conditions => ['id = ? AND timestamp = ?', self.id, self.timestamp]).instance_variable_get('@attributes'))
+
+ # ok, you can touch from here on
self.tags.each do |k,v|
tag = OldWayTag.new
@tags = t
end
+# has_many :way_segments, :class_name => 'OldWaySegment', :foreign_key => 'id'
+# has_many :way_tags, :class_name => 'OldWayTag', :foreign_key => 'id'
+
+ def old_segments
+ OldWaySegment.find(:all, :conditions => ['id = ? AND version = ?', self.id, self.version])
+ end
+
+ def old_tags
+ OldWayTag.find(:all, :conditions => ['id = ? AND version = ?', self.id, self.version])
+ end
+
+ def to_xml_node
+ el1 = XML::Node.new 'way'
+ el1['id'] = self.id.to_s
+ el1['visible'] = self.visible.to_s
+ el1['timestamp'] = self.timestamp.xmlschema
+
+ self.old_segments.each do |seg| # FIXME need to make sure they come back in the right order
+ e = XML::Node.new 'seg'
+ e['id'] = seg.segment_id.to_s
+ el1 << e
+ end
+
+ self.old_tags.each do |tag|
+ e = XML::Node.new 'tag'
+ e['k'] = tag.k
+ e['v'] = tag.v
+ el1 << e
+ end
+ return el1
+ end
end
segment.id = pt['id'].to_i
end
- segment.visible = pt['visible'] and pt['visible'] == 'true'
+ segment.visible = true
if create
segment.timestamp = Time.now
key = parts[0].strip unless parts[0].nil?
val = parts[1].strip unless parts[1].nil?
if key != '' && val != ''
- el2 = Segment.new('tag')
+ el2 = XML::Node.new('tag')
el2['k'] = key.to_s
el2['v'] = val.to_s
el << el2
has_many :way_segments, :foreign_key => 'id'
has_many :way_tags, :foreign_key => 'id'
+ has_many :old_ways, :foreign_key => :id
+
set_table_name 'current_ways'
def self.from_xml(xml, create=false)
way = Way.new
doc.find('//osm/way').each do |pt|
- unless create and pt['id'] == '0'
+ if !create and pt['id'] != '0'
way.id = pt['id'].to_i
end
# API
API_VERSION = '0.4' # change this in envronment.rb too
map.connect "api/#{API_VERSION}/node/create", :controller => 'node', :action => 'create'
- map.connect "api/#{API_VERSION}/node/:id/history", :controller => 'node', :action => 'history', :id => nil
+ map.connect "api/#{API_VERSION}/node/:id/history", :controller => 'old_node', :action => 'history', :id => nil
map.connect "api/#{API_VERSION}/node/:id", :controller => 'node', :action => 'rest', :id => nil
map.connect "api/#{API_VERSION}/segment/create", :controller => 'segment', :action => 'create'
- map.connect "api/#{API_VERSION}/segment/:id/history", :controller => 'segment', :action => 'history'
+ map.connect "api/#{API_VERSION}/segment/:id/history", :controller => 'old_segment', :action => 'history'
map.connect "api/#{API_VERSION}/segment/:id", :controller => 'segment', :action => 'rest'
map.connect "api/#{API_VERSION}/way/create", :controller => 'way', :action => 'create'
- map.connect "api/#{API_VERSION}/way/:id/history", :controller => 'way', :action => 'history'
- map.connect "api/#{API_VERSION}/way/:id", :controller => 'way', :action => 'rest'
+ map.connect "api/#{API_VERSION}/way/:id/history", :controller => 'old_way', :action => 'history', :id => nil
+ map.connect "api/#{API_VERSION}/way/:id", :controller => 'way', :action => 'rest', :id => nil
map.connect "api/#{API_VERSION}/map", :controller => 'api', :action => 'map'